Android项目PHP连MySQL注册报错:mysqli_close()参数类型不匹配
解决mysqli_close()参数为null的注册模块错误
先直接说核心问题:你遇到的Warning: mysqli_close() expects parameter 1 to be mysqli, null given错误,本质是数据库连接失败导致$con变量为null,再加上代码里还有几个隐藏的问题,我给你一步步梳理修复方案:
1. 先补上数据库连接的有效性检查
你现在直接调用mysqli_connect但没判断连接是否成功——一旦连接失败(比如配置文件里的用户名/密码错、数据库不存在),$con就会变成null,后续所有mysqli操作都会出问题,包括你代码末尾的mysqli_close($con)。
修改连接部分:
include 'DatabaseConfig.php'; $con = mysqli_connect($HostName,$HostUser,$HostPass,$DatabaseName); // 新增连接检查,失败直接终止并输出错误信息 if (!$con) { die("数据库连接失败: " . mysqli_connect_error()); }
2. 修复INSERT语句的字段与值不匹配问题
你的INSERT语句里,字段列表是(id,username,email,password_cnic,phone)(共5个字段),但值列表却写了6个值:('$id','$U_name','$email','$password','$cnic','$phone'),这会直接导致插入失败。看字段名password_cnic应该是笔误,应该拆分password和cnic两个字段,修正后的语句:
$Sql_Query = "INSERT INTO Users (id,username,email,password,cnic,phone) values ('$id','$U_name','$email','$password','$cnic','$phone')";
3. 紧急修复SQL注入漏洞(非常重要)
你现在直接把POST参数拼进SQL语句,这是严重的安全漏洞,别等上线再后悔,赶紧换成预处理语句:
// 检查邮箱是否存在的预处理版本 $CheckSQL = "SELECT * FROM Users WHERE email=?"; $stmt = mysqli_prepare($con, $CheckSQL); mysqli_stmt_bind_param($stmt, "s", $email); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $check = mysqli_fetch_array($result); if($check){ echo 'Email Already Exist'; } else { // 插入数据的预处理版本 $Sql_Query = "INSERT INTO Users (id,username,email,password,cnic,phone) values (?,?,?,?,?,?)"; $stmt = mysqli_prepare($con, $Sql_Query); mysqli_stmt_bind_param($stmt, "ssssss", $id_name, $U_name, $email, $password, $cnic, $phone); if(mysqli_stmt_execute($stmt)){ echo 'Registration Successfully'; } else { // 新增错误提示,方便调试 echo '注册失败: ' . mysqli_error($con); } }
4. 确保mysqli_close调用安全
如果你的代码末尾有mysqli_close($con),一定要先判断$con是否有效,避免再次触发警告:
if($con){ mysqli_close($con); }
完整修复后的代码示例
<?php if($_SERVER['REQUEST_METHOD']=='POST'){ include 'DatabaseConfig.php'; $con = mysqli_connect($HostName,$HostUser,$HostPass,$DatabaseName); // 检查连接是否成功 if (!$con) { die("数据库连接失败: " . mysqli_connect_error()); } $id_name = $_POST['id']; $U_name = $_POST['username']; $password = $_POST['password']; $cnic = $_POST['cnic']; $email = $_POST['email']; $phone = $_POST['phone']; // 预处理查询检查邮箱是否存在 $CheckSQL = "SELECT * FROM Users WHERE email=?"; $stmt = mysqli_prepare($con, $CheckSQL); mysqli_stmt_bind_param($stmt, "s", $email); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $check = mysqli_fetch_array($result); if($check){ echo 'Email Already Exist'; } else { // 预处理插入数据 $Sql_Query = "INSERT INTO Users (id,username,email,password,cnic,phone) values (?,?,?,?,?,?)"; $stmt = mysqli_prepare($con, $Sql_Query); mysqli_stmt_bind_param($stmt, "ssssss", $id_name, $U_name, $email, $password, $cnic, $phone); if(mysqli_stmt_execute($stmt)){ echo 'Registration Successfully'; } else { echo '注册失败: ' . mysqli_error($con); } } // 安全关闭连接 if($con){ mysqli_close($con); } } ?>
内容的提问来源于stack exchange,提问作者Muhammad Sajid Lakha
相关产品推荐
相关产品推荐

