如何防止 %(​​number) 转换为代码

how to prevent conversion of %(number) to code

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

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

有问题的 MySQL 行如下所示:

d.d_name LIKE :criteria

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

6008

我希望它是:

%6008%

但我得到的是:

`08%

它看起来像是在对第 1 个 2 个字符进行 %-编码。我尝试使用 urldecode() 来恢复它,但它没有用。它将字符串保留为 `08%.

我怎样才能阻止这种情况发生?

这只是一个错觉。您正在尝试使用不适当的工具(如浏览器)查看您的查询。这个工具做了一些转换。与 SQL 完全无关。

而对于数据库,您的查询仍然完全相同。并且任何转换都没有一个问题。只需 运行 您的查询并获得结果。

绑定机制过于通用,因为它必须处理多种类型,并且存在一些像这样的边缘情况。

所以在这种情况下,不要使用绑定,而是将查询挂载为字符串:

$sql = "...whatever d.d_name LIKE '%" . $search . "%'";

调试 $search 以确保它在连接之前没有任何引号或任何内容。如果它用 trim 或类似的东西删除。

由于 sql 注入攻击,请务必正确验证 $search。

我建议你阅读有关字符串转义的内容,它可能会帮助你解决这个问题,同时了解一些编程基础知识也是一件好事。