零基础应选 PDO。它支持多数据库、预处理统一、防注入直观;需手动开启异常模式和设置 UTF8;INSERT 报错多因绑定参数不匹配;SELECT 需调用 fetch();DELETE/UPDATE 用 rowCount() 获取影响行数。

PHP 连接 MySQL 用 mysqli 还是 PDO?
零基础直接选 PDO。它支持多种数据库(MySQL、PostgreSQL、SQLite),预处理语句写法统一,防 SQL 注入更直观;mysqli 虽然轻量,但面向对象和过程式混用容易混乱,且只适配 MySQL。
注意:PDO 默认不开启异常模式,出错时静默失败——必须手动设置:
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
INSERT 时为什么总报 “SQLSTATE[HY000]: General error”?
这通常是预处理语句绑定参数出错导致的,比如:
- 占位符数量和
execute()传入数组元素个数不一致 - 用了命名参数(如
:name)却传了索引数组(['张三']) - 字段名拼错或表不存在,但没开异常模式,错误被吞掉
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => '李四', 'email' => 'lisi@example.com']);SELECT 返回空数组,但数据明明存在
常见原因不是 SQL 写错,而是:
- 没调用
fetch()或fetchAll()——prepare()和execute()不返回结果,只是执行 - 用了
PDO::FETCH_NUM却按键名取值(如$row['name']) - 查询条件含中文或特殊字符,但连接未设 UTF8:
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([123]);
$user = $stmt->fetch(); // 注意这里!DELETE 和 UPDATE 怎么确认影响了几行?
execute() 返回布尔值,不代表影响行数。必须调用 rowCount():
$stmt = $pdo->prepare("UPDATE users SET status = ? WHERE id = ?");
$stmt->execute(['active', 456]);
echo $stmt->rowCount(); // 输出实际更新的行数,可能为 0如果返回 0,说明没匹配到记录——这不是错误,而是业务常态,别当成异常抛出。另外,WHERE 条件漏写会导致全表误更新,上线前务必检查。
PDO 的事务、错误上下文、字符集初始化这些点,初学时容易跳过,但一旦出问题,排查成本远高于提前加两行配置。











