求助:将PHP MySQLi代码转换为PDO代码(转换后无法运行)
PHP MySQLi转PDO故障排查与修正指南
1. 先确认PDO连接正确性
- 确保php.ini中已启用PDO扩展:
extension=pdo_mysql - 标准PDO连接写法(开启异常模式便于排错):
try { $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4', '用户名', '密码', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); } catch (PDOException $e) { die('数据库连接失败: ' . $e->getMessage()); }
- 必须指定
charset=utf8mb4,避免乱码;异常模式会直接暴露错误,不要用静默模式。
2. 常见转换错误点修正
参数绑定错误
MySQLi的bind_param不适用于PDO,两种正确绑定方式:
// 错误示例(混用MySQLi写法) $stmt = $pdo->prepare("SELECT * FROM fees WHERE student_id = ?"); $stmt->bind_param('i', $student_id); // PDO不支持此方法 // 正确写法1:bindParam(变量引用) $stmt = $pdo->prepare("SELECT * FROM fees WHERE student_id = ?"); $stmt->bindParam(1, $student_id, PDO::PARAM_INT); $stmt->execute(); // 正确写法2:直接传数组给execute(更简洁) $stmt = $pdo->prepare("SELECT * FROM fees WHERE student_id = ?"); $stmt->execute([$student_id]);
结果集获取错误
PDO没有mysqli_fetch_assoc方法,对应写法:
// 错误示例 while ($row = mysqli_fetch_assoc($stmt)) { ... } // 正确写法:单条结果 $row = $stmt->fetch(); // 正确写法:遍历多条结果 while ($row = $stmt->fetch()) { // 处理数据逻辑 } // 正确写法:一次性获取所有结果 $allRows = $stmt->fetchAll();
报表展示循环输出错误
以表格报表为例,PDO正确输出写法:
echo '<table><tr><th>学生ID</th><th>费用项目</th><th>金额</th></tr>'; $stmt = $pdo->prepare("SELECT student_id, item, amount FROM fees WHERE class_id = ?"); $stmt->execute([$class_id]); while ($row = $stmt->fetch()) { echo "<tr><td>{$row['student_id']}</td><td>{$row['item']}</td><td>{$row['amount']}</td></tr>"; } echo '</table>';
3. 强制开启调试模式
若仍无法定位问题,开启PHP错误显示和PDO异常模式(仅开发环境使用):
error_reporting(E_ALL); ini_set('display_errors', 1); $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4', '用户名', '密码', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]);
任何SQL语法错误、绑定错误都会直接抛出异常,显示具体错误信息。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

