You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:09:02