MySQL服务是否正常运行需依次验证:1. systemctl status mysql显示active (running);2. php -m确认mysqli扩展已启用;3. mysql -h 127.0.0.1 -u root -p成功登录;4. ss -tuln | grep :3306确认3306端口监听;5. mysqli_connect_error()获取具体错误。

systemctl status mysql 看服务有没有真跑起来
PHP 连不上,第一反应不是改代码,而是确认 MySQL 进程到底在不在。很多“连接失败”本质是服务压根没启动,mysqli_connect() 返回 false 只是结果,不是原因。
Linux/macOS 下直接执行:
sudo systemctl status mysql或
sudo systemctl status mariadb(取决于你装的是哪个)。看到 active (running) 才算过关;如果显示 inactive (dead) 或 failed,立刻:sudo systemctl start mysql并顺手设开机自启:
sudo systemctl enable mysql
- Debian/Ubuntu 用户若用
apt install mysql-server装的,服务名可能是mysql;若用mariadb-server,就查mariadb - macOS 用 Homebrew 安装的,常用
brew services list查状态,启动用brew services start mysql - Windows 用户打开
services.msc,找名字含MySQL或MariaDB的服务,右键“启动”,并双击属性把“启动类型”设为“自动”
php -m | grep -i mysqli 确认 PHP 认不认识这个扩展
服务跑着,但 PHP 没加载 mysqli 或 PDO MySQL 扩展,照样连不上。这不是配置问题,是 PHP 根本没能力发起连接请求。
终端运行:
php -m | grep -i mysqli有输出(比如
mysqli、pdo_mysql)说明已启用;没输出就得动手配:
立即学习“PHP免费学习笔记(深入)”;
- 先查 php.ini 路径:
php --ini,看Loaded Configuration File那行 - 编辑对应
php.ini,确保这行没被注释:extension=mysqli(Linux/macOS)或extension=php_mysqli.dll(Windows) - Debian/Ubuntu 用户如果只装了
php包,常缺驱动:补装sudo apt install php-mysqlnd(比过时的php-mysql更推荐)
mysql -h 127.0.0.1 -u root -p 测试 TCP 层通不通
服务和扩展都 OK,但 PHP 还是连不上?别急着翻 PHP 代码,先用命令行验证底层链路是否通畅。重点用 127.0.0.1,不是 localhost——因为后者在多数系统下会走 Unix socket,而 socket 路径不一致是高频断点。
执行:
mysql -h 127.0.0.1 -P 3306 -u root -p能进,说明 MySQL 监听了 TCP、端口开放、凭据有效;进不去,再查:
- MySQL 是否监听
3306:sudo ss -tuln | grep :3306,没输出就去/etc/mysql/my.cnf检查bind-address = 127.0.0.1或0.0.0.0,别留空或写成127.0.0.1却被防火墙拦住 - 本地防火墙是否放行:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS),确保3306/tcp在白名单里 - Docker 或云环境注意:MySQL 容器若只绑
127.0.0.1,外部 PHP 就连不上,必须设bind-address = 0.0.0.0
mysqli_connect_error() 和 PDO::errorInfo() 必须立刻读,不能靠 var_dump
服务、扩展、TCP 都通了,但 mysqli_connect() 还是返回 false,这时候错误信息才是关键。PHP 不抛异常,只留错误字符串,不主动拿就永远不知道哪错了。
面向过程写法:
$conn = mysqli_connect("127.0.0.1", "root", "pass", "test");<br>if (!$conn) {<br> die("连接失败: " . mysqli_connect_error());<br>}注意:mysqli_connect_error() 是唯一可靠入口,$conn->connect_error 在连接失败时不可靠。
PDO 写法:
try {<br> $pdo = new PDO($dsn, $user, $pass);<br>} catch (PDOException $e) {<br> die("连接失败: " . $e->getMessage());<br>}或不用 try/catch 时,构造后立刻:if (!$pdo) {<br> print_r(PDO::errorInfo());<br>}
常见错误如 Access denied for user 'root'@'localhost',90% 是用户名密码写成了未加引号的常量(比如写成 user 而非 "user"),PHP 把它当常量解析,结果传了个空字符串过去。



















