使用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
相关产品推荐
相关产品推荐

