跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何用PDO连接MySQL_php中pdo连接数据库的正确方法【教程】

PHP中不存在pdo_connect()函数,必须使用new PDO()实例化连接,正确设置DSN、启用pdo_mysql扩展、配置ERRMODE_EXCEPTION错误模式及charset=utf8mb4字符集。 pdo\_connect() 不存在,别再搜这个函数名了 PHP 里根本没有
pdo_connect()
这个函数——这是初学者最常卡住的第一步。PDO 是一个类库,不是一组过程式函数;连接数据库必须实例化
PDO
类,而不是调用某个“连接函数”。 常见错误现象:
Fatal error: Uncaught Error: Call to undefined function pdo_connect()
,或者搜到一堆过时的博客抄来就报错。 正确入口只有
new PDO()
,它接收 DSN 字符串、用户名、密码三个核心参数 DSN 格式必须严格:
mysql:host=localhost;dbname=test;charset=utf8mb4
,漏掉
charset=utf8mb4
很容易存中文变问号 MySQL 8.0+ 默认用
caching_sha2_password
认证插件,老版本 PHP(如 7.2)可能连不上,得在 MySQL 侧改用户认证方式或升级 PHP 连接失败时只看到 “could not find driver”,但你其实没装对扩展
could not find driver
看起来像配置问题,实际大概率是
pdo_mysql
扩展根本没启用,或者启用了却对应错了 PHP SAPI(比如 CLI 和 Web 用的不是同一个 php .ini)。 使用场景:本地开发用 XAMPP/MAMP/PHP内置服务器,上线到 Linux 主机,都可能遇到这个提示。 立即学习 “ PHP免费学习笔记(深入) ”; 先运行
php -m | grep pdo
(命令行),确认
pdo
和
pdo_mysql
都在输出里 Web 环境下访问
phpinfo()
页面,搜索 “PDO Driver for MySQL”,看是否显示 “enabled” Ubuntu/Debian 用户容易只装
php-mysql
,但它默认提供的是旧的
mysqlnd
过程式扩展,要额外装
php-pdo
和
php-mysqlnd
设置 ATTR\_ERRMODE = ERRMODE\_EXCEPTION 不是可选项,是必做动作 默认情况下 PDO 出错只返回
false
,不抛异常。这意味着
$pdo = new PDO(...)
即使失败你也察觉不到,后续
query()
才崩,堆栈还找不到源头。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 性能影响几乎为零,但能立刻暴露连接参数错误、数据库不可达、权限不足等真实问题。 必须在 new PDO() 后立刻设置:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
不要写成
PDO::ERRMODE_SILENT
或
PDO::ERRMODE_WARNING
,它们会让你在生产环境默默丢数据 如果用 PDO 的预处理语句(应该用),这个设置还能让
execute()
失败时直接 throw,不用每次都手动检查返回值 charset=utf8mb4 要写在 DSN 里,而不是靠 SET NAMES 很多人在
new PDO()
之后执行
$pdo->exec("SET NAMES utf8mb4")
,这看似可行,但在某些并发或长连接场景下会失效——比如连接被复用时,字符集状态可能被污染。 MySQL 服务端、客户端、连接层三者字符集必须对齐,否则存取中文、emoji 都会出问题。 DSN 中必须包含
charset=utf8mb4
,例如:
mysql:host=127.0.0.1;dbname=test;charset=utf8mb4
确保 MySQL 配置文件(my.cnf)中
[client]
和
[mysqld]
段都设了
default-character-set = utf8mb4
和
collation-server = utf8mb4_unicode_ci
表和字段的字符集也要是
utf8mb4
,光连对了没用;用
SHOW CREATE TABLE xxx
检查,别信 phpMyAdmin 界面显示 真正麻烦的从来不是写那几行 new PDO,而是 DSN 里的细节、扩展是否真加载、错误模式是否生效、字符集是否穿透到底层——这些地方一漏,问题就藏得深,日志里还不报得明白。

相关文章