使用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 实例时传入的选项直接影响行为和安全性:
立即学习“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启用持久连接(注意配合连接池与超时管理)