使用准备好的语句时是不是需要 mysql_real_escape_string()?

Posted

技术标签:

【中文标题】使用准备好的语句时是不是需要 mysql_real_escape_string()?【英文标题】:Is mysql_real_escape_string() necessary when using prepared statements?使用准备好的语句时是否需要 mysql_real_escape_string()? 【发布时间】:2011-09-08 02:13:56 【问题描述】:

对于这个查询,有必要使用mysql_real_escape_string吗?

任何改进或查询都很好?

$consulta = $_REQUEST["term"]."%";

($sql = $db->prepare('select location from location_job where location like ?'));

$sql->bind_param('s', $consulta);
$sql->execute();
$sql->bind_result($location);

$data = array();

while ($sql->fetch()) 
    $data[] = array('label' => $location);

在这种情况下,查询速度很重要。

【问题讨论】:

Are php MySQLi prepared queries with bound parameters secure?的可能重复 【参考方案1】:

不,准备好的查询(如果使用得当)将确保正确转义数据以进行安全查询。您可以正确使用它们,只需要更改一点点即可。因为您使用的是“?”占位符,最好通过execute方法传递params。

$sql->execute(array($consulta));

如果你将它输出到你的页面要小心,数据库清理并不意味着它在 html 中显示是安全的,所以也要在它上面运行 htmlspecialchars()。

【讨论】:

那么,是这样的吗? $sql->bind_param('s'); $sql->执行(数组($consulta)); Sorta,只要松开那里的 bind_param 就可以了。当你调用 ->execute(); 时,你所做的只是绑定你的参数 并非如此,这只是您使用“?”时的方式占位符。使用命名占位符时,需要使用->bind_param(),例如:$sql = $db->prepare('select location from location_job where location like :item')); $sql->bind_param(':item', $consulta); 请注意,如果您在绑定参数后传递一个要执行的数组,您将遇到问题。请参阅 php.net 文档上的此注释:us.php.net/manual/en/pdostatement.execute.php#97531 需要注意的是execute()在使用PDO扩展时只能带一个数组参数。使用mysqli时execute()没有参数,所以你需要使用bind_param()

以上是关于使用准备好的语句时是不是需要 mysql_real_escape_string()?的主要内容,如果未能解决你的问题,请参考以下文章

Golang使用准备好的SQL语句

1615 准备好的语句需要在codeigniter中重新准备

准备好的语句以及连接池

单独使用准备好的语句进行占位符绑定是不是过大?

每次重新评估时都需要关闭准备好的语句,否则我可以在最后做一次

PDO 是不是仍在为 MySQL 模拟准备好的语句?