我在PHP中有一行在PDO中构建查询参数:
$p[':criteria'] = '%' . $search . '%';
有问题的MySQL行如下所示:
d.d_name LIKE :criteria
问题是,如果我在$ search中输入一个数字,它会将其转换为一个字符。例如,如果我将$ search设置为:
6008
我希望它是:
%6008%
但我得到的是:
`08%
看起来它是% - 编码前2个字符。我尝试使用urldecode()来还原它,但它没有用。它将字符串保持为“08%”。
如何阻止这种情况发生?
答案 0 :(得分:0)
这只是一个幻觉。您正在尝试使用不适当的工具(如浏览器)查看您的查询。而这个工具做了一些转换。绝对与SQL的东西无关。
对于数据库,您的查询保持完全相同。任何转换都没有任何问题。只需运行您的查询并获得结果。
答案 1 :(得分:0)
绑定机制太过于通用,因为它必须处理许多类型,并且有一些像这样的边缘情况。
因此,在这种情况下,不要使用bind,而是将查询挂载为字符串:
$sql = "...whatever d.d_name LIKE '%" . $search . "%'";
调试$ search以确保它在连接之前没有任何引号或任何内容。如果它已经删除修剪或类似的东西。
还要确保因为sql-injection攻击而正确验证$ search。
答案 2 :(得分:-1)
我建议你阅读有关字符串转义的内容,它可以帮助你解决这个问题,并且还有一些好的东西也可以作为一些编程基础知识。
答案 3 :(得分:-1)
尝试使用如下例所示的预准备语句。
$sth = $dbh->prepare("SELECT *
FROM `test`
WHERE `criteria` LIKE :criteria");
$sth->bindParam(':criteria', '%'.$search.'%');
$sth->execute();