第一反应是pdo_mysql扩展未启用;必须同时启用pdo和pdo_mysql,检查php -m | grep pdo或pdo::getavailabledrivers(),dsn需显式指定port=3306和charset=utf8mb4,禁用模拟预处理并设errmode为exception。

确认pdo_mysql扩展已启用
连接失败的第一反应不是代码写错了,而是扩展根本没加载。PHP 7.0+ 中 mysql_connect 已彻底移除,pdo 和 pdo_mysql 必须同时启用。
检查方式:
- 运行
php -m | grep pdo,应同时看到pdo和pdo_mysql - 或执行
php -r "print_r(PDO::getAvailableDrivers());",输出中必须含mysql - Windows 用户检查
php.ini是否有未注释的extension=pdo和extension=pdo_mysql - Linux/Mac 用户注意扩展路径是否正确,部分编译安装环境需手动指定
extension_dir
常见坑:只启用了 pdo 却漏掉 pdo_mysql,此时 new PDO() 会报 PDOException: could not find driver。
DSN 字符串必须显式指定 charset 和 port
不写 charset=utf8mb4,中文存入可能变问号;不写 port=3306,当 MySQL 实际监听非默认端口(如 Docker 或云数据库)时会静默连接超时或连错实例。
正确写法示例:
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4';
关键点:
- 用单引号包裹整个 DSN,避免变量解析干扰
- 主机推荐用
127.0.0.1而非localhost(后者在某些系统会走 Unix socket,行为不一致) -
charset=utf8mb4是必须项,不是可选优化;utf8在 MySQL 中实际是utf8mb3,不支持 emoji 和部分生僻字 - 不要把用户名密码拼进 DSN —— 错误写法:
"mysql:host=...;user=root;pass=123",这会导致认证失败或安全泄露
必须设置 ATTR_ERRMODE 为 EXCEPTION
PDO 默认错误模式是 PDO::ERRMODE_SILENT,SQL 错误不会报错,只会返回 false,极易掩盖问题。不设异常模式,prepare() 失败你都收不到提示。
正确配置顺序:
$pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
注意:
-
setAttribute()必须在new PDO()之后、任何查询之前调用 -
PDO::ATTR_EMULATE_PREPARES => false强制使用真实预处理,防止绕过类型检查导致的注入风险 - 生产环境严禁在
catch中直接echo $e->getMessage(),应记录日志并返回通用错误提示
用户名密码必须是字符串字面量或已定义变量
写成 new PDO($dsn, username, password)(无引号)是典型错误:PHP 把 username 当作常量,未定义就报 Use of undefined constant username,接着把字面量 'username' 当账号传给 MySQL,必然触发 Access denied for user 'username'@'localhost'。
安全写法只有两种:
- 字符串字面量:
new PDO($dsn, 'root', 'my_pass_123') - 已定义变量:
$user = 'root'; $pass = 'my_pass_123'; new PDO($dsn, $user, $pass)
更稳妥的做法是抽离到配置文件(如 config.php),用 return ['host' => ..., 'user' => ...]; 方式加载,避免硬编码和 Git 泄露风险。
字符集、端口、错误模式、凭据传递方式——这四点任一缺失,都会让连接看似“成功”实则脆弱或不可靠。尤其 ATTR_EMULATE_PREPARES 和 charset=utf8mb4,线上出问题时最难排查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











