MySQL REGEXP CONCAT的语法

时间:2016-09-07 14:24:45

标签: php mysql regex

我最终尝试使用REGEXP CONCAT函数制作PDO预处理语句。在phpmyadmin中我可以运行以下查询,该查询返回我的数据库内容的正确结果('city'值(在这种情况下为Denver))最终将是绑定参数,但我现在明确地将它放在那里进行开发) :

SELECT `user_ID` as `ID` 
FROM `usermeta` 
WHERE (`meta_key` = 'custom_field')
AND (`meta_value` REGEXP '.*"leagues";.*s:[0-9]+:"A".*')
AND (`meta_value` REGEXP '.*"city";.*s:[0-9]+:"Denver".*')

但是,如果我尝试在最后一行使用CONCAT函数,则结果为空集。换句话说,MySQL不会在查询本身上抛出任何错误,但是没有选择正确的数据:

SELECT `user_ID` as `ID` 
FROM `usermeta` 
WHERE (`meta_key` = 'custom_field')
AND (`meta_value` REGEXP '.*"leagues";.*s:[0-9]+:"A".*')
AND (`meta_value` REGEXP CONCAT('\'.*"city";.*s:[0-9]+:"', 'Denver', '".*\''))

我试过逃避冒号,分号和句号字符而没有运气。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您正在为表达式添加文字引号:

AND (`meta_value` REGEXP CONCAT('\'.*"city";.*s:[0-9]+:"', 'Denver', '".*\''))    
                                  ^                                       ^

那些不在你的第一个表达中。第一个表达式中的引号封装了SQL字符串。所以:

AND (`meta_value` REGEXP CONCAT('.*"city";.*s:[0-9]+:"', 'Denver', '".*'))

我认为会奏效。您也不需要使用mysql concat。您可以将变量连接到绑定中的表达式。制作SQL:

SELECT `user_ID` as `ID` 
FROM `usermeta` 
WHERE (`meta_key` = 'custom_field')
AND (`meta_value` REGEXP '.*"leagues";.*s:[0-9]+:"A".*')
AND (`meta_value` REGEXP ?)

然后构建如下的绑定:

'.*"city";.*s:[0-9]+:"' . $city . '".*'

前导和尾随.*也没有必要。如果没有使用锚,则规则将匹配。