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

PHP-准备好的与未准备好的查询,php,mysql,Php,Mysql,我想知道准备好的查询是否和未准备好的查询一样安全。下面是两个示例,一个用于选择,一个用于更新。 第一行是未准备好的查询,第二行是准备好的查询 选择示例: $userDetails = $connection->query("SELECT * FROM Users WHERE Name='$username'")->fetch(); $userDetails = $connection->prepare('SELECT * FROM Users WHERE Name=?');

我想知道准备好的查询是否和未准备好的查询一样安全。下面是两个示例,一个用于选择,一个用于更新。 第一行是未准备好的查询,第二行是准备好的查询

选择示例:

$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));
更新示例:

$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));
我应该用很长的方法来做,还是只需要一行就可以做得更糟?

来自文档

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

重复执行

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

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


您可以在这篇文章中阅读更多内容,因此请使用快速版本的unique语句,该语句不会经常用于相同的结构


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

不,它们在安全性方面不同

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

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

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

只需使用事先准备好的语句

它们更容易正确编码。 如果不是更安全的话,它们也和报价一样安全。 它们在SQL执行性能方面没有缺点。
我还想知道服务器运行的速度是否也会慢一些,但我似乎也得到了答案。谢谢