php 8.5 连 mysql 必须用 pdo,需启用 pdo_mysql 扩展、dsn 显式指定 charset=utf8mb4、密码 urlencode() 转义、并 setattribute 设置 errmode_exception。

PHP 8.5 连 MySQL 必须用 PDO,不是 mysql_connect 或 mysqli 默认驱动
PHP 8.5 已彻底移除 ext/mysql(早被废弃),mysqli 虽可用但非 PDO 默认底层;PDO 是唯一支持统一接口、预处理防注入、多数据库切换的方案。不配对 PDO 和 pdo_mysql 扩展,new PDO() 会直接报 PDOException: could not find driver。
-
pdo_mysql必须在php.ini中启用:extension=pdo_mysql(Linux/macOS)或extension=php_pdo_mysql.dll(Windows) - 检查是否生效:运行
php -m | grep pdo,输出应含pdo和pdo_mysql - 若用 Docker,基础镜像如
php:8.5-cli默认不含pdo_mysql,需手动docker-php-ext-install pdo_mysql
PDO::__construct() 的 DSN 写法不能漏 charset=utf8mb4
MySQL 默认字符集是 latin1,不显式声明会导致中文乱码、emoji 插入失败,且错误不报在连接阶段,而是在 INSERT 或 SELECT 时静默截断或报错 Incorrect string value。
- 正确 DSN 示例:
mysql:host=localhost;dbname=testdb;charset=utf8mb4 - 不要写成
utf8—— MySQL 的utf8实际是utf8mb3,不支持 4 字节 Unicode(如大部分 emoji) - 如果已在 MySQL 配置中全局设了
collation-server = utf8mb4_unicode_ci,DSN 里仍要写charset=utf8mb4,PDO 不读取服务端默认值 - 连接后执行
$pdo->exec("SET NAMES utf8mb4")是冗余且不可靠的,DSN 指定才是唯一有效方式
密码为空或含特殊字符时,PDO 构造函数参数必须用 urlencode()
DSN 是 URL 风格字符串,密码里含 @、/、:、? 等字符会导致解析错位,比如 host=user:pa@ss@localhost 会被截成用户 user、密码 pa、主机 ss@localhost。
Difeye是一款超轻量级PHP框架,主要特点有: Difeye是一款超轻量级PHP框架,主要特点有: ◆数据库连接做自动主从读写分离配置,适合单机和分布式站点部署; ◆支持Smarty模板机制,可灵活配置第三方缓存组件; ◆完全分离页面和动作,仿C#页面加载自动执行Page_Load入口函数; ◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例
- 安全写法:对
$password单独做urlencode($password),再拼进 DSN - 示例:
$dsn = "mysql:host={$host};dbname={$db};charset=utf8mb4"; $pdo = new PDO($dsn, $user, urlencode($pass)); - 空密码不是异常场景,但必须传空字符串
"",不能传null,否则触发TypeError - 不建议把密码硬编码进 DSN 字符串拼接(如
"...password={$pass}..."),极易因未转义崩掉
连接失败时,PDO 默认不抛异常,得手动设 PDO::ATTR_ERRMODE
默认情况下,PDO 出错只返回 false,不抛 Exception,容易让错误被忽略,尤其在调试阶段看不到真实报错信息。
立即学习“PHP免费学习笔记(深入)”;
- 必须在构造后立刻设置:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - 否则
$pdo->query("SELECT * FROM nonexistent")只返回false,不提示表不存在 - 这个设置不能通过 DSN 或构造参数完成,只能调用
setAttribute() - 如果项目用了框架(如 Laravel),它通常已帮你设好;纯手写脚本时,这一步常被跳过,导致排查困难
PDO 连接本身不难,真正卡住人的永远是扩展没启、字符集没对、密码没转义、错误模式没开——四个点里漏一个,就只能看到黑屏或 500,连具体哪行错都看不到。










