connection refused错误表明php根本未触达mysql进程,主因是mysql未监听指定地址端口组合;需先验证mysql -h 127.0.0.1 -p 3306 -u root -p是否可登录,xampp中应改localhost为127.0.0.1强制tcp连接,并检查my.ini端口与bind-address配置及端口占用。

mysqli_connect() 报 Connection refused,先别改 PHP 代码
这不是 PHP 写错了,是请求压根没触达 MySQL 进程。90% 的情况是 MySQL 没监听你写的那个地址+端口组合。XAMPP 默认用 3306,但实际可能被占、被改、或根本没启动。
- 先在命令行跑:
mysql -h 127.0.0.1 -P 3306 -u root -p—— 能进命令行,说明服务在跑且端口通;进不去就停在这里排查 - Windows 下打开 XAMPP 控制面板,确认 MySQL 行状态是绿色“Running”,不是灰色或红色
- 如果控制面板显示 MySQL 启动失败,直接看
xampp\mysql\data\mysql_error.log,比猜快得多
localhost 和 127.0.0.1 在 XAMPP 里行为完全不同
PHP 用 localhost 会走 Unix socket(Windows 上是命名管道),而 XAMPP for Windows 默认不启用 socket 通信,只监听 TCP。结果就是:写 localhost → 连 socket → 失败 → 报 Connection refused。
- 强制走 TCP:把
mysqli_connect('localhost', ...)改成mysqli_connect('127.0.0.1', ...) - 不要依赖 DNS 解析:避免写
mysqli_connect('myserver.local', ...),本地开发一律用127.0.0.1 - phpMyAdmin 配置也要同步改:检查
xampp\phpMyAdmin\config.inc.php里的$cfg['Servers'][$i]['host']是否为'127.0.0.1'
XAMPP 的 my.ini 可能被悄悄改过
XAMPP 自带的 my.ini 一旦被手动编辑出错(比如多了一个空格、少了括号、端口写成字符串),MySQL 就会静默启动失败——控制面板仍显示“Running”,但实际进程已退出。
- 路径一般是:
xampp\mysql\bin\my.ini(不是etc\下那个) - 重点核对两行:
port=3306(不能带引号,不能是port = "3306")和bind-address=127.0.0.1(不是localhost) - 如果改过配置,必须重启整个 XAMPP 控制面板,只点“Stop”再“Start” MySQL 不生效
- 临时验证:把
my.ini重命名为my.ini.bak,再启动 MySQL —— 如果成功,说明原配置有问题
端口冲突是 XAMPP 最常见的硬伤
Skype、另一套 XAMPP、MariaDB、甚至某些国产软件会抢 3306。XAMPP 启动时发现端口被占,不会报错,而是直接放弃监听 —— 所以你看到服务“运行中”,其实是假象。
- Windows 管理员命令行执行:
netstat -ano | findstr :3306,看 PID 是谁占的 - 查进程名:
tasklist | findstr "PID号"(把 PID号 替换成上一步结果) - 杀掉它:
taskkill /F /PID PID号;或者改 XAMPP 端口:在my.ini里把port=3306改成port=3307,然后 PHP 连接时必须显式传第 5 个参数:mysqli_connect('127.0.0.1', 'root', '', 'test', 3307)











