PHP过程式代码中LIKE关键字的SQL语法错误排查与修复
错误原因及修复方案
错误核心
你混淆了两种SQL执行逻辑:前面已经用mysqli预处理语句(mysqli_stmt_*系列函数)完成参数绑定与执行,但后续错误调用mysqli_query($conn, $sql)直接执行带?占位符的原始SQL。mysqli_query不支持预处理占位符,数据库会把?当作普通字符解析,从而抛出语法错误。
修复步骤
删除mysqli_query相关错误代码,改用预处理语句的API获取查询结果:
修复后的完整代码:
function getProductsBySearch($conn, $search){ $sql = "SELECT * FROM products JOIN users ON products.userid = users.id WHERE users.name LIKE ? OR users.surname LIKE ? OR users.class LIKE ? OR users.email LIKE ?"; $stmt = mysqli_stmt_init($conn); if(!mysqli_stmt_prepare($stmt, $sql)){ header("location: ../index.php?error=stmtfailed"); exit(); } $searchTerm = "%".$search."%"; mysqli_stmt_bind_param($stmt, "ssss", $searchTerm, $searchTerm, $searchTerm, $searchTerm); mysqli_stmt_execute($stmt); // 通过预处理语句对象获取结果集 $result = mysqli_stmt_get_result($stmt); $products = mysqli_fetch_all($result, MYSQLI_ASSOC); mysqli_stmt_close($stmt); return $products; }
关键修改点
- 移除冗余的
mysqli_stmt_store_result($stmt);(使用mysqli_stmt_get_result时无需此步骤) - 删除错误的
$result = mysqli_query($conn, $sql);代码 - 替换为
$result = mysqli_stmt_get_result($stmt);,通过预处理语句对象获取合法结果集 - 变量名改为
$searchTerm避免混淆(可选,仅为代码可读性优化)
内容的提问来源于stack exchange,提问作者Pavee
相关产品推荐
相关产品推荐

