php - 真的有必要用 PHP 的 mysqli PREPARE 语句吗?

标签 php mysql mysqli

目前我有一些数据库包装函数,如下所示:

function db_escape($str) {
    return mysql_real_escape_string($str);
}

function db_query($sql) {
    global $LINKID;
    return mysql_query ($sql, $LINKID);
}

function db_fetch_array($result) {
    return mysql_fetch_array ($result, MYSQL_ASSOC);
}

在我的代码中,我可以执行以下操作:

$result = db_query('SELECT userid, first_name, last_name FROM user 
                    WHERE email = "' . db_escape($email) . '"');

if ($result) {
    $user = db_fetch_array($result);
}

这背后的想法之一是,当我从 mysql 切换到 mysqli 时,只需几分钟即可更新我的包装函数,并且我不必替换数百个 mysql_real_escape_string() 实例mysql_query()mysql_fetch_array() 跨越数百个不同的项目。

唯一的问题是上面的内容可以很容易地转换为标准过程 mysqli 函数,但不是准备好的语句。

这有关系吗?似乎每个教程都说准备好的语句对于安全性和性能很重要,但目前:

  1. 我的项目都没有性能问题。
  2. 我非常热衷于将用户输入转换为预期类型(字符串、整数、 float 等),并且还手动转义查询中任何地方使用的任何用户输入。

考虑到这一点,对于过去或 future 的项目,真的有必要切换到准备好的语句吗?

最佳答案

我认为你应该考虑长期利益。例如,如果将来您不再是该项目的开发人员,则使用非准备语句的习惯将传递给下一个开发人员,并且这样:

I am extremely anal about casting user input to the expected type (string, integer, float, etc.) and also manually escaping any user input that's used anywhere in a query.

可能不再正确了。即使你说你非常小心,但在某些时候你会犯错误或忘记(是的,人们犯了!这就是事情失败的原因),那么这将是一个问题。

以下面的情况为例。您认为安全吗?

$id = $_POST['id'];
$result = db_query('SELECT userid, first_name, last_name FROM user 
                WHERE userid = ' . db_escape($id) );

关于php - 真的有必要用 PHP 的 mysqli PREPARE 语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18753772/

相关文章:

PHP MySQL While 循环 多个表

javascript - 获取文本框的前一个值

php - 输入按钮仅在选中时才上传,使其成为必需

php - 如何通过 php 页面检索数据库值到 jquery 自动完成框

php - 如何使用 jquery ajax php 和 mysql 更新表中的数据

java - 为什么 Spring 的 jdbcTemplate.batchUpdate() 这么慢?

php - paypal IPN 不发送任何通知

php - 使用父类别搜索子类别

php - 从 php mysql* 到 mysqli

php - 在 mysqli_connect 上指定套接字选项