PHP字符串生成多余反斜杠问题:SQL LIKE查询转义如何解决?
问题解决方法
首先说明你遇到的现象的本质:$wpdb->prepare输出的双引号前的反斜杠是MySQL要求的合法转义字符,不属于多余内容。MySQL执行查询时会自动将\"识别为普通双引号,不会影响匹配逻辑,你直接执行生成的SQL即可得到正确结果。
你之前用str_replace移除反斜杠无效,是因为反斜杠是prepare方法执行时自动给特殊字符添加的转义标识,你在调用prepare之前处理字符串不会影响它的转义逻辑,所以没有效果。
接下来按场景选择解决方案:
- 常规场景(推荐,兼顾安全和正确性):使用WordPress官方为LIKE查询提供的
esc_like方法处理搜索词,符合开发规范,代码如下:
$search_term = '"cardSelected":"120-B-110-C"'; // 先转义搜索词中属于LIKE语法的特殊字符(如%、_),再拼接通配符 $like = '%' . $wpdb->esc_like( $search_term ) . '%'; $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_status = %s AND post_content LIKE %s;", 'publish', $like );
- 特殊场景(仅适用于搜索词完全可控、无用户输入的场景,存在SQL注入风险):自行拼接LIKE部分内容,绕开prepare对搜索词的转义,代码如下:
$search_term = '"cardSelected":"120-B-110-C"'; // 手动做基础转义 $safe_search = esc_sql( $search_term ); $like = '%' . $safe_search . '%'; // LIKE部分直接拼接进SQL,其余变量仍用prepare转义保证安全 $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_status = %s AND post_content LIKE '$like';", 'publish' );
内容的提问来源于stack exchange,提问作者Renan Bessa
相关产品推荐
相关产品推荐

