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

Php 如何防止将%(数字)转换为代码,php,mysql,sql,pdo,percent-encoding,Php,Mysql,Sql,Pdo,Percent Encoding,我在PHP中有一行代码,它正在PDO中构建一个查询参数: $p[':criteria'] = '%' . $search . '%'; 所讨论的MySQL行如下所示: d.d_name LIKE :criteria 问题是,如果我在$search中输入一个数字,它会将其转换为一个字符。例如,如果我将$search设置为: 6008 我希望它是: %6008% 但我得到的是: `08% 看起来它正在对前2个字符进行编码。我尝试使用urldecode()将其还原,但无效。它将字符串保留为'

我在PHP中有一行代码,它正在PDO中构建一个查询参数:

$p[':criteria'] = '%' . $search . '%';
所讨论的MySQL行如下所示:

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

6008
我希望它是:

%6008%
但我得到的是:

`08%
看起来它正在对前2个字符进行编码。我尝试使用urldecode()将其还原,但无效。它将字符串保留为'08%

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

这只是一种幻觉。您试图使用不合适的工具(如浏览器)查看查询。这个工具做了一些转换。与SQL无关


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

Bind-mecanism太泛化了,因为它必须处理许多类型,并且有一些类似的边缘情况

因此,在本例中,不要使用bind,而是将查询装载为字符串:

$sql = "...whatever d.d_name LIKE '%" . $search . "%'";
调试$search以确保在连接之前它没有任何引号或任何内容。如果它有修剪或类似的东西删除


另外,由于sql注入攻击,请确保正确验证$search。

我建议您阅读有关字符串转义的内容,它可能有助于您解决此问题,而且作为一些编程基础知识,这也是一件好事。

“但我得到了什么”-但您从哪里得到它?您使用的是框架、ORM、,或者任何抽象层?PHP和PDO都不会转换您的数据。它保持完全相同。因此,您的代码没有一个问题。需要更多的上下文:“在结果查询中”——不,它没有。Mysql准确地返回您放在那里的数据。我想指出,OP很可能使用某种框架,并且
$\u POST
数据在分配给
$search
之前就被操纵了。OP也可能有一些未知的JS代码执行类似的操作。