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

开发PHP登录注册系统时,运行process-signup.php遇stmt_init()调用错误

解决注册系统中Call to a member function stmt_init() on int错误及相关问题

错误根源分析

你遇到的Fatal error: Uncaught Error: Call to a member function stmt_init() on int是因为$mysqli变量被赋值为int类型(require成功时返回1),而非预期的mysqli连接对象,导致无法调用对象方法。同时代码中还有其他两处问题需要修复:


1. 数据库连接变量传递错误

  • 问题:config.php中创建的连接对象是$conn,但process-signup.php里错误地将require的返回值(成功返回1)赋值给$mysqli,而非获取config.php中定义的连接对象。
  • 修复方案:修改config.php让它返回连接对象,确保process-signup.php能正确获取到mysqli实例:

修复后的config.php:

<?php
$conn = new mysqli('localhost','root', '', 'login_db','3306');
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
return $conn; // 返回连接对象供外部使用
?>

2. SQL预编译参数不匹配

  • 问题:SQL语句INSERT INTO user (username, password) VALUES (?, ?)有2个占位符,但bind_param使用了"sss"(表示3个字符串参数),而实际只传入了2个变量,会导致参数数量不匹配错误。
  • 修复方案:将bind_param的第一个参数改为"ss":
$stmt->bind_param("ss", $_POST["username"], $password_hash);

3. 拼写错误修正

  • 问题:最终输出的Signup successfull存在拼写错误,正确应为Signup successful。

完整修复后的process-signup.php代码

<?php
if (empty($_POST["username"])) {
    die("Username is required");
}

if (strlen($_POST["password"]) < 8) {
    die("Password must be at least 8 characters");
}

if (!preg_match("/[a-z]/i", $_POST["password"])) {
    die("Password must contain at least one letter");
}

if (!preg_match("/[0-9]/", $_POST["password"])) {
    die("Password must contain at least one number");
}

if ($_POST["password"] !== $_POST["repassword"]) {
    die("Passwords must match");
}

$password_hash = password_hash($_POST["password"], PASSWORD_DEFAULT);

$mysqli = require __DIR__ . "/config.php";

$sql = "INSERT INTO user (username, password) VALUES (?, ?)";

$stmt = $mysqli->stmt_init();

if (!$stmt->prepare($sql)) {
    die("SQL error: " . $mysqli->error);
}

$stmt->bind_param("ss", $_POST["username"], $password_hash);

// 增加执行结果判断,处理用户名重复等异常
if ($stmt->execute()) {
    echo "Signup successful";
} else {
    if ($mysqli->errno === 1062) {
        die("Username already exists");
    } else {
        die("Signup failed: " . $mysqli->error);
    }
}

// 关闭语句和连接
$stmt->close();
$mysqli->close();
?>

内容的提问来源于stack exchange,提问作者Egitto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:53:12