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

时间:2014-10-23 04:09:07

标签: php mysql

我想知道准备好的查询是否与未准备好的查询一样安全。下面是两个示例,一个用于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();

更新示例:

$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));

我应该使用漫长的方式吗?还是只需要一行才能做得更差?

3 个答案:

答案 0 :(得分:2)

来自文档

  

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

     

重复执行

     

准备好的陈述可以重复执行。每次执行   绑定变量的当前值被计算并发送到   服务器。该语句不会再次解析。声明模板是   没有再转移到服务器。

预准备语句具有检查语法和重复执行的优点。当使用变量

动态生成sql时,特别优选准备语句

您可以在此帖子MySQLi: query VS prepare

中阅读更多内容

答案 1 :(得分:1)

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

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

这是一个普遍认为准备好的陈述较慢的神话。它们不是 - 事实上,它们可以更快,至少从RDBMS的角度来看。

但是,PHP应用程序中运行的额外代码会产生一些开销,因此PHP运行时会有一些性能损失。但这是一个相当小的开销。我不担心。

只需使用准备好的陈述!

  • 他们更容易正确编码。
  • 如果不是更安全,它们就像报价一样安全。
  • 它们对SQL执行性能没有任何不利。

答案 2 :(得分:0)

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

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