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

使用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, ...),其中:

    1. 第一个参数是预处理语句对象$stmt
    2. 第二个参数是类型字符串(比如s代表字符串,对应你9个字符串类型的变量,所以是"sssssssss")
    3. 后面才是要绑定的变量(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:28:51