Php 准备好的声明-是否有必要

Php 准备好的声明-是否有必要,php,mysqli,Php,Mysqli,准备好的语句添加了大量的代码…但我一直听到有人提到要使用它们…从1行代码增加到6行代码有什么价值?这仅仅是为了防止sql注入吗 类似的职位 php.net on prepared statementsprepared statements针对SQL注入提供了极好的保护 除了SQL注入保护之外,当同一查询要多次执行时(例如在INSERT循环中),预处理语句还可以减少数据库服务器上的负载。该语句只由RDBMS编译一次,而不需要像在mysql\u query()调用中那样每次编译一次 不同的API需要

准备好的语句添加了大量的代码…但我一直听到有人提到要使用它们…从1行代码增加到6行代码有什么价值?这仅仅是为了防止sql注入吗

类似的职位


php.net on prepared statements

prepared statements针对SQL注入提供了极好的保护

除了SQL注入保护之外,当同一查询要多次执行时(例如在
INSERT
循环中),预处理语句还可以减少数据库服务器上的负载。该语句只由RDBMS编译一次,而不需要像在
mysql\u query()调用中那样每次编译一次

不同的API需要不同数量的代码来执行准备好的语句。我发现PDO可以比MySQLi稍微简单一些,例如,如果您的情况允许在
execute()
调用中使用隐式参数绑定。这只适用于所有参数都可以作为字符串计算的情况

// PDO implicit binding example:
// Not many lines of code if the situation allows for it
$stmt = $pdo->prepare("SELECT * FROM tbl WHERE col1=? AND col2=? AND col3=?");
$stmt->execute(array($val1, $val2, $val3));

说准备好的语句导致1行代码爆炸成6行是不公平的。实际上,要使用一行,您只需要两行:一行准备语句,一行绑定参数。即使不使用准备好的语句,也需要编写任何其他代码(执行查询、绑定结果、获取结果等)

所以本质上,我们讨论的是一行额外的代码可以为您带来什么。它给你买了两样东西:

  • 针对sql注入的保护(还包括针对非恶意错误查询的保护,例如,如果注入的变量包含单引号,则防止查询中断)
  • 如果最终对不同的注入值执行相同的预处理语句,可能会带来性能方面的好处
  • 点5月2日并不总是适用,但是考虑到点1也会节省您在查询中手动释放要注入的值的必要麻烦。这将是额外的代码(即使您可以在同一行内联完成),如果不使用准备好的语句,您需要自己编写这些代码


    在我看来,我们可以得出结论,通过准备好的语句,您最终可以免费获得安全性和可能的性能。

    您可以将这6行代码封装到一个方法中,并且只有一行代码。这个问题以前已经讨论过,但我很难找到合适的副本来链接:(我链接到上面的一个,声明您不需要使用mysqli_real_escape_string()对于准备好的查询..这是很好的b.c.我的serverice提供程序将magic quotes设置为错误的值…这意味着我需要大量的代码来使用特定的函数…说从常规语句到准备好的语句是以牺牲额外的5行代码为代价的是不公平的如果整个代码更具可读性和安全性,de不一定是一件坏事。此外,您在示例中使用的许多行要么是常规语句所必需的,要么与准备好的语句完全无关。mysql_query的此比较……与mysqli_query()相同…我几周前刚刚更新了此内容…现在我将再次更新。@Chris Yes相同的比较适用于
    mysqli_query()
    。RDBMS必须在每次调用时编译语句,这是正确的,但甚至是错误的:准备好的语句不提供任何“保护”。它只是提供某种保护的参数绑定接口。但预处理语句是错误的工具!预处理语句在许多情况下甚至很糟糕。性能方面以及资源方面。我不理解PDO开发人员没有纠正他们的错误观念。这很令人困惑。我想你得到了安全性和可读性。.但是如果只是一个查询而不是一个循环…我认为它们的性能下降很小…如果你多次调用它,就会得到上述好处…@chrisaker:最初你担心编写的代码太多(我不认为在实践中会发生这种情况)对于后者,除非你拥有Facebook的流量,否则谈论性能与安全是完全错误的看法。