0

如果我将 PDO emulate 设置为 false,正如我多次阅读的那样,应该为 SQL 注入安全性进行,在LIKE查询中使用通配符不会导致输出。

这是设置:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

这是一个失败的查询:

$query = $db->prepare("SELECT * FROM video WHERE name like :search and removed='0' and verified='1' or subgenre like :search and removed='0' and verified='1' LIMIT :lb, :lt");
$query->bindValue(':search', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':lb', $limitbottom, PDO::PARAM_INT);
$query->bindValue(':lt', $limittop, PDO::PARAM_INT);
$query->execute();
$array = $query->fetchAll(PDO::FETCH_ASSOC);

如果我删除 emulate 设置,查询将按预期运行并返回一个数组。如果我正确理解了所有内容,则应在脚本中将 emulate 设置为 false 以防止 SQL 注入。我该如何纠正?是否可以like使用通配符和仿真进行查询?

PHP 是 5.4.10 & MySQL 是 5.1.66

4

1 回答 1

2

问题是该参数:search已经使用了两次,并且在关闭仿真的情况下不支持。

这解决了这个问题:

$query = $db->prepare("SELECT * FROM video WHERE name like :search1 and removed='0' and     verified='1' or subgenre like :search2 and removed='0' and verified='1' LIMIT :lb, :lt");
$query->bindValue(':search1', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':search2', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':lb', $limitbottom, PDO::PARAM_INT);
$query->bindValue(':lt', $limittop, PDO::PARAM_INT);
$query->execute();
$array = $query->fetchAll(PDO::FETCH_ASSOC);

现在查询将按预期返回数组。

于 2013-01-11T14:22:21.683 回答