使用PDO连接MySQL需正确配置DSN、设置PDO::ATTR_ERRMODE为PDO::ERRMODE_EXCEPTION以启用异常,显式指定端口与utf8mb4字符集,用户名密码独立传参,用try-catch捕获PDOException,并推荐设置FETCH_ASSOC、禁用预处理模拟及权限最小化与密码外置。

使用 PDO 连接 MySQL 是 PHP 中安全、灵活且推荐的方式。关键在于正确配置 DSN、设置错误模式,并妥善处理异常。
基础连接与错误处理
PDO 默认不抛出异常,需手动设置 PDO::ATTR_ERRMODE 为 PDO::ERRMODE_EXCEPTION,否则 SQL 错误可能静默失败。
- DSN 格式:`mysql:host=127.0.0.1;port=3306;dbname=testdb;charset=utf8mb4`(推荐显式指定端口和字符集)
- 用户名、密码作为独立参数传入,避免拼接进 DSN
- 用 try-catch 包裹 new PDO(),捕获 PDOException 并记录或提示
完整可运行示例
以下代码可直接保存为 db.php 运行(请按实际修改主机、库名、账号密码):
<?php
$host = '127.0.0.1';
$port = 3306;
$dbname = 'testdb';
$username = 'root';
$password = '';
$charset = 'utf8mb4';
$dsn = "mysql:host={$host};port={$port};dbname={$dbname};charset={$charset}";
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
echo "✅ 连接成功<br>";
// 示例查询
$stmt = $pdo->query("SELECT VERSION() as version");
$row = $stmt->fetch();
echo "MySQL 版本:" . htmlspecialchars($row['version']);
} catch (PDOException $e) {
echo "❌ 连接失败:" . htmlspecialchars($e->getMessage());
}
?>
连接后常用设置说明
构造 PDO 实例时传入的选项直接影响行为和安全性:
Difeye是一款超轻量级PHP框架,主要特点有: Difeye是一款超轻量级PHP框架,主要特点有: ◆数据库连接做自动主从读写分离配置,适合单机和分布式站点部署; ◆支持Smarty模板机制,可灵活配置第三方缓存组件; ◆完全分离页面和动作,仿C#页面加载自动执行Page_Load入口函数; ◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例
立即学习“PHP免费学习笔记(深入)”;
-
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC:让fetch()默认返回关联数组,省去写PDO::FETCH_ASSOC -
PDO::ATTR_EMULATE_PREPARES => false:禁用预处理模拟,强制使用 MySQL 原生预处理,防止部分 SQL 注入绕过 -
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4":旧版本 PHP 可额外加此选项确保字符集生效(新版本通常 DSN 中 charset 已足够)
生产环境建议
上线前注意几个易忽略但关键的点:
- 数据库账号权限最小化(如只授予所需表的 SELECT/INSERT 权限,避免 root)
- 密码不硬编码,改用环境变量(
$_ENV['DB_PASSWORD'])或配置文件(并禁止 Web 直接访问) - 连接后执行
$pdo->exec("SET time_zone = '+00:00'")统一时区,避免时间字段偏差 - 长连接场景下,可设置
PDO::ATTR_PERSISTENT => true启用持久连接(注意配合连接池与超时管理)










