使用准备好的语句时是不是需要 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()?的主要内容,如果未能解决你的问题,请参考以下文章
1615 准备好的语句需要在codeigniter中重新准备