dongxi3859 2011-10-06 16:26
浏览 61
已采纳

MySQL正则表达式在PHP脚本中失败

If I run the following query in MySQL Workbench, or the mysql terminal, it works just fine:

SELECT
  `P`.`human_name` AS `permissionName`,
  IF(`PD`.`descriptor_text` REGEXP '.*role\\((-4,)?-3.*',
    (SELECT group_concat(`id`) FROM `users`),
    IF(`PD`.`descriptor_text` REGEXP '.*user\\([0-9,]+)$',
      SUBSTR(
        `PD`.`descriptor_text`,
        INSTR(`PD`.`descriptor_text`, 'user(') + 5,
        LENGTH(`PD`.`descriptor_text`) - INSTR(`PD`.`descriptor_text`, 'user(') - 5
      ),
      NULL
    )
  ) AS `user_ids`
FROM
  `documents` AS `D`
INNER JOIN `permission_lookups` AS `PL`  ON `D`.`permission_lookup_id` = `PL`.`id`
INNER JOIN `permission_lookup_assignments` AS `PLA` ON `PL`.`id` = `PLA`.`permission_lookup_id`
INNER JOIN `permission_descriptors` AS `PD`  ON `PLA`.`permission_descriptor_id` = `PD`.`id`
LEFT JOIN `permission_descriptor_roles` AS `PDR` ON `PDR`.`descriptor_id` = `PD`.`id`
LEFT JOIN `permissions` AS `P`   ON `PLA`.`permission_id` = `P`.`id`
WHERE `D`.`id` = 74

But as soon as I put it into a php mysql_query() it fails with the error: Got error 'parentheses not balanced' from regexp

My PHP code is as follows:

$permSQL = "
SELECT
  `P`.`human_name` AS `permissionName`,
  IF(`PD`.`descriptor_text` REGEXP '.*role\\((-4,)?-3.*',
    (SELECT group_concat(`id`) FROM `users`),
    IF(`PD`.`descriptor_text` REGEXP '.*user\\([0-9,]+)$',
      SUBSTR(
        `PD`.`descriptor_text`,
        INSTR(`PD`.`descriptor_text`, 'user(') + 5,
        LENGTH(`PD`.`descriptor_text`) - INSTR(`PD`.`descriptor_text`, 'user(') - 5
      ),
      NULL
    )
  ) AS `user_ids`
FROM
  `documents` AS `D`
INNER JOIN `permission_lookups` AS `PL`  ON `D`.`permission_lookup_id` = `PL`.`id`
INNER JOIN `permission_lookup_assignments` AS `PLA` ON `PL`.`id` = `PLA`.`permission_lookup_id`
INNER JOIN `permission_descriptors` AS `PD`  ON `PLA`.`permission_descriptor_id` = `PD`.`id`
LEFT JOIN `permission_descriptor_roles` AS `PDR` ON `PDR`.`descriptor_id` = `PD`.`id`
LEFT JOIN `permissions` AS `P`   ON `PLA`.`permission_id` = `P`.`id`
WHERE `D`.`id` = ".$argv[1];

$permQry = mysql_query($permSQL) or die('MySQL Error: ' . mysql_error());
while ($row = mysql_fetch_object($permSQL)) {
  echo $row->user_ids;
}

What would cause the query to work fine with anything other than PHP?

  • 写回答

1条回答 默认 最新

  • drhg24275 2011-10-06 16:32
    关注

    That is because PHP understands \\ as a escape sequence, converting that to a single backslash \. To print two literal backlashes, you'll need four:

    $permSQL = "
    SELECT
      `P`.`human_name` AS `permissionName`,
      IF(`PD`.`descriptor_text` REGEXP '.*role\\\\((-4,)?-3.*',
        (SELECT group_concat(`id`) FROM `users`),
        IF(`PD`.`descriptor_text` REGEXP '.*user\\\\([0-9,]+)$',
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢