我最终尝试使用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', '".*\''))
我试过逃避冒号,分号和句号字符而没有运气。非常感谢任何帮助。
答案 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 . '".*'
前导和尾随.*
也没有必要。如果没有使用锚,则规则将匹配。