
PHP 中使用 PDO 执行预处理语句,核心是防止 SQL 注入、提升执行效率,并支持多参数安全绑定。关键不在“写出来”,而在“怎么绑、何时执行、错误怎么查”。
连接数据库时开启异常模式
PDO 默认失败只返回 false,不报错。必须主动设置 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则 prepare() 或 execute() 出错会被静默吞掉。
示例:
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
prepare() 后必须检查是否成功,再 bindParam/bindValue
prepare() 返回 PDOStatement 对象或抛出异常(取决于 errmode)。不要跳过判断直接调用 bindParam —— 如果 SQL 语法错误或表不存在,prepare 就会失败。
立即学习“PHP免费学习笔记(深入)”;
绑定推荐用 bindValue() 而非 bindParam,除非真需要变量引用(如循环中复用同一变量):
- bindValue 绑定的是值的副本,安全、直观
- bindParam 绑定的是变量本身,后续修改该变量会影响下一次 execute()
- 插入字符串、数字、NULL 时,显式指定类型更稳妥(如 PDO::PARAM_STR、PDO::PARAM_INT)
execute() 的参数可以传数组,但要注意键名匹配
如果用命名占位符(如 :name),execute([':name' => 'Alice']) 可以直接传关联数组;如果用问号占位符,就只能传索引数组,且顺序必须严格对应 SQL 中 ? 的位置。
注意:命名占位符的键名必须带冒号,且大小写敏感。常见错误是写成 execute(['name' => 'Alice']) 导致绑定失效。
查询后及时获取结果,别忘了 fetch() 或 fetchAll()
prepare + execute 只是执行语句,不自动取数据。SELECT 必须调用 fetch() / fetchAll() 才能得到结果;INSERT/UPDATE/DELETE 则可通过 rowCount() 获取影响行数。
示例:
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE status = ?");
$stmt->execute([1]);
$users = $stmt->fetchAll(); // 拿到全部结果











