【问题标题】: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);
}

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

【问题讨论】:

标签: php mysql mysqli prepared-statement sanitize


【解决方案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()
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多