【问题标题】:PDO: Select field from DB which contains a backslashPDO:从包含反斜杠的 DB 中选择字段
【发布时间】:2019-04-18 14:17:36
【问题描述】:

我有这个内容的桌子

ID|name
----------------
1 |My Shop No. \6\

(不要问为什么六个在反斜杠内,我不知道,我只需要处理它)

我尝试从我的表中选择这个特定值。 我的查询如下所示:

$sql = "SELECT `id` FROM shops WHERE `name` = :name";
$params = array(':name' => "My Shop No. \6\");
$this->fetchOne($sql, $params); // the binding happens in my mysql class

此查询不返回任何数据,它表示没有条目。 当我使用Neor Profiler SQL 监控我的 SQL 语句时,我可以看到数据库正在接收这个查询:

SELECT `id` FROM shops WHERE `name` = 'My Shop No. \\6\\'

当我直接在 PHPMyAdmin 中使用这个查询时,它也没有返回任何结果。

我该如何处理这种情况?

绝对没有选项可以更改数据库中的数据。

【问题讨论】:

  • 反斜杠在 PHP 字符串中也有含义。试试var_dump($params) 看看我的意思。如果事实上你在 SQL 中做对了,而且语法是一样的。
  • 好的,问题是我很难创建一个示例案例。字符串值实际上来自 URL 参数。你认为这仍然是一个问题吗?在将它们传递给查询之前,我还尝试用双反斜杠替换反斜杠。但这根本没有帮助。
  • 我做了一个 var_dump。输出是通过 url 接收到的字符串
  • 字符串文字是完全不同的东西。信任var_dump()。如果 URL 中的单个斜杠在 var_dump($_GET) 处加倍,则您遇到了不同的问题。
  • 它不会在 var_dump 中翻倍。它只在Neor Profiler / MySQL 中翻了一番。在那之前,字符串只有一个反斜杠

标签: mysql pdo mariadb


【解决方案1】:

许多 产品(PHP、MySQL 等)使用反斜杠作为转义字符。

它本身通常被它之后的角色做某事所消耗。例如,a\tb 为您提供由制表符分隔的字母 ab\t通常解释)。

加倍反斜杠\\xyz 通常这样解释:第一个反斜杠转义第二个,所以你得到\xyz

如果您的字符串经过多层代码(例如,PDO 和 MySQL),您可能需要两倍的反斜杠,因为每一层都会将 \\ 转换为 \。 p>

另一个诊断工具是SELECT HEX(col) ...,用于查看数据库中存储的内容。例子:

610962    a\tb  -- a=61, tab=09, b=62
615C7462  a\\tb -- a=61, \=5C, t=74, b=62 

回到你的代码:

$params = array(':name' => "My Shop No. \6\");

\6 is probably treated as just "6" (not everything has some escaped meaning)
\" possibly caused a syntax error.  Normally this is now to get a " inside a string

'My Shop No. \\6\\'

现在这对反斜杠变成了单个反斜杠,然后将字符串交给下一个。

(在这些上下文中,单引号和双引号的作用相同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2013-08-11
    • 2021-03-27
    相关资源
    最近更新 更多