使用MySQLi预处理语句触发WHOOPS报错求助
解决mysqli预处理语句的WHOOPS错误问题
让我帮你快速定位问题——你的代码里有两处关键的语法错误,直接导致了mysqli_stmt_prepare调用失败:
核心错误点
mysqli_stmt_prepare参数顺序完全颠倒
这个函数的正确调用格式是mysqli_stmt_prepare($stmt, $sql),你错误地把类型字符串"sssssssss"插在了$stmt和$sql之间,这直接让函数无法识别正确的参数,触发了WHOOPS提示。mysqli_stmt_bind_param参数顺序错误
这个函数的正确顺序是:mysqli_stmt_bind_param($stmt, $type_string, &$var1, &$var2, ...),其中:- 第一个参数是预处理语句对象
$stmt - 第二个参数是类型字符串(比如
s代表字符串,对应你9个字符串类型的变量,所以是"sssssssss") - 后面才是要绑定的变量(PHP 5.3+之后可以不用显式加
&传引用,但保留也没问题)
你现在把变量放在了最前面,完全不符合语法要求。
- 第一个参数是预处理语句对象
另外要肯定你的一个正确做法:预处理语句确实会自动处理撇号、引号这类特殊字符,所以你注释掉array_walk_recursive那段手动转义的代码是对的,不需要恢复。
修正后的完整代码
<?php header('Refresh:3; url=/Collaborate/'); // 连接数据库 $link = mysqli_connect("*****","*****","*****", "*****"); if (!$link) { echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; } // 建议先检查POST参数是否存在,避免未定义索引警告 $Fname = $_POST['Fname'] ?? ''; $Lname = $_POST['Lname'] ?? ''; $Website = $_POST['Website'] ?? ''; $Phone = $_POST['Phone'] ?? ''; $Email = $_POST['Email'] ?? ''; $Interests1 = $_POST['Int1'] ?? ''; $Interests2 = $_POST['Int2'] ?? ''; $Interests3 = $_POST['Int3'] ?? ''; $PersonalStatement = $_POST['PersonalStatement'] ?? ''; // 正确的SQL语句 $sql = "INSERT INTO User(Fname, Lname, Website, Phone, Email, Interest1, Interest2, Interest3, PersonalStatement) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?);"; $stmt = mysqli_stmt_init($link); // 正确调用mysqli_stmt_prepare:只传$stmt和$sql if (!mysqli_stmt_prepare($stmt, $sql)) { echo "WHOOPS! 预处理语句创建失败:" . mysqli_error($link); } else { // 正确绑定参数:先$stmt,再类型字符串,最后变量 mysqli_stmt_bind_param($stmt, "sssssssss", $Fname, $Lname, $Website, $Phone, $Email, $Interests1, $Interests2, $Interests3, $PersonalStatement); mysqli_stmt_execute($stmt); // 可以检查执行是否成功,提升反馈准确性 if(mysqli_stmt_affected_rows($stmt) > 0){ echo "<h2>We got you $Fname!</h2>"; } else { echo "<h2>Oops, something went wrong with your submission.</h2>"; } // 记得关闭语句和连接,释放资源 mysqli_stmt_close($stmt); mysqli_close($link); } ?>
额外建议
- 加入
$_POST参数的存在检查(用??空合并运算符),可以避免页面出现未定义索引的警告。 - 执行后用
mysqli_stmt_affected_rows检查是否有数据被插入,能给用户更准确的反馈。 - 操作完成后关闭预处理语句和数据库连接,养成良好的资源释放习惯。
内容的提问来源于stack exchange,提问作者Steven Guerrero
相关产品推荐
相关产品推荐

