首页 / PHP 入门教程 / PHP PDO 基础

PHP 入门教程

PHP PDO 基础

本教程共 65 篇 · 第 49 篇 · 更新于 2026-07-24 · 约 7 分钟阅读

PHPPHP8PDO数据库抽象层DSN错误处理预处理

49. PHP PDO 基础

本节目标:理解 PDO 的设计思想,掌握 PDO 连接数据库的方式,能够配置不同的错误处理模式。

PDO(PHP Data Objects)是 PHP 内置的数据库抽象层。使用 PDO,你可以用同一套代码连接 MySQL、SQLite、PostgreSQL 等多种数据库。


1. 为什么选择 PDO

优势说明
数据库无关切换数据库只需改 DSN,业务代码不变
预处理语句原生支持参数绑定,有效防止 SQL 注入
错误处理灵活支持静默、警告、异常三种模式
面向对象统一的 API,学习一次到处使用
Note

如果项目确定只用 MySQL,mysqli 也是完全可行的选择。PDO 更适合需要兼容多种数据库的场景。


2. PDO 连接 MySQL

连接数据库需要 DSN(Data Source Name)字符串,包含数据库类型、主机、库名等信息。

<?php
$host = 'localhost';
$db   = 'my_app';
$user = 'root';
$pass = '123456';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
    echo '连接成功';
} catch (PDOException $e) {
    die('数据库连接失败:' . $e->getMessage());
}

常用 DSN 格式

数据库DSN 示例
MySQLmysql:host=localhost;dbname=test;charset=utf8mb4
SQLitesqlite:/path/to/database.db
PostgreSQLpgsql:host=localhost;dbname=test

3. 错误处理模式

PDO 提供三种错误处理模式,通过 PDO::ATTR_ERRMODE 设置。

异常模式(推荐)

<?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 表不存在时会抛出 PDOException
$pdo->query("SELECT * FROM not_exist_table");

警告模式

<?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

// 发出 E_WARNING 级别的警告,但不中断执行
$pdo->query("SELECT * FROM not_exist_table");

静默模式(默认)

<?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

// 不报错,需手动检查错误
$stmt = $pdo->query("SELECT * FROM not_exist_table");
if ($stmt === false) {
    echo '错误:' . $pdo->errorInfo()[2];
}
Tip

开发阶段使用 ERRMODE_EXCEPTION,生产环境也建议保持,配合 try-catch 统一处理异常。


4. 执行简单查询

<?php
$pdo = new PDO('mysql:host=localhost;dbname=my_app;charset=utf8mb4', 'root', '123456');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 查询
$stmt = $pdo->query('SELECT id, username FROM users');

while ($row = $stmt->fetch()) {
    echo $row['username'] . "<br>";
}

// 获取单行
$id = 1;
$stmt = $pdo->query("SELECT * FROM users WHERE id = $id");
$user = $stmt->fetch();
Note

上面的 query() 示例直接将变量拼入 SQL,仅用于演示。实际开发必须使用预处理语句防止注入。


5. PDO 与 mysqli 对比

特性PDOmysqli
多数据库支持仅 MySQL
预处理语句
面向对象是(也支持过程式)
事务支持
存储过程
Note

两种扩展各有优势,不存在谁绝对优于谁。选择依据是项目需求:只用 MySQL 时两者皆可,需要兼容多种数据库时选 PDO。详见第 48 章。


小结

PDO 提供了统一、安全的数据库访问层。掌握 DSN 格式和错误模式配置后,配合预处理语句,就能写出健壮的数据库代码。


来源:参考了 php-the-right-way「PDO Extension」、PHP 官方文档,改写后所得。