跳转到主内容
极星编程网:以代码为星,赴技术山海!

phpEnv安装PDO_MySQL教程 phpEnv数据库驱动配置

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

相关文章