PHP怎么用MySQL连接数据库服务器的核心答案:先确认PHP已启用pdo_mysql或mysqli扩展,再拿到主机、端口、库名、用户名、密码,用PDO或mysqli创建连接,设置utf8mb4字符集并捕获异常,生产环境坚持最小权限和预处理语句。 只要这几步走通,本地、宝塔面板或云服务器上的连接问题都能逐层定位。
PHP怎么用MySQL连接数据库服务器:先理清连接参数
连接前需要准备的四类信息
- 主机地址:本机常用
0.0.1或localhost,云服务器常用内网IP,远程连接才用公网IP。 - 端口:MySQL默认
3306,如果改过端口,PHP连接时必须同步修改。 - 库名与账号:不要拿root账号跑业务,单独建库、单独建用户更稳妥。
- 字符集:推荐
utf8mb4,兼容emoji和更多生僻字。
检查PHP扩展是否可用
在终端执行:
php -m | grep -i pdo php -m | grep -i mysqli php -m | grep -i pdo_mysql
Linux下安装扩展常用:
# Debian/Ubuntu sudo apt install php-mysql # CentOS/RHEL sudo yum install php-mysqlnd
宝塔面板用户可以在“软件商店 – PHP – 安装扩展”里勾选pdo_mysql或mysqli,改完记得重启PHP-FPM。
先用MySQL命令行验证账号
PHP连不上时,先别急着改代码,用命令行测一次:
mysql -h 127.0.0.1 -P 3306 -u app_user -p app_db
如果这里提示拒绝、超时或密码错误,PHP端也会失败,据MySQL官方文档,默认端口是3306,账户权限由user和host共同决定,先把命令行跑通,再回到PHP。
用PDO连接MySQL的完整步骤
创建PDO连接
<?php
$host = '127.0.0.1';
$port = 3306;
$dbname = 'app_db';
$user = 'app_user';
$pass = 'your_password';
$dsn = "mysql:host={$host};port={$port};dbname={$dbname};charset=utf8mb4";
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
error_log('数据库连接失败:' . $e->getMessage());
exit('数据库连接失败');
}
使用预处理执行查询
$stmt = $pdo->prepare('SELECT id, username FROM users WHERE email = :email'); $stmt->execute([':email' => $email]); $user = $stmt->fetch();
PDO::ATTR_EMULATE_PREPARES => false让MySQL执行真正的预处理,配合参数绑定能降低SQL注入风险,PDO还支持命名参数,代码可读性更好。
用mysqli连接MySQL的完整步骤
面向对象写法
<?php
$mysqli = new mysqli('127.0.0.1', 'app_user', 'your_password', 'app_db', 3306);
if ($mysqli->connect_errno) {
error_log('连接失败:' . $mysqli->connect_error);
exit('数据库连接失败');
}
$mysqli->set_charset('utf8mb4');
$stmt = $mysqli->prepare('SELECT id, username FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
mysqli只面向MySQL,它提供过程式和面向对象两套写法,老项目里过程式代码不少,新项目更推荐面向对象或PDO。
PHP连接MySQL用mysqli还是PDO好
| 对比项 | mysqli | PDO |
|---|---|---|
| 支持数据库 | 仅MySQL | 多种数据库 |
| 参数风格 | 问号占位 | 问号、命名参数 |
| 异常处理 | 可开启 | 更统一 |
| 预处理 | 支持 | 支持 |
| 适合场景 | 纯MySQL、旧项目 | 新项目、多数据库、规范化团队 |
行业共识认为,新项目优先选PDO更合适,若项目只连MySQL,并且团队熟悉mysqli,继续用mysqli也没有问题,关键不是扩展名字,而是是否用预处理、是否最小权限、是否处理异常。
国内云服务器PHP连接MySQL数据库失败怎么排查
第一层:网络与端口
- 云服务器安全组是否放行
3306,生产环境尽量只放行内网IP或固定出口IP,不要全开0.0.0/0。 - 系统防火墙是否拦截,可检查
firewalld、ufw或iptables。 - 本地测试连通性:
telnet 127.0.0.1 3306 nc -vz 内网IP 3306
Windows可用:
Test-NetConnection 127.0.0.1 -Port 3306
第二层:MySQL用户权限
登录MySQL后检查:
SELECT user, host FROM mysql.user; SHOW GRANTS FOR 'app_user'@'%';
创建业务账号示例:
CREATE USER 'app_user'@'%' IDENTIFIED BY '强密码'; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db. TO 'app_user'@'%'; FLUSH PRIVILEGES;
表示允许任意主机,风险较高,更安全的做法是限制为应用服务器的内网IP,业内专家指出,生产环境应避免root远程连接,业务账号只给必要权限。
第三层:PHP与MySQL版本兼容
MySQL 8默认认证插件是caching_sha2_password,旧版PHP或旧驱动可能不兼容,遇到“Authentication plugin cannot be loaded”时,可升级PHP版本,或让DBA调整用户认证方式,不要随意降级MySQL来迁就旧代码。
第四层:错误日志定位
- PHP错误日志:查看
/var/log/php-fpm/或宝塔面板日志。 - MySQL错误日志:常见于
/var/log/mysql/error.log。 - PDO异常信息:打开
ERRMODE_EXCEPTION后记录具体错误码。
连接超时多半是网络或安全组;连接拒绝多半是服务未启动或端口未监听;认证失败多半是账号、密码、host权限或认证插件。
宝塔面板PHP连接MySQL数据库配置教程
在面板创建数据库
进入“数据库 – 添加数据库”,填写数据库名、用户名、密码,访问权限按场景选择:本机应用选localhost,跨服务器连接再考虑指定IP或,添加后记录库名、用户名、密码和端口。
写入PHP配置文件
不要把密码写死在业务代码里,可以用.env文件或面板环境变量:
$host = getenv('DB_HOST') ?: '127.0.0.1';
$dbname = getenv('DB_NAME') ?: 'app_db';
$user = getenv('DB_USER') ?: 'app_user';
$pass = getenv('DB_PASS') ?: '';
宝塔的PHP扩展、MySQL版本、网站运行目录要互相对应,改完PHP版本后,pdo_mysql可能没装,回到扩展页面补装并重启。
常见坑位
localhost可能走Unix socket,0.0.1走TCP,两者行为不同。- 宝塔安全组和云厂商安全组是两层,只开一层不够。
- MySQL 8用户权限变更后要
FLUSH PRIVILEGES。 - PHP-FPM重启后才加载新扩展。
PHP连接MySQL数据库需要额外付费吗
PHP本身免费,MySQL社区版也免费,费用通常来自服务器、云数据库、带宽、备份和运维,买云数据库时,价格随实例规格、存储、地域和计费方式变化,本地开发用XAMPP、phpStudy或Docker,基本零成本,虚拟主机通常已包含数据库,但连接数、容量和权限可能受限。
如果只是学习“php怎么用mysql连接数据库服务器”,本地环境足够,生产环境再根据访问量、数据量和预算选择自建MySQL或云数据库,自建省钱但运维责任重;云数据库省心但按配置付费,选择时重点看连接数、存储上限、备份能力和故障恢复。
生产环境安全与性能清单
- 使用独立业务账号,禁止root直连。
- 只授予必要权限,如
SELECT、INSERT、UPDATE、DELETE。 - 所有外部输入走预处理,不拼接SQL字符串。
- 统一使用
utf8mb4,避免乱码。 - 数据库配置放环境变量,不提交到代码仓库。
- 设置合理超时,避免请求堆积。
- 持久连接要谨慎,PHP-FPM场景下可能带来连接占用。
- 开启慢查询日志,定期检查索引。
- 定期更新PHP和MySQL小版本,修复安全问题。
据PHP官方手册,PDO和mysqli都支持预处理语句,选哪个扩展不是最关键的,关键是把连接参数、字符集、异常处理和权限控制做扎实。
Q&A:PHP怎么用MySQL连接数据库服务器常见问题
PHP连接MySQL提示Connection refused怎么办?
先确认MySQL服务是否运行:systemctl status mysql或service mysql status,再检查端口监听:ss -lntp | grep 3306,如果本机可连、远程不可连,检查bind-address、云安全组和系统防火墙,若MySQL只监听0.0.1,远程连接会被拒绝。
PHP连接MySQL用mysqli还是PDO好?
只看MySQL且项目较旧,mysqli够用,需要多数据库支持、命名参数、统一异常处理,选PDO更合适,两者都支持预处理,新项目用PDO,维护成本通常更低。
PHP连接MySQL数据库需要额外付费吗?
PHP和MySQL社区版不收费,实际支出集中在云服务器、云数据库实例、带宽、存储、备份和运维,云数据库按规格和地域计费,具体以云厂商价格页为准,本地开发环境不需要为数据库软件本身付费。
PHP连接MySQL服务器并不复杂,难的是把网络、权限、扩展和代码规范同时做对,把PDO或mysqli连接跑通,再按最小权限和预处理原则落地,后续换服务器、上云或迁移数据库都会轻松很多。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/744967.html





