PHP 数据库连接:PDO 初学者指南(MySQL 与 PostgreSQL)

发布: (2026年2月4日 GMT+8 13:26)
4 min read
原文: Dev.to

Source: Dev.to

为什么选择 PDO 而不是 mysqli?

在 PHP 中连接数据库主要有两种方式:mysqliPDO

现代 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_MODEFETCH_ASSOC 返回干净的关联数组,节省内存。
  • ATTR_EMULATE_PREPARES – 将其设为 false 强制 PDO 使用数据库原生的预处理语句,安全性更高。

连接 PostgreSQL

代码结构保持不变,只需更改 DSN 前缀。

故障排查清单

如果遇到类似 SQLSTATE[...] 的错误,请检查以下事项:

  • 凭据 – 确认数据库名、用户名或密码没有拼写错误。
  • 主机和端口 – 对于 Docker 容器或远程服务器,localhost 可能无效。确认正确的端口(MySQL 3306,PostgreSQL 5432)以及任何自定义设置。
  • 驱动 – 确保在 php.ini 中已启用相应的 PDO 驱动(pdo_mysqlpdo_pgsql)。使用 phpinfo() 检查。
  • localhost 与 127.0.0.1 – 在 Linux/macOS 上,localhost 会尝试使用套接字连接。切换为 127.0.0.1 可强制使用 TCP/IP 连接,往往能解决连接问题。

结论

PDO 是 PHP 数据库交互的黄金标准。通过掌握 DSN 结构 并使用 正确的异常处理,你可以编写安全、可移植且专业级的代码,能够在多个数据库系统之间无缝工作。

原始发布地址: https://code-izumi.com/php/database-connection/

Back to Blog

相关文章

阅读更多 »