我最终尝试使用 REGEXP CONCAT 函数制作 PDO 准备语句。在 phpmyadmin 中,我可以运行以下查询,该查询为我的数据库内容返回正确的结果(“城市”值(在本例中为丹佛))最终将成为绑定(bind)参数,但我现在将其明确放入其中以进行开发) :
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', '".*\''))
我尝试转义冒号、分号和句点字符,但没有成功。非常感谢任何帮助。
最佳答案
您正在向表达式添加文字引号:
AND (`meta_value` REGEXP CONCAT('\'.*"city";.*s:[0-9]+:"', 'Denver', '".*\''))
^ ^
这些不在你的第一个表达中。第一个表达式中的引号封装了 SQL 字符串。所以:
AND (`meta_value` REGEXP CONCAT('.*"city";.*s:[0-9]+:"', 'Denver', '".*'))
我认为可行。您也不需要使用 mysql concat
。您可以将变量连接到绑定(bind)中的表达式中。编写 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 ?)
然后构建绑定(bind),如下所示:
'.*"city";.*s:[0-9]+:"' . $city . '".*'
前导和尾随的 .*
也不是必需的。如果没有该规则,规则也会匹配,因为您没有使用 anchor 。
关于php - MySQL REGEXP CONCAT 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39372564/