繁体   English   中英

将PDO模拟设置为false会导致SQL通配符像查询失败

[英]Setting PDO emulate to false results in SQL wildcard Like query failure

如果我将PDO模拟设置为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);

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

PHP为5.4.10,MySQL为5.1.66

问题是参数: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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM