MySQL代码转MySQLi及代码错误排查求助
没问题,我帮你把这段老旧的MySQL扩展代码转换成符合现代标准的MySQLi版本,顺便修复几个潜在的问题,让代码更安全、更易维护:
先说明原代码的核心问题
- 使用了PHP 7+已完全移除的
mysql_*废弃函数,这是你遇到错误的直接原因 - 直接将用户输入拼入SQL语句,存在严重的SQL注入风险
- 滥用
@错误抑制符,会隐藏调试关键信息,不利于排查问题 - 存在拼写错误:
"ture"应为"true" - 空的
if语句没有实际处理逻辑,属于无效代码
转换后的MySQLi版本(面向对象风格,推荐)
首先要确保先建立数据库连接(替换成你的数据库信息),然后处理表单逻辑:
session_start(); // 必须先启动会话,否则无法使用$_SESSION // 建立MySQLi连接(面向对象写法) $mysqli = new mysqli('localhost', '你的数据库用户名', '你的数据库密码', '你的数据库名'); // 检查连接是否成功 if ($mysqli->connect_error) { die('数据库连接失败: ' . $mysqli->connect_error); } if (isset($_POST["B1"]) && $_SESSION["done"] !== "true") { // 清理并获取用户输入,避免空字符干扰 $username = trim($_POST['T2']); $password = trim($_POST['T3']); // 处理空输入(原代码是空语句,这里补充实际逻辑) if (empty($username) || empty($password)) { echo "用户名和密码不能为空,请重新输入"; exit; } // 使用预处理语句彻底避免SQL注入(核心改进) $stmt = $mysqli->prepare("SELECT id FROM user WHERE username = ?"); $stmt->bind_param("s", $username); // "s"表示绑定字符串类型参数 $stmt->execute(); $result = $stmt->get_result(); $num = $result->num_rows; // 这里可以添加后续逻辑,比如判断用户是否存在、验证密码等 if ($num > 0) { $user = $result->fetch_assoc(); // 推荐使用password_verify()验证哈希密码(如果你的密码是用password_hash()存储的) // if (password_verify($password, $user['password'])) { ... } } else { echo "该用户名不存在"; } // 关闭语句和连接,释放资源 $stmt->close(); $mysqli->close(); }
如果你习惯面向过程风格,也可以用这个版本
session_start(); // 建立面向过程的MySQLi连接 $conn = mysqli_connect('localhost', '你的数据库用户名', '你的数据库密码', '你的数据库名'); if (!$conn) { die('数据库连接失败: ' . mysqli_connect_error()); } if (isset($_POST["B1"]) && $_SESSION["done"] !== "true") { $username = trim($_POST['T2']); $password = trim($_POST['T3']); if (empty($username) || empty($password)) { echo "用户名和密码不能为空,请重新输入"; exit; } $stmt = mysqli_prepare($conn, "SELECT id FROM user WHERE username = ?"); mysqli_stmt_bind_param($stmt, "s", $username); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $num = mysqli_num_rows($result); // 后续逻辑... mysqli_stmt_close($stmt); mysqli_close($conn); }
关键改进点总结
- 完全替换废弃的
mysql_*函数为MySQLi方法,兼容PHP 7及以上版本 - 使用预处理语句绑定参数,彻底杜绝SQL注入风险
- 移除
@错误抑制符,添加明确的错误检查,方便调试 - 修正拼写错误,补充空输入的处理逻辑
- 推荐使用
password_hash()和password_verify()处理密码,这是现代PHP的安全标准
内容的提问来源于stack exchange,提问作者N1ma
相关产品推荐
相关产品推荐

