【问题标题】:PDO/mysqli query doesn't return the same rows as mysql cli with regexPDO/mysqli 查询不返回与带有正则表达式的 mysql cli 相同的行
【发布时间】:2018-06-08 20:51:24
【问题描述】:

我在使用 PHP PDO 时遇到了一些问题,mysqli 也会出现这种问题

我有一个 mysql 查询,它在 mysql cli 中返回 221 行,但是如果我在 php 中使用 pdo 查询运行相同的查询,则只返回 25 行并且是不正确的行,

$stmt = $pdo->query("SELECT id, company_phone, locale, headquarters FROM xmltest.company where company_phone regexp '^\\([0-9]+\\)\\ [0-9]+\\ [0-9]' = 1 and char_length(company_phone) = 14");

   /* SELECT id, company_phone, locale, headquarters FROM xmltest.company where 
company_phone regexp '^\\([0-9]+\\)\\ [0-9]+\\ [0-9]' = 1 and 
char_length(company_phone) = 14  */

正则表达式匹配像 (021) 551 9771 这样的电话号码 但在 pdo 中返回电话,例如 64 06 358 7361

我怀疑与反斜杠转义有关,但不确定。

【问题讨论】:

  • 试试'^\\\\([0-9]+\\\\) *[0-9]+ +[0-9]+$'
  • 成功了!谢谢
  • PHP 在计算字符串时会吞下反引号。如果我们取消分配和执行,就可以很容易地看出这一点,这给了我们一个指向 echo/var_dump/display 检查字符串的内容...$sql = "..."; var_dump($sql); $pdo->query($sql);

标签: php mysql regex pdo


【解决方案1】:

您需要将反斜杠加倍,因为 MySQL 需要两个反斜杠来匹配文字反斜杠。此外,您需要将+ 量词添加到最后一个[0-9] 数字匹配模式,并以字符串锚点结尾$ 关闭模式。

使用

'^\\\\([0-9]+\\\\) *[0-9]+ +[0-9]+$'

详情

  • ^ - 字符串开头
  • \\\\( - 翻译成 MySQL 命令的 \\( - 翻译成 \( 字符串 - ( char
  • [0-9]+ - 1 位以上
  • \\\\) - 一个 ) 字符
  • * - 0+ 个空格(使用 + 匹配 1 个或多个)
  • [0-9]+ +[0-9]+ - 1+ 个数字,1+ 个空格,1+ 个数字
  • $ - 字符串结束。

【讨论】:

  • 您的正则表达式适用于 PHP PDO,但 mysql 仅适用于第一个 '^\([0-9]+\)\\ [0-9]+\\ [0-9] '
  • @FelipeMorales 在 MySQL 中,它应该是 '^\\([0-9]+\\) *[0-9]+ +[0-9]+$',因为双反斜杠被解释为正则表达式转义。你可能会看到the actual regex demo here
  • 好吧,你知道为什么 php 字符串需要额外的转义吗?
  • @FelipeMorales 因为要在 PHP 字符串文字(包括单引号和双引号)中定义反斜杠,您需要两个反斜杠。
猜你喜欢
  • 2013-02-10
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多