【问题标题】:how to prevent conversion of %(number) to code如何防止将 %(number) 转换为代码
【发布时间】:2016-09-02 00:45:46
【问题描述】:

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

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

有问题的 MySQL 行如下所示:

d.d_name LIKE :criteria

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

6008

我希望它是:

%6008%

但我得到的是:

`08%

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

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

【问题讨论】:

  • “但我得到了什么” --- 但你在哪里得到它?
  • 您使用的是框架、ORM 还是任何抽象层?
  • PHP 和 PDO 都不会转换您的数据。它保持不变。因此,您的代码没有任何问题。
  • 需要更多上下文:sandbox.onlinephpfunctions.com/code/…
  • “在结果查询中”——不,它没有。 Mysql 准确地返回你放在那里的数据。

标签: php mysql sql pdo percent-encoding


【解决方案1】:

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

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

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

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

由于 sql-injection 攻击,还要确保正确验证 $search。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我想指出,OP 很可能使用某种框架,并且 $_POST 数据在分配给 $search 之前就已被操作。 OP也可能有一些未知的JS代码做类似的事情。 I've had an issue like this before
    【解决方案3】:

    我建议您阅读有关字符串转义的内容,它可能会帮助您解决此问题,并且还可以了解一些编程基础知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 2023-02-02
      • 2023-02-09
      • 2023-03-26
      • 1970-01-01
      • 2020-03-27
      • 2022-01-24
      • 2019-06-22
      相关资源
      最近更新 更多