MySQL查询报错SQLSTATE[HY093]:混合命名与位置参数问题求助
解决PDO混合位置与命名参数导致的SQLSTATE[HY093]错误
这个错误的核心原因是PDO不允许在同一条SQL语句中混合使用位置参数(?)和命名参数(:id),两种参数格式必须二选一,以下是两种可行的修复方案:
方案1:统一使用位置参数
将WHERE子句的命名参数改为位置参数,然后按SQL中参数的顺序传入所有值:
try { $sql = "UPDATE kunder SET fname=?, ename=?, user=? WHERE id = ?"; $stmt = $dbconn->prepare($sql); $data = array($fname, $ename, $user, $_SESSION["user_id"]); $stmt->execute($data); } catch (PDOException $e) { echo $sql . "<br>" . $e->getMessage(); }
方案2:统一使用命名参数
将所有位置参数替换为命名参数,可通过绑定参数或直接传入关联数组执行:
try { $sql = "UPDATE kunder SET fname=:fname, ename=:ename, user=:user WHERE id = :id"; $stmt = $dbconn->prepare($sql); // 方式一:逐个绑定参数 $stmt->bindParam(':fname', $fname); $stmt->bindParam(':ename', $ename); $stmt->bindParam(':user', $user); $stmt->bindParam(':id', $_SESSION["user_id"]); $stmt->execute(); // 方式二:直接传入关联数组(更简洁) // $stmt->execute([ // ':fname' => $fname, // ':ename' => $ename, // ':user' => $user, // ':id' => $_SESSION["user_id"] // ]); } catch (PDOException $e) { echo $sql . "<br>" . $e->getMessage(); }
注意事项
- 使用位置参数时,传入数组的顺序必须和SQL中
?的顺序完全对应 - 不要同时混用
bindParam和execute传数组的方式,避免参数重复绑定
内容的提问来源于stack exchange,提问作者Lukas Mannerstål
相关产品推荐
相关产品推荐

