PHP 数据库连接:PDO 初学者指南(MySQL 与 PostgreSQL)
发布: (2026年2月4日 GMT+8 13:26)
4 min read
原文: Dev.to
Source: Dev.to
为什么选择 PDO 而不是 mysqli?
在 PHP 中连接数据库主要有两种方式:mysqli 和 PDO。
现代 PHP 开发强烈推荐使用 PDO。最大的优势在于 PDO 充当数据库抽象层。这意味着无论使用哪种数据库,你都可以使用相同的代码结构。
- 如果以后决定从 MySQL 切换到 PostgreSQL,只需稍微修改一下连接字符串(DSN)。
mysqli只能用于 MySQL。- 掌握 PDO 让你成为更通用、更具前瞻性的开发者。
使用 PDO 连接 MySQL
基本连接脚本
getMessage();
exit();
}
?>
关键概念
- DSN(数据源名称) – 包含数据库信息的字符串。始终指定
charset=utf8mb4以避免安全问题。 - try‑catch 块 – 将连接代码放在
try‑catch中,以优雅地处理PDOException。 - 安全提示 – 在生产环境中切勿直接显示
$e->getMessage(),它可能泄露敏感信息。
专业人士必备的“选项设置”
你可以通过将 options 数组 作为 new PDO 的第四个参数来自定义 PDO 的行为。
PDO::ERRMODE_EXCEPTION,
// Return results as an associative array by default
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// Disable prepared statement emulation for better security
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$dbh = new PDO($dsn, $user, $password, $options);
echo "Connected with optimized settings!";
} catch (PDOException $e) {
error_log($e->getMessage()); // Log details instead of displaying them
}
?>
ATTR_ERRMODE– 确保任何 SQL 错误都会触发异常,便于捕获。ATTR_DEFAULT_FETCH_MODE–FETCH_ASSOC返回干净的关联数组,节省内存。ATTR_EMULATE_PREPARES– 将其设为false强制 PDO 使用数据库原生的预处理语句,安全性更高。
连接 PostgreSQL
代码结构保持不变,只需更改 DSN 前缀。
故障排查清单
如果遇到类似 SQLSTATE[...] 的错误,请检查以下事项:
- 凭据 – 确认数据库名、用户名或密码没有拼写错误。
- 主机和端口 – 对于 Docker 容器或远程服务器,
localhost可能无效。确认正确的端口(MySQL 3306,PostgreSQL 5432)以及任何自定义设置。 - 驱动 – 确保在
php.ini中已启用相应的 PDO 驱动(pdo_mysql或pdo_pgsql)。使用phpinfo()检查。 - localhost 与 127.0.0.1 – 在 Linux/macOS 上,
localhost会尝试使用套接字连接。切换为127.0.0.1可强制使用 TCP/IP 连接,往往能解决连接问题。
结论
PDO 是 PHP 数据库交互的黄金标准。通过掌握 DSN 结构 并使用 正确的异常处理,你可以编写安全、可移植且专业级的代码,能够在多个数据库系统之间无缝工作。