如何防止%(数字)转换为代码

时间:2016-05-06 20:30:14

标签: php mysql sql pdo percent-encoding

我在PHP中有一行在PDO中构建查询参数:

$p[':criteria'] = '%' . $search . '%';

有问题的MySQL行如下所示:

d.d_name LIKE :criteria

问题是,如果我在$ search中输入一个数字,它会将其转换为一个字符。例如,如果我将$ search设置为:

6008

我希望它是:

%6008%

但我得到的是:

`08%

看起来它是% - 编码前2个字符。我尝试使用urldecode()来还原它,但它没有用。它将字符串保持为“08%”。

如何阻止这种情况发生?

4 个答案:

答案 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();