将代码从MySQL迁移至MySQLi时的数据查询报错问题
把MySQL代码迁移到MySQLi的解决方案
我来帮你搞定这个MySQL转MySQLi的问题,顺便解决你遇到的数据拉取报错~ 原来的mysql_*系列函数早就被废弃了,换成MySQLi不仅更安全,还能避免兼容性问题,下面我给你两种改写方案,你可以根据自己的习惯选:
方案一:面向过程风格(和你原来的代码习惯最接近)
这种写法和你原来的mysql_*函数逻辑差不多,只是调整了函数名和参数顺序,同时加入了错误检查和更安全的预处理语句:
// 1. 连接数据库(直接在连接时指定数据库,省掉单独选库的步骤) $connect = mysqli_connect('localhost', 'root', 'Password', 'playerslog'); // 检查连接是否成功,失败就直接报错 if (mysqli_connect_errno()) { die('数据库连接失败:' . mysqli_connect_error()); } // 2. 处理UUID参数:先判断参数是否存在,再转义(用预处理的话其实可以不用手动转义,但这里还是保留兼容) if (!isset($_GET['UUID'])) { die('缺少必要的UUID参数'); } $id = mysqli_real_escape_string($connect, $_GET['UUID']); // 3. 用预处理语句执行查询(比直接拼接字符串更安全,彻底防止SQL注入) $query = 'SELECT * FROM `playerslog` WHERE `UUID` = ? LIMIT 1'; $stmt = mysqli_prepare($connect, $query); // 绑定参数:'s'表示这个参数是字符串类型,对应后面的$id mysqli_stmt_bind_param($stmt, 's', $id); mysqli_stmt_execute($stmt); // 获取查询结果 $result = mysqli_stmt_get_result($stmt); // 4. 读取数据 if ($row = mysqli_fetch_assoc($result)) { // 这里可以使用$row里的字段,比如echo $row['username']; print_r($row); // 测试用,输出整条记录 } else { echo '没有找到匹配的记录'; } // 收尾:关闭语句和连接 mysqli_stmt_close($stmt); mysqli_close($connect);
方案二:面向对象风格(更简洁的写法)
如果你习惯面向对象的写法,也可以这样写,逻辑是一样的:
// 连接数据库 $conn = new mysqli('localhost', 'root', 'Password', 'playerslog'); if ($conn->connect_error) { die('数据库连接失败:' . $conn->connect_error); } // 处理参数 if (!isset($_GET['UUID'])) { die('缺少必要的UUID参数'); } $id = $_GET['UUID']; // 预处理查询 $stmt = $conn->prepare('SELECT * FROM `playerslog` WHERE `UUID` = ? LIMIT 1'); $stmt->bind_param('s', $id); $stmt->execute(); $result = $stmt->get_result(); // 读取数据 if ($row = $result->fetch_assoc()) { print_r($row); } else { echo '没有找到匹配的记录'; } // 关闭资源 $stmt->close(); $conn->close();
你之前可能踩的坑
- 参数顺序搞反:
mysqli_real_escape_string需要先传连接对象,再传要转义的字符串,和原来的mysql_real_escape_string参数顺序相反,这很容易导致报错 - 没做错误检查:原来的代码没检查连接、查询是否成功,出问题了根本不知道哪里错,上面的代码加了错误提示,方便你调试
- SQL注入风险:虽然原来用了转义,但预处理语句是更可靠的防注入方式,推荐优先用
内容的提问来源于stack exchange,提问作者user8023239
相关产品推荐
相关产品推荐

