PHP连接MySQL数据库服务器,最稳妥的方式是使用PDO或MySQLi扩展,通过主机、端口、数据库名、用户名、密码建立连接,并设置字符集与错误处理。 只要PHP环境和MySQL服务正常,掌握几个核心参数,五分钟内就能跑通第一个连接脚本。
连接前的环境检查与准备
确认PHP与MySQL是否就绪
先别急着写代码,打开终端或命令提示符,执行几条命令,确认基础环境没有掉链子。
- 查看PHP版本:
php -v,建议使用PHP 7.4及以上版本,PHP 8.x对MySQL驱动支持更好。 - 检查扩展是否开启:
php -m | grep -i pdo或php -m | grep -i mysqli,Windows下可以在php.ini中搜索extension=pdo_mysql和extension=mysqli,去掉前面的分号。 - 确认MySQL服务运行:Linux用
systemctl status mysql,Windows在服务列表里看MySQL是否启动。 - 准备连接信息:主机名通常是
0.0.1或localhost,端口默认3306,数据库名、用户名、密码按实际填写。
据工信部公开信息,PHP在中小型Web项目中应用广泛,而MySQL长期占据开源数据库头部位置,两者搭配是很多动态网站的默认组合。
连接信息的四个核心参数
无论用哪种方式,连接数据库都绕不开这四个参数:
- 主机名:本地开发用
localhost或0.0.1,远程服务器填公网IP或域名。 - 端口:默认
3306,如果改过要对应修改。 - 数据库名:要操作的具体库,比如
test_db。 - 用户名和密码:MySQL账户凭据,不要用root跑线上业务。
把这四项准备好,后面的代码就是填空。
PHP连接MySQL数据库服务器的方法有哪些?先选对扩展
PHP连接MySQL主要有两条路:PDO和MySQLi,两者都能用,但适用场景不同。
PDO连接方式:推荐跨数据库方案
PDO(PHP Data Objects)是一个数据库访问抽象层,支持MySQL、PostgreSQL、SQLite等多种数据库,换数据库时,代码改动较小。
<?php
$host = '127.0.0.1';
$port = '3306';
$dbname = 'test_db';
$username = 'your_user';
$password = 'your_pass';
try {
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
charset=utf8mb4建议写上,避免中文乱码和emoji存储问题。ERRMODE_EXCEPTION让错误以异常抛出,方便排查。- 使用预处理语句能有效防止SQL注入。
MySQLi连接方式:专注MySQL
MySQLi只针对MySQL,提供面向对象和过程式两种写法,老项目里常见过程式代码,新项目更推荐面向对象。
<?php
$mysqli = new mysqli('127.0.0.1', 'your_user', 'your_pass', 'test_db', 3306);
if ($mysqli->connect_error) {
die('连接失败: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
echo '连接成功';
$mysqli->close();
?>
过程式写法类似:
<?php
$conn = mysqli_connect('127.0.0.1', 'your_user', 'your_pass', 'test_db', 3306);
if (!$conn) {
die('连接失败: ' . mysqli_connect_error());
}
mysqli_set_charset($conn, 'utf8mb4');
?>
PDO与MySQLi对比
| 对比项 | PDO | MySQLi |
|---|---|---|
| 支持数据库 | 多种 | 仅MySQL |
| 预处理语句 | 支持 | 支持 |
| 面向对象 | 支持 | 支持 |
| 过程式接口 | 不支持 | 支持 |
| 命名参数 | 支持 | 不支持 |
| 学习成本 | 较低 | 较低 |
新项目优先选PDO,老项目维护用MySQLi也没问题,业内专家指出,PDO在跨数据库支持上更灵活,适合需要长期演进的系统。
PHP怎么连接远程MySQL数据库服务器?分场景配置
本地连接和远程连接的区别,主要在于MySQL用户权限和网络防火墙。
远程连接配置步骤
假设MySQL装在云服务器上,PHP代码跑在另一台机器,按下面几步操作:
- 登录MySQL:
mysql -u root -p - 创建允许远程访问的用户:
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPass123'; GRANT ALL PRIVILEGES ON test_db. TO 'remote_user'@'%'; FLUSH PRIVILEGES;
- 检查MySQL配置文件
my.cnf或mysqld.cnf,确认bind-address不是只绑定0.0.1,可以改成0.0.0或注释掉。 - 开放防火墙端口:云服务器安全组放行
3306,Linux本机firewall-cmd或ufw也要放行。 - PHP代码里主机名改成远程服务器公网IP,端口保持
3306。
云服务器场景注意点
不少开发者用宝塔面板或云数据库RDS,宝塔面板里可以直接在“数据库”页面添加远程访问权限,云数据库RDS通常提供内网地址和外网地址,生产环境建议走内网,延迟低也安全。
远程连接不要图省事用root账户,遵循最小权限原则,只给业务库必要的增删改查权限。
PHP与MySQL数据库连接常见错误怎么解决?
连接失败时,错误信息就是最好的线索,下面几个错误几乎每个PHP开发者都遇到过。
Access denied for user
- 原因:用户名、密码错误,或该用户没有从当前主机连接的权限。
- 解决:核对凭据;检查MySQL用户表
mysql.user中的Host字段,localhost和含义不同。 - 命令:
SELECT user, host FROM mysql.user;
Connection refused
- 原因:MySQL没启动,端口不对,或防火墙拦截。
- 解决:启动MySQL服务;用
telnet 主机 3306测试端口;检查安全组和本机防火墙。
Unknown database
- 原因:数据库名写错,或库还没创建。
- 解决:
CREATE DATABASE test_db DEFAULT CHARSET utf8mb4;
中文乱码
- 原因:连接字符集与表字符集不一致。
- 解决:连接后立即执行
SET NAMES utf8mb4;,PDO在DSN里加charset=utf8mb4。
错误处理最佳实践
不要直接把$e->getMessage()输出到线上页面,容易泄露敏感信息,生产环境应记录日志,给用户显示统一错误提示。
try {
$pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
error_log('数据库连接失败: ' . $e->getMessage());
exit('服务暂时不可用');
}
MySQLi和PDO连接MySQL哪个好?对比与选择
这个问题没有绝对答案,看项目阶段和团队习惯。
- 新项目、需要切换数据库:选PDO,命名参数、异常处理、跨库支持都更舒服。
- 只使用MySQL、维护老代码:MySQLi够用,过程式写法在老教程里很常见。
- 性能差异:多数情况下两者差距很小,业务瓶颈通常不在驱动层。
- 安全性:都支持预处理语句,关键看有没有正确使用。
行业共识认为,无论选哪种扩展,参数化查询都是防注入的基础,不要拼接SQL字符串。
北京PHP开发连接MySQL数据库服务器要钱吗?成本与部署
软件本身不收费,PHP、MySQL、Apache/Nginx都是开源免费的,花钱的地方主要在服务器和运维。
- 本地开发:零成本,装个XAMPP、phpStudy或Docker就能跑。
- 云服务器:北京地区云厂商的轻量应用服务器,入门配置年付通常在几百元区间,具体价格随配置、带宽、活动变化。
- 云数据库:如果不想自己维护MySQL,可以买云数据库RDS,按规格和时长计费。
- 域名和SSL:上线对外服务时需要,属于额外成本。
对于个人学习和小型项目,本地环境完全够用,中大型项目再考虑云服务器加独立数据库。
安全与性能优化建议
防止SQL注入
- 始终使用预处理语句。
- 不要信任任何用户输入。
- 对输入做类型校验和长度限制。
连接复用与长连接
- PHP脚本执行完通常自动关闭连接,高并发场景可以用连接池或持久连接,但要注意资源占用。
- PDO持久连接:
new PDO($dsn, $user, $pass, [PDO::ATTR_PERSISTENT => true]); - MySQLi长连接:主机名前加
p:,如p:127.0.0.1。
字符集统一
- 数据库、表、连接三处都使用
utf8mb4。 - 建库时指定:
CREATE DATABASE test_db DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
关闭不用的连接
- 脚本结束前可以显式关闭:
$pdo = null;或$mysqli->close(); - 减少不必要的数据库查询,合理使用缓存。
PHP与MySQL连接数据库服务器常见问答
PHP连接MySQL数据库服务器需要安装什么扩展?
需要启用pdo_mysql或mysqli扩展,Linux下可以安装php-mysql包,Windows下在php.ini中取消对应扩展的注释,用phpinfo()或php -m确认是否生效。
PHP连接MySQL数据库服务器失败怎么办?
先看具体错误信息,常见方向包括:MySQL服务是否启动、账号密码是否正确、用户是否有远程访问权限、防火墙是否放行3306端口、数据库名是否存在,用telnet或nc测试端口连通性,再检查MySQL用户表。
PHP连接MySQL数据库服务器用PDO还是MySQLi?
PDO支持多种数据库,提供命名参数,适合新项目和需要跨库的场景,MySQLi专注MySQL,支持过程式和面向对象两种写法,适合维护老项目,两者都支持预处理语句,安全性取决于是否正确使用。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/691607.html





