繁体   English   中英

PHP-准备好的VS未准备好的查询

[英]PHP - Prepared VS not prepared query

我想知道准备好的查询是否和未准备好的查询一样安全。 以下是两个示例,一个用于SELECT,一个用于UPDATE。 第一行是未准备好的,第二行是准备好的查询。

SELECT示例:

$userDetails = $connection->query("SELECT * FROM Users WHERE Name='$username'")->fetch();

$userDetails = $connection->prepare('SELECT * FROM Users WHERE Name=?');
$userDetails->execute(array($username));
$userDetails = $userDetails->fetch();

UPDATE示例:

$query = $connection->query("UPDATE Users SET SessionID='$sessionID' WHERE Name='$username'")->execute();

$query = $connection->prepare("UPDATE Users SET SessionID=? WHERE Name=?");
$query->execute(array($sessionID, $username));

我应该使用很长的路吗?还是只需要一行的路做得更糟?

从文档中

准备好的语句执行包括两个阶段:准备和执行。 在准备阶段,将语句模板发送到数据库服务器。 服务器执行语法检查并初始化服务器内部资源以供以后使用。

重复执行

准备好的语句可以重复执行。 每次执行时,将评估绑定变量的当前值并将其发送到服务器。 该语句不会再次解析。 语句模板不会再次传输到服务器。

准备好的语句具有检查语法和重复执行的优点。 当使用变量动态生成sql时,特别优选使用预准备语句

您可以在MySQLi的这篇SO文章中阅读更多内容:查询VS准备

不,它们在安全性方面并不相同。

将变量复制到字符串中的版本存在SQL注入漏洞的风险。 这取决于您如何处理变量。 如果在将它们复制到SQL字符串之前使用PDO::quote()处理它们是安全的,但是如果您的开发人员忘记这样做,那是不安全的。

通常的说法是,准备好的语句速度较慢。 它们不是-实际上,它们至少可以从RDBMS的角度来看更快。

但是,在PHP应用程序中运行的额外代码会产生一些开销,因此,PHP运行时会降低性能。 但这只是一笔很小的开销。 我不会担心。

只需使用准备好的语句!

  • 它们更容易正确编码。
  • 它们比报价更安全,甚至更安全。
  • 它们对SQL执行性能没有不利影响。

将快速版本用于唯一的语句,该语句不会在相同的结构中经常使用。

例如,在循环中使用长版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM