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

使用DataTable时SQL拼接WHERE条件报错,需筛选active=0的数据

问题解决:SQL语法错误及注入风险修复

错误原因

你的初始SQL已经包含WHERE active = 0,当存在搜索值时又拼接了第二个WHERE,导致SQL语句出现重复的WHERE关键字,触发语法错误。比如最终生成的SQL会是:

SELECT * FROM ndi3670 WHERE active = 0 WHERE lastname like '%%' OR ...

这种写法不符合SQL语法规范。另外,直接拼接用户输入还存在严重的SQL注入风险。

修复方案

1. 修正WHERE条件拼接逻辑

当需要添加搜索条件时,用AND连接原有条件,并将多个OR条件用括号包裹,确保逻辑正确。

2. 使用预处理语句防止SQL注入

绝对不能直接将用户输入拼接到SQL语句中,必须通过参数绑定的方式处理。

修复后的代码

$result= array();
$sql = "SELECT * FROM ndi3670 WHERE active = 0";

// 处理搜索条件
if(isset($_POST['search']['value']) && !empty(trim($_POST['search']['value'])))
{
    $search_value = trim($_POST['search']['value']);
    // 拼接搜索条件,用AND连接,OR条件分组
    $sql .= " AND (lastname LIKE ? 
                OR firstname LIKE ? 
                OR middlename LIKE ? 
                OR empid LIKE ?)";
    
    // 初始化预处理语句
    $stmt = mysqli_prepare($con, $sql);
    if($stmt) {
        // 为LIKE语句添加通配符
        $like_param = "%{$search_value}%";
        // 绑定参数,四个字符串类型参数
        mysqli_stmt_bind_param($stmt, "ssss", $like_param, $like_param, $like_param, $like_param);
        // 执行语句
        mysqli_stmt_execute($stmt);
        // 获取结果集
        $totalQuery = mysqli_stmt_get_result($stmt);
    } else {
        // 处理预处理语句错误
        die(mysqli_error($con));
    }
} else {
    // 无搜索值时执行原SQL
    $totalQuery = mysqli_query($con, $sql);
    if(!$totalQuery) {
        die(mysqli_error($con));
    }
}

$total_all_rows = mysqli_num_rows($totalQuery);

$columns = array(
    0 => 'empid',
    1 => 'lastname',
    2 => 'firstname',
    3 => 'middlename',
);

关键说明

  • 用AND替代第二个WHERE,避免语法错误
  • 括号包裹OR条件,确保搜索逻辑是“active=0 且 (任意字段匹配搜索值)”
  • 预处理语句+参数绑定彻底杜绝SQL注入风险
  • 增加了空值判断,避免搜索值为空时生成无效的OR条件

内容的提问来源于stack exchange,提问作者TheBumba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:36:13