在PHP的MySQL查询中移除字符串单双引号问题求助
解决MySQL查询中移除字符串单双引号的问题
我来帮你分析一下这个问题,你遇到的REPLACE函数没生效的情况,大概率是这几个原因导致的,咱们一步步来解决:
1. 你只处理了双引号,没处理单引号
你当前的代码只替换了双引号,完全没处理单引号。而且在MySQL中,单引号的转义和双引号不同——MySQL里要用两个单引号来表示一个单引号(而不是反斜杠转义)。
解决方案:嵌套REPLACE同时处理两种引号
可以嵌套两层REPLACE,分别替换双引号和单引号,修正后的代码片段如下:
REPLACE(REPLACE(RW.review_title, '\"', ''), '''', '') as review_title
解释一下:
'\"':在PHP的双引号字符串中,反斜杠转义双引号,最终传到MySQL的是",用来匹配字段里的双引号''':在PHP双引号字符串里,三个单引号最终会被解析为MySQL中的'(MySQL用两个单引号转义一个单引号,所以这里的三个单引号实际是「转义后的单引号」+「闭合单引号」)
2. 用REGEXP_REPLACE简化写法(MySQL 8.0+适用)
如果你的MySQL版本是8.0或以上,可以用正则替换一步搞定,代码更简洁:
REGEXP_REPLACE(RW.review_title, '[\"'']', '') as review_title
这个正则表达式[\"'']会匹配所有的双引号和单引号,一次性替换为空字符串。
3. 排查数据本身的问题
如果上面的写法还是没效果,你需要检查review_title字段里的引号是不是全角引号(比如「“”」「‘’」),而不是咱们常用的半角引号「""」「''」。如果是全角引号,需要把REPLACE里的匹配字符换成对应的全角符号。
4. 先单独测试SQL语句
你可以先把拼接好的SQL语句复制出来,直接在MySQL客户端(比如Navicat、phpMyAdmin)里执行,看看review_title的结果是否符合预期,这样能排除PHP拼接字符串时的转义问题。
额外提醒:注意SQL注入风险
你的代码里直接把$_SESSION['AdminDetails']['prop_code']拼到SQL语句里,虽然是会话变量,但还是存在SQL注入的潜在风险。建议使用PHP的预处理语句(PDO或mysqli的prepare方法)来绑定参数,更安全可靠。
修正后的完整SQL代码示例(嵌套REPLACE版本):
$strSql = "select RW.review_channelid,RW.review_id,RW.create_date,RW.rating_overall,RW.isold,RW.guestreplysent,RW.guest_id,RW.guest_name, REPLACE(REPLACE(RW.review_title, '\"', ''), '''', '') as review_title, RW.channel_id,RW.review_type,RW.review_method,RW.your_view,RW.neg_review,CH.extranet_url,RW.checkout_date,RW.review_time,CH.channel_code,CH.channel_name,RW.isposted_facebook,RW.isposted_twitter, IF(RW.review_time ='0000-00-00',create_date,review_time) AS rtime from ".dbtable::ReviewMaster." AS RW left join ".dbtable::ChannelMaster." AS CH ON RW.channel_id = CH.channel_id where prop_code = '".$_SESSION['AdminDetails']['prop_code']."' ";
内容的提问来源于stack exchange,提问作者Paras Prajapati
相关产品推荐
相关产品推荐

