php数据库连接需选对扩展(pdo适配多库,mysqli轻量)、传准参数(dsn或构造函数不带dbname建库)、及时验证并设utf8mb4字符集,否则后续操作易失败且报错模糊。

PHP 创建数据库连接不是“连上就行”,关键在于选对扩展、传对参数、及时验证,否则后续所有查询都会失败且报错模糊。
用 PDO 还是 MySQLi?看项目是否要换数据库
如果只用 MySQL,MySQLi 足够轻量;但只要未来可能切 PostgreSQL 或 SQLite,必须用 PDO——它统一接口,避免重写全部数据访问层。
-
PDO的 DSN 字符串必须包含host和dbname(创建库时可省略dbname,但连接后必须显式选择) -
MySQLi面向对象方式更推荐,new mysqli($host, $user, $pass)不带库名才能创建新库;带库名会直接尝试连接并选择该库,若库不存在就报错 -
PDO默认不抛异常,必须手动加$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION),否则CREATE DATABASE失败也不会触发catch
mysqli_connect() 连接失败的常见原因
错误信息里出现 Connection refused 或 Access denied 时,大概率不是代码问题,而是环境配置没对。
- MySQL 服务没启动:
systemctl status mysql或brew services list | grep mysql - 端口被改过但 PHP 没同步:默认是
3306,Docker 环境常映射为其他端口,需在mysqli_connect()第四个参数指定$port - 用户权限不足:root 用户能建库,但普通用户默认无
CREATE DATABASE权限,需先用 root 执行GRANT CREATE ON *.* TO 'user'@'host' - 本地连接用
127.0.0.1而非localhost:后者在 Linux 下可能走 socket,前者走 TCP,权限判断逻辑不同
创建数据库前必须先断开当前库上下文
用 MySQLi 创建库时,不能在连接字符串里带 dbname;用 PDO 也一样——DSN 中写了 dbname=testdb 却想建 newdb,会直接报错“Unknown database 'testdb'”。
-
MySQLi正确写法:$conn = new mysqli('localhost', 'root', 'pass');(不传第四个参数) -
PDO正确写法:$pdo = new PDO('mysql:host=localhost', $user, $pass);(DSN 里不写dbname) - 执行
CREATE DATABASE IF NOT EXISTS mydb后,必须再调一次$conn->select_db('mydb')或重新 new 一个带dbname的PDO实例,才能开始建表
字符集和持久连接不是可选项,是易踩坑点
中文乱码、emoji 插入失败、连接突然中断……这些问题八成出在初始化阶段漏了这两步。
- 字符集必须在连接建立后立刻设置:
mysqli_set_charset($conn, 'utf8mb4')(注意是utf8mb4,不是utf8);PDO则要在 DSN 里加;charset=utf8mb4 - 持久连接(
PDO::ATTR_PERSISTENT => true)不能在setAttribute()里动态开启,必须塞进构造函数的第四个参数数组里,否则无效 - 持久连接下,事务、临时表、用户变量不会自动清理,多个请求复用同一连接时可能互相污染——高并发场景下建议关掉
真正麻烦的不是写不出第一行连接代码,而是连接后没验证、建库后没选库、字符集设错还查不出源,最后在 INSERT 时报一堆“Incorrect string value”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











