PHP调用MySQL8 REGEXP需写\\?有无无需转义双反斜杠的方法
最优解决方案:使用PHP Nowdoc语法
PHP的Nowdoc是单引号风格的长字符串定义结构,不会解析任何转义序列、变量,你从MySQL Workbench复制的完整SQL语句可以直接粘贴进去,不需要做任何修改,完美适配你的需求。
示例代码如下:
global $wpdb; // Nowdoc 语法:标识符用单引号包裹,内部内容完全原样保留 $sqlreal = <<<'SQL' SELECT wp_posts.* FROM wp_posts WHERE (wp_posts.post_title REGEXP '\\b(com(edy|ical)|doc(o|umentary))\\b' OR wp_posts.post_content REGEXP '\\b(com(edy|ical)|doc(o|umentary))\\b' ) AND ( wp_posts.ID NOT IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (215) ) ) AND (wp_posts.post_type = 'post' OR wp_posts.post_type = 'xdays1') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC SQL; $post_results = $wpdb->get_results($sqlreal); // 注意原代码此处有误,需要提取ID列表才能传入WP_Query $post_ids = wp_list_pluck($post_results, 'ID'); $second_query = new WP_Query( array( 'post__in' => $post_ids, 'orderby' => 'post__in', // 可选,保留SQL查询的排序规则 ) );
批量处理历史SQL的方案
如果你已经有数百段写在PHP双引号字符串中的SQL片段,不想逐个调整语法,可采用以下方案:
- 将所有SQL片段统一提取到独立的
.sql文本文件中,使用file_get_contents()读取文件内容,读取到的内容会完全保留原始格式,不会被PHP解析转义,无需任何替换操作 - 如果仍要保留在PHP文件中,可使用IDE的全局替换功能,一次性将所有SQL中的
\替换为\\,几秒即可完成数百段的处理
之前尝试的方案无效的原因
mysqli_real_escape_string仅用于转义SQL查询中动态传入的参数值,不能用于处理完整SQL语句,否则会破坏语句结构preg_quote是为PHP自身的正则表达式做转义的工具,和MySQL语句转义场景完全不匹配- 之前写的
str_replace逻辑无效,是因为替换操作执行在PHP解析字符串之后,此时\\已经被转义为\,替换已经失效
内容的提问来源于stack exchange,提问作者Benedict Harris
相关产品推荐
相关产品推荐

