添加$city或$findname变量后MySQL查询条件变为字符串致语句失效
问题原因
- 直接拼接变量到SQL语句中时,如果
$city或$findname变量本身包含单引号(比如城市名O'Neal、搜索词含'),会直接破坏SQL的语法结构,导致后续查询条件失效。 - 这种拼接写法存在严重的SQL注入漏洞,恶意用户可以构造特殊传参窃取、篡改数据库数据。
正确实现方案
你使用的WordPress数据库操作类$wpdb原生支持参数化预处理查询,不需要手动拼接引号,修改代码如下:
$findname = $_POST['findname']; $city = $_POST['city']; // 使用$wpdb->prepare方法预处理SQL,%s代表字符串类型参数 $show_details = $wpdb->get_results( $wpdb->prepare( "SELECT * from directory WHERE city LIKE %s OR findname LIKE %s", '%' . $wpdb->esc_like( $city ) . '%', '%' . $wpdb->esc_like( $findname ) . '%' ) ); foreach ($show_details as $k => $v) { echo $v->name . "<br />"; }
代码说明
$wpdb->prepare会自动处理参数的转义和引号包裹,不需要你手动加单引号,避免语法错误的同时完全避免SQL注入风险。$wpdb->esc_like是专门用于转义LIKE查询语句中特殊字符(%、_等)的方法,保证LIKE匹配逻辑符合预期。- 如果你不需要模糊匹配,要完全匹配值,直接去掉前后的
%即可,参数写法改成$city、$findname就行。
内容的提问来源于stack exchange,提问作者Mahmodul
相关产品推荐
相关产品推荐

