使用 prepared 语句时是否需要 mysql_real_escape_string()?

Is mysql_real_escape_string() necessary when using prepared statements?

提问人:anvd 提问时间:6/4/2011 最后编辑:Dharmananvd 更新时间:11/16/2022 访问量:8655

问:

对于此查询,是否有必要使用 ?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 预备语句

答:

24赞 SamT 6/4/2011 #1

不,准备好的查询(如果使用得当)将确保数据不会更改您的 SQL 查询并提供安全的查询。你正在正确地使用它们,但你只能做一个小小的改变。由于您使用的是“?”占位符,因此通过 execute 方法传递参数会更容易。

$sql->execute([$consulta]);

如果你把它输出到你的页面,要小心,SQL参数绑定并不意味着它在HTML中显示是安全的,所以在输出时也要运行它。htmlspecialchars()

评论

0赞 anvd 6/4/2011
所以,像这样的事情?$sql->bind_param('s');$sql->execute(array($consulta));
0赞 SamT 6/4/2011
有点,只要松开那里的bind_param,你应该很好。你所做的只是在你去调用 ->execute() 时绑定你的参数;
0赞 SamT 6/4/2011
不是真的,这只是使用“?”占位符时的方法。使用命名占位符时,需要使用 ->bind_param(),例如:$sql = $db->prepare('select location from location_job where location like :item')); $sql->bind_param(':item', $consulta);
1赞 damianb 6/8/2011
请注意,如果在绑定参数后传递要执行的数组,则会遇到问题。请参阅 php.net 文档上的此说明:us.php.net/manual/en/pdostatement.execute.php#97531
3赞 phn 3/22/2017
需要注意的一点是,使用 PDO 扩展时只能采用数组参数。使用 mysqli 时没有参数,因此您需要使用 .execute()execute()bind_param()