我们应该总是在 MySQL 和 php 中使用准备好的语句还是什么时候使用这些?

Anu*_*Anu 2 php mysqli sql-injection

我读了很多文章,说使用准备好的语句非常安全,并且可以很好地防止 SQL 注入。我在不使用准备好的语句的情况下构建了一些网站。但是在阅读了所有这些文章之后,我正在考虑使用准备好的语句来更改整个代码。

我的问题

是否有必要始终使用准备好的语句?或者是否有任何情况下,正常语句就足以超过准备好的语句?

Bil*_*win 5

如果您有一个完全硬编码的 SQL 查询,并且在 SQL 中不需要 PHP 变量,那么非准备语句就足够了。

下面是一个例子:

$result = $mysqli->query("SELECT * FROM mytable WHERE updated_at > NOW() - INTERVAL 7 DAY");
Run Code Online (Sandbox Code Playgroud)

查询是自包含的。它只是一个固定的字符串,完全由您的应用程序控制。任何不受信任的内容都不会影响查询。

如果您的查询需要一些可变部分,则使用查询参数,如下所示:

$stmt = $mysqli->prepare("SELECT * FROM mytable WHERE updated_at > NOW() - INTERVAL ? DAY");
$stmt->bind_param("i", $number_of_days);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

查询参数的重点是将可能不受信任的内容与 SQL 解析步骤分开。通过使用参数,直到 SQL 被解析后,绑定变量的值才会与查询组合。因此绑定参数不可能影响查询的逻辑——参数将被限制为查询中的单个标量值。

  • 这个。如果你认为使用它太难了,或者太多的代码无法继续移动,或者记住细节等等,那么编写一个包装函数或类来完成这一切,只需向它传递一个查询字符串和参数数组,然后根据需要返回状态和/或结果集。`mysql_` 函数已经死了,当你修复旧代码时真的修复它! (2认同)