应使用 mysqli 或 pdo 连接 mysql,mysql_connect() 已被 php 7.0+ 彻底移除;mysqli_connect() 需检查返回值并设置 utf8mb4 字符集,pdo 则需启用异常模式与正确 dns 配置。

PHP 连接 MySQL 数据库,现在应该用 mysqli 或 PDO,mysql_connect() 已被彻底移除(PHP 7.0+ 不再支持),硬写会直接报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
用 mysqli_connect() 建立基础连接
这是最直接的面向过程写法,适合快速验证或简单脚本。注意它默认不启用持久连接,每次请求都会新建 TCP 连接。
常见错误是忽略返回值判断,导致后续查询失败却找不到原因:
$conn = mysqli_connect('localhost', 'user', 'pass', 'db_name', 3306);
if (!$conn) {
die('连接失败:' . mysqli_connect_error()); // 必须检查!
}
- 第 4 个参数(数据库名)可为空,但后续必须用
mysqli_select_db()切换 - 端口参数(第 5 个)不填则用默认 3306;若 MySQL 在 Docker 或远程服务器上,务必显式传入
- 连接后建议立刻执行
mysqli_set_charset($conn, 'utf8mb4'),否则中文可能乱码
用 PDO 连接并开启异常模式
PDO 更灵活,支持多种数据库,且能统一处理错误。关键点在于开启 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则 new PDO() 即使失败也不会抛异常,而是静默返回 false。
try {
$pdo = new PDO('mysql:host=localhost;dbname=db_name;charset=utf8mb4', 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
die('连接异常:' . $e->getMessage());
}
- DNS 字符串里的
charset=utf8mb4比在连接后调setCharset更可靠,尤其对 emoji 和四字节 UTF-8 安全 - 不要省略
PDO::ATTR_DEFAULT_FETCH_MODE,否则fetch()默认返回数字索引数组,容易写错键名 - 如果用 Unix socket(如 MAMP、Homebrew MySQL),host 改成
unix_socket=/tmp/mysql.sock,不能写 localhost
连接失败时怎么快速定位问题
不是代码写错,而是环境或权限问题——这是绝大多数“连不上”的真实原因。
- 先在命令行运行
mysql -h localhost -u user -p,确认账号密码和网络可达性 - 检查 MySQL 是否监听外部 IP:
sudo netstat -tlnp | grep :3306;若只显示127.0.0.1:3306,远程 PHP 就连不上 - 确认用户权限:登录 MySQL 后执行
SELECT host, user FROM mysql.user;,确保对应用户 host 是%或具体 IP,而非localhost(Unix socket 专用) - SELinux 或防火墙(如 ufw)可能拦截 3306 端口,临时关闭测试一下
连接本身只是第一步,真正容易出问题的是字符集配置、超时设置、以及长连接场景下的连接复用管理——这些不在 mysqli_connect() 或 new PDO() 调用里体现,但直接影响后续所有查询行为。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











