如何防止 %(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。
我建议你阅读有关字符串转义的内容,它可能会帮助你解决这个问题,同时了解一些编程基础知识也是一件好事。
我在 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。
我建议你阅读有关字符串转义的内容,它可能会帮助你解决这个问题,同时了解一些编程基础知识也是一件好事。