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

更新示例:

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

我应该用很长的路来做,还是只需要一行就可以做得更糟?

来自文档

prepared语句执行由两个阶段组成:prepared和处决在准备阶段,一个语句模板被发送到数据库服务器。服务器执行语法检查并初始化供以后使用的服务器内部资源。

重复执行

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

准备好的语句具有检查语法和重复执行的优点。当您的sql是使用变量动态生成的时,准备好的语句尤其可取

您可以在这个SO post MySQLi:query VS prepare 中阅读更多

不,它们在安全性方面不一样。

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

人们普遍认为,事先准备好的陈述速度较慢。它们不是——事实上,它们可以更快,至少从RDBMS的角度来看是这样。

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

只要使用准备好的语句!

  • 它们更容易正确编码
  • 即使不安全,它们也和引用一样安全
  • 它们对SQL执行性能没有任何不利影响

使用快速版本的唯一语句,这些语句将不会在相同结构下正常使用。

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