我在 PHP 文件中有这个查询:
return $this->_getDb()->fetchRow('
SELECT *
FROM xf_user
WHERE user_id = ?
', $userId);
最后一行是做什么的,在谷歌上快速查找后我发现问号是一个动态参数。谁能给我一个更详细的解释?谢谢。
好吧,您缺少命令的一部分(注意不平衡的引号)。我怀疑你在一开始就遗漏了一两行。 (用户编辑帖子以包含缺失的行)。
参数所做的是获取参数的值(保存在 $userID 变量中的值)并使用它来评估 SQL 查询。因此,如果 $userID 包含值 101,则执行的查询基本上是SELECT * FROM xf_user WHERE user_id = 101
.
但是,使用参数不同于简单地将查询构造为文本语句,因为参数经过类型检查并且可以安全抵御 SQL 注入攻击。此外,使用 $userID 中的新值多次执行的同一命令将执行得更快,因为 SQL 引擎可以只“准备”一次语句,而不是每次执行它。
看起来您正在使用准备好的语句。允许您“准备”一个期望动态参数在 MySQL 服务器上传递给它的查询。然后,您在单独的操作中发送必要的参数。
这可以提供一些性能优势,但也可以在防止 SQL 注入攻击方面提供巨大的安全优势。
尽管您似乎没有使用 MySQLI,但您可以阅读 PHP mysqli::prepare 文档以获取更多背景信息: