在PHP中连接MySQL数据库服务器,优先用PDO或mysqli扩展,准备好主机、端口、库名、用户名、密码,建立连接后捕获异常并设置字符集,就能执行SQL。 真正影响成败的通常不是代码本身,而是扩展是否开启、账号权限、网络端口和字符集这些细节。
怎么在PHP中连接MySQL数据库服务器:先搞清连接方式和前提
PHP连接MySQL不是单一函数,而是一套组合动作,你需要让PHP进程找到MySQL服务,拿到合法身份,再通过协议发送SQL,MySQL默认监听3306端口,PHP端常用PDO或mysqli扩展,两者都能完成连接,但适用场景不同。
环境检查:PHP扩展和MySQL服务是否就绪
先别急着写代码,很多“连不上”其实是环境没准备好。
- 查看PHP已加载的数据库扩展:
php -m | grep -E 'mysqli|pdo_mysql' - 查看PHP版本和配置文件路径:
php -v、php --ini - 确认MySQL服务运行:Linux用
systemctl status mysql,Windows在服务管理器查看。 - 检查配置文件,php.ini中需取消注释:
extension=mysqli、extension=pdo_mysql。 - 如果使用宝塔、phpstudy、XAMPP,面板里一般有“安装扩展”入口,路径和命令行环境可能不同。
PHP官方手册明确说明,PDO_MYSQL是PDO的MySQL驱动,mysqli则专门面向MySQL,扩展没开,代码写得再漂亮也会报“Class not found”或“could not find driver”。
PHP连接MySQL数据库用mysqli还是PDO好
这个问题没有绝对答案,但可以从项目需求判断。
| 对比项 | mysqli | PDO |
|---|---|---|
| 支持数据库 | 仅MySQL | 多种数据库 |
| 预处理 | 支持 | 支持,命名参数更灵活 |
| 异常模式 | 需配置,PHP 8.1+默认更严格 | 可设ERRMODE_EXCEPTION |
| 学习成本 | 只学MySQL较直接 | DSN写法统一,迁移方便 |
| 推荐场景 | 老项目、纯MySQL、团队熟悉 | 新项目、需要抽象层、重视可维护性 |
业内专家指出,生产环境应优先使用预处理语句,避免把用户输入拼进SQL,新项目用PDO更省心;如果只连MySQL且已有mysqli代码,继续用mysqli也没问题。
最小可用连接代码:mysqli与PDO各一段
mysqli面向对象写法:
$mysqli = new mysqli('127.0.0.1', 'app_user', '强密码', 'app_db', 3306);
$mysqli->set_charset('utf8mb4');
$result = $mysqli->query('SELECT id, name FROM users LIMIT 5');
while ($row = $result->fetch_assoc()) {
echo $row['name'];
}
$mysqli->close();
PDO写法:
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=app_db;charset=utf8mb4';
$pdo = new PDO($dsn, 'app_user', '强密码', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
$stmt = $pdo->prepare('SELECT id, name FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();
注意utf8mb4,它能存emoji和更多字符,只写utf8在部分MySQL版本里是“不完全UTF-8”,容易出乱码。
PHP连接远程MySQL数据库失败怎么办:权限、网络与安全组
本地连接成功,远程却失败,问题通常集中在三处:MySQL账号不允许远程、网络端口不通、云平台安全组没放行,按顺序排查,比反复改代码有效。
检查MySQL用户授权和host限制
MySQL用户由“用户名@主机”共同定义。app_user@localhost只能本机登录,远程连接会报1045。
登录MySQL后执行:
CREATE USER 'app_user'@'%' IDENTIFIED BY '强密码'; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db. TO 'app_user'@'%'; FLUSH PRIVILEGES;
生产环境不建议长期用,可以改成'app_user'@'10.0.0.5',只允许应用服务器内网IP。
检查bind-address、防火墙和云服务器安全组
MySQL可能只监听127.0.0.1,编辑配置文件,常见路径是/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address,改为0.0.0或指定内网IP,改完重启:
sudo systemctl restart mysql
然后检查系统防火墙,Ubuntu可用sudo ufw allow from 应用服务器IP to any port 3306,云服务器还要看安全组入方向规则,北京地区的PHP项目连接云MySQL数据库时,通常优先走内网地址,延迟更低,也少暴露公网端口。
常见报错与排查路径
SQLSTATE[HY000] [2002] Connection refused:服务没启动、端口不通、bind-address限制。SQLSTATE[28000] [1045] Access denied:用户名、密码、host权限不匹配。caching_sha2_password认证失败:旧PHP的mysqlnd可能不支持MySQL 8默认插件,升级PHP或调整认证方式,长期方案是升级客户端。localhost与0.0.1不同,PDO中host=localhost可能走Unix socket,host=127.0.0.1走TCP,远程连接统一写IP或域名。
本地PHP环境连接MySQL数据库的步骤与不同场景
本地PHP环境连接MySQL数据库的步骤
本地开发最常见的是集成环境,XAMPP、phpstudy、MAMP、Docker都行。
- 启动MySQL服务,确认端口是3306。
- 用phpMyAdmin或命令行创建数据库:
CREATE DATABASE app_db DEFAULT CHARACTER SET utf8mb4; - 创建专用账号,不要直接用root跑应用。
- PHP连接参数:主机
0.0.1,端口3306,库名app_db。 - 如果PHP跑在Docker里,MySQL在宿主机,主机名可能不是localhost,而是
host.docker.internal或宿主机内网IP。
云服务器与容器场景的配置重点
容器里连接另一个MySQL容器,主机名用服务名,比如Docker Compose中MySQL服务叫mysql,PHP的DSN就写host=mysql,前提是它们在同一个自定义网络,用默认bridge网络时,服务名解析可能失效。
云数据库通常提供内网地址和白名单,把应用服务器内网IP加入白名单,开启SSL后,PDO DSN可加ssl_ca等参数,连接串不要写死在代码里,放进环境变量。
虚拟主机PHP连接MySQL数据库要多少钱
虚拟主机方案通常已经包含MySQL数据库,费用随空间大小、流量、数据库数量变化,入门套餐年费可能较低,独立云数据库则按实例规格、存储、备份和时长计费,若只是个人博客或小型展示站,虚拟主机够用,若涉及高并发、事务和远程访问,云数据库或自建云服务器更合适,价格不是唯一指标,连接数、备份、内网延迟更影响体验。
让连接更稳:字符集、异常处理、预处理与生产建议
行业共识认为,数据库密码不应写进公开仓库,用.env、配置中心或云密钥管理,Web目录下不要放含密码的PHP文件。
字符集统一为utf8mb4
连接后执行SET NAMES utf8mb4,或PDO DSN写charset=utf8mb4,mysqli用set_charset('utf8mb4'),数据库、表、字段也统一,否则中文、emoji、特殊符号可能乱码。
用预处理抵挡SQL注入
不要写"SELECT FROM users WHERE id = " . $_GET['id'],用:
$stmt = $pdo->prepare('SELECT FROM users WHERE id = ?');
$stmt->execute([$id]);
mysqli也支持prepare和bind_param。PDO::ATTR_EMULATE_PREPARES => false可让MySQL执行真正的预处理,通常更安全。
配置异常处理与超时
PDO设置PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,用try-catch捕获PDOException,mysqli在PHP 8.1+默认错误模式更严格,也可显式设置mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);,设置连接超时,避免页面卡死。
连接生命周期与性能
PHP-FPM通常每个请求新建连接,请求结束释放,持久连接能减少握手,但可能占用MySQL连接数,使用不当会拖垮数据库,优先优化SQL索引、减少查询次数,连接数上限、max_connections、wait_timeout要结合业务调整。
怎么在PHP中连接MySQL数据库服务器常见问题
PDO连接MySQL和mysqli连接MySQL能同时开吗?
能,它们是独立扩展,同一项目不同模块可以分别使用,但同一业务层最好统一,避免维护两套错误处理和连接配置。
PHP连接MySQL数据库失败提示2002怎么排查?
先确认MySQL进程存在,再用telnet 主机 3306或nc -vz 主机 3306测端口,端口不通就查bind-address、系统防火墙、云安全组,端口通但报1045,再查账号host和密码。
PHP 8连接MySQL 8报认证错误怎么办?
MySQL 8默认常用caching_sha2_password,PHP需使用较新的mysqlnd驱动,升级PHP和MySQL客户端库是首选,临时可改用户认证插件,但长期看升级环境更稳妥,确认php -i | grep mysqlnd能看到mysqlnd信息。
结论很直接:用PDO或mysqli建立连接,设置utf8mb4和异常模式,远程访问时打通账号权限与网络端口,再用预处理执行SQL。 把这几步做扎实,PHP连接MySQL数据库服务器就不再是反复踩坑的环节。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/761977.html





