phpEnv中PDO_MYSQL默认可用,无需编译;启用后需确认php.ini中extension=pdo_mysql未被注释,并在DSN中显式指定charset=utf8mb4及设置PDO::ATTR_EMULATE_PREPARES=>false。
php
Env 里 PDO_MYSQL 扩展默认就可用,不用手动编译
phpEnv 是 Windows 下的集成环境,PHP 和 MySQL 都预编译打包好了。它默认已启用
和
,只要没被你手动注释掉,就无需运行
、
或
——那些是 Linux 源码编译场景才用的。
检查方法很简单:打开 phpEnv 界面 → 点击「PHP 设置」→ 查看「扩展列表」,确认
和
前面的勾是亮的。如果没勾上,点一下启用,phpEnv 会自动修改对应 PHP 版本的
并重启 Apache/Nginx。
常见误区:
• 不要去找
手动复制到
目录
• 不要改
路径——phpEnv 已设好,改错会导致扩展加载失败
• 不需要在
里写
,phpEnv 管理的是
(不带
前缀)
连接 MySQL 时 charset=utf8mb4 必须显式指定
phpEnv 自带的 MySQL 通常是 5.7 或 8.0,默认字符集是
,但 PDO 的 DSN 不会自动继承这个设置。如果只写
,PDO 会用服务器旧版默认值(可能是
或
),导致中文乱码或 emoji 插入失败。
立即学习
“
PHP免费学习笔记(深入)
”;
正确写法必须包含
:
注意:
•
在 MySQL 里实际是
,不支持 4 字节 Unicode(如 ?、?)
•
才是完整 UTF-8 实现
• 不要依赖
替代 DSN 中的 charset,PDO 初始化阶段就该定死
phpEnv 启动后连不上 MySQL:先查服务状态和端口
phpEnv 界面显示「MySQL 已启动」,不代表 MySQL 进程真在监听。常见现象是 PHP 报错:
或
。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
排查顺序如下:
• 打开 phpEnv → 「服务管理」→ 确认 MySQL 行状态是「运行中」,不是「暂停」或「未启动」
• 点击 MySQL 行右侧「配置」→ 查看
中
值(默认 3306,但有时被改成 3307 或其他)
• 在 DSN 中显式加上端口:
• 如果用
替代
,能绕过 Windows 下的命名管道问题(尤其 MySQL 8.0+)
补充:phpEnv 的 MySQL root 密码默认为空,但部分新版安装包会设为
,首次连接失败时可尝试这两个值。
pdo_
mysql
加载成功但 query() 报错:检查 ATTR_EMULATE_PREPARES
扩展加载了,
也不报错,但一执行
就崩,错误信息类似:
。
这通常是因为 MySQLi 或旧版 PDO 驱动残留行为干扰,解决办法是在 PDO 构造参数中强制关闭模拟预处理:
原因:
•
(默认值)会让 PDO 在客户端拼接 SQL,容易触发 MySQL 的 unbuffered query 限制
• 设为
后,PDO 使用真正的服务器端预处理,更安全也更稳定
• phpEnv 的 PHP 版本(如 8.2+)和 MySQL(如 8.0+)完全支持此设置,无需降级兼容
这个开关不起眼,但它是 phpEnv 环境下 PDO 表现不一致的最常见根源——很多人卡在这一步,反复重装扩展,其实只需加一行配置。
pdopdo_mysqlphpizeconfigurepecl installpdopdo_mysqlphp.iniphp_pdo_mysql.dllext/extension_dirphp.iniextension=php_pdo_mysql.dllextension=pdo_mysqlphp_utf8mb4mysql:host=localhost;dbname=testlatin1utf8charset=utf8mb4$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
utf8utf8mb3utf8mb4SET NAMES utf8mb4PDOException: SQLSTATE[HY000] [2002] Connection refusedCan't connect to MySQL server on 'localhost'my.iniportmysql:host=localhost;port=3307;dbname=test;charset=utf8mb4127.0.0.1localhostrootnew PDO()$pdo->query("SELECT ...")SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]);
PDO::ATTR_EMULATE_PREPARES => truefalse