PHP连接数据库服务器,主流方案是使用MySQLi或PDO扩展,其中PDO支持多种数据库且更安全,MySQLi专为MySQL优化。如果你还在用老旧的mysql_函数,趁早换掉,PHP 7之后已经彻底移除。
下面我把PHP连数据库这件事掰开揉碎讲清楚,从驱动选择到不同数据库的连接差异,再到失败排查,一篇搞定。
PHP连接数据库,先搞清楚这几种驱动方式
PHP本身不会自动连接数据库,它靠的是扩展,扩展就是PHP和数据库之间的翻译官,常见的有三个:MySQLi、PDO、以及各类数据库专属扩展。
MySQLi:MySQL/MariaDB的专属通道
MySQLi名字里的“i”代表improved,是MySQL官方推荐的扩展,它只服务MySQL和MariaDB,但功能扎实,支持面向对象和面向过程两种写法,也支持预处理语句。
如果你确定这辈子只跟MySQL打交道,用MySQLi很顺手,它性能不错,而且PHP手册里关于MySQL的例子大多用MySQLi,遇到问题好查资料。
PDO:跨数据库的统一入口
PDO全称PHP Data Objects,它像是一个中转站,底层通过不同驱动连接多种数据库,比如MySQL、PostgreSQL、SQL Server、Oracle等,你只要学会PDO的API,换数据库时改动极小,多数情况只改连接字符串。
行业共识认为,PDO在处理预处理和事务方面更规范,而且能防SQL注入,近年来的新项目,选择PDO的比例相当大。
老旧的mysql_函数为什么被淘汰
以前PHP有mysql_connect这类函数,但早已被官方移除,它不支持预处理,安全性差,PHP 7之后直接用不了,如果你在网上看到这类代码,别学。
php连接mysql数据库的三种方式对比
这是新手最常搜的问题,这里我给你列三种实际能跑的写法,并告诉你各自适合什么场景。
MySQLi面向对象写法
$conn = new mysqli('localhost', 'user', 'password', 'database');
if ($conn->connect_error) {
die('连接失败:' . $conn->connect_error);
}
$result = $conn->query('SELECT FROM users');
while ($row = $result->fetch_assoc()) {
echo $row['name'];
}
这种方式看着清爽,代码结构清晰,推荐初学者使用,连接失败时一定要看connect_error属性,别光顾着往下写。
MySQLi面向过程写法
$conn = mysqli_connect('localhost', 'user', 'password', 'database');
if (!$conn) {
die('连接失败:' . mysqli_connect_error());
}
$result = mysqli_query($conn, 'SELECT FROM users');
while ($row = mysqli_fetch_assoc($result)) {
echo $row['name'];
}

面向过程写法适合老项目迁移,函数名比较直白,但不适合大型项目维护,用的人越来越少了。
PDO预处理写法
try {
$pdo = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT FROM users WHERE id = ?');
$stmt->execute([1]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['name'];
}
} catch (PDOException $e) {
echo '连接失败:' . $e->getMessage();
}
PDO预处理是多数项目的首选,它能绑定参数,避免拼接SQL引发注入风险,而且连接失败时抛异常,比返回false更容易定位问题。
下面用一张表格把三者区别说清楚:
| 对比项 | MySQLi面向对象 | MySQLi面向过程 | PDO |
|---|---|---|---|
| 支持MySQL | 是 | 是 | 是 |
| 支持其他数据库 | 否 | 否 | 是 |
| 预处理语句 | 支持 | 支持 | 支持 |
| 代码风格 | 清晰 | 较乱 | 清晰 |
| 推荐场景 | MySQL专属项目 | 维护老代码 | 新项目、多数据库 |
不同数据库服务器的连接差异
PHP不只连MySQL,做开发时,你可能要对接别的数据库服务器,下面分别说下连接方式。
连接PostgreSQL服务器:用PDO还是pg_connect
PostgreSQL在PHP里可以靠pgsql扩展直接连,也能走PDO的pgsql驱动,推荐用PDO,接口统一,以后换库方便。
$pdo = new PDO('pgsql:host=localhost;dbname=database', 'user', 'password');
连接PostgreSQL时要注意,默认端口是5432,和MySQL的3306不一样,如果连接超时,先看端口是否填对。
连接SQL Server服务器:sqlsrv与PDO的选择
在Windows环境下,PHP连接SQL Server一般用微软提供的sqlsrv扩展,在Linux上,可以用PDO的

sqlsrv驱动,或者通过dblib连老版本SQL Server。
$pdo = new PDO('sqlsrv:Server=localhost,1433;Database=database', 'user', 'password');
SQL Server默认端口是1433,这里的坑在于驱动安装,sqlsrv扩展需要单独下载,不像MySQL扩展那样内置,不少做企业级开发的朋友卡在这一步。
连接Oracle服务器:OCI8扩展说明
连接Oracle要用oci8扩展,或PDO的oci驱动,Oracle的连接字符串稍微复杂,常见写法是:
$conn = oci_connect('user', 'password', 'localhost/XEPDB1');
这里的XEPDB1是Oracle实例名,得根据实际环境改,Oracle自带一堆特性,PHP连接时还要注意字符集和时区设置,否则中文容易乱码。
php连接数据库服务器配置教程:从主机到字符集
连接数据库不只是写一行new PDO,配置文件里藏着不少细节。
主机名与端口,别搞混了
localhost和0.0.1并不总是等价,在某些PHP环境下,用localhost会走Unix socket,用0.0.1会走TCP/IP,如果连接一直失败,试着换一下。
端口也是重点,默认情况下,MySQL是3306,PostgreSQL是5432,SQL Server是1433,如果你改了数据库默认端口,连接字符串里必须写明端口。
$dsn = 'mysql:host=127.0.0.1;port=3307;dbname=database';
字符集设置,避免中文乱码
连接后不设置字符集,存入数据库的数据可能变成问号,业务上请直接指定UTF-8。
MySQLi写法:
$conn->set_charset('utf8mb4');
PDO写法:
$pdo->exec("set names utf8mb4");
行业共识是,用utf8mb4比utf8更保险,因为它支持emoji和特殊字符,数据库表和字段的排序规则也要配套,否则照样乱码。
连接超时与持久连接的选择
默认情况下,PHP脚本执行完后数据库连接会自动关闭,如果脚本频繁执行,反复建立连接会拖慢性能,这时可以考虑持久连接。
PDO写法:
$pdo = new PDO('mysql:host=localhost;dbname=database', 'user', 'password', [
PDO::ATTR_PERSISTENT => true
]);

注意,持久连接在并发场景下可能占用过多数据库连接数,如果服务器连接数有限制,别乱开持久连接。
php连接数据库失败怎么办?排查思路
连接报错是家常便饭,常见原因就三类:服务没起来、权限不对、扩展没装。
检查服务状态和防火墙
先用命令行确认数据库服务是否在运行,以MySQL为例:
systemctl status mysql
如果是宝塔或XAMPP这类集成环境,去面板看服务是否启动,云服务器上还得检查安全组和防火墙规则,确保端口对外放行,我曾经遇到过数据库运行正常,就是连不上,最后发现是防火墙把3306拦了。
检查账号权限和主机限制
数据库账号往往绑定了允许登录的主机,比如'user'@'localhost'只能在本机连,换成远程IP就会报Access denied。
解决办法是创建一个'user'@'%'的账号,或者给已有账号授权远程访问权限,注意,生产环境开放远程访问有风险,尽量绑定具体IP地址。
检查PHP扩展是否启用
用phpinfo()查看扩展列表,确认是否启用了mysqli或pdo_mysql,如果没启用,在php.ini里打开对应扩展,重启PHP服务。
如果是Linux环境,可能还需要安装依赖包,例如Debian/Ubuntu上,需要运行:
sudo apt-get install php-mysql
安装完记得重启服务。
相关问题解答
php连接数据库用什么扩展最好?
如果只连接MySQL,用MySQLi或PDO都行,要是项目未来可能切换数据库,比如从MySQL换到PostgreSQL,那就用PDO,PDO的预处理和异常机制也更符合现代开发习惯。
PDO和MySQLi到底有什么区别?
两者的核心区别是支持范围,MySQLi只能连MySQL,PDO支持十二种数据库,另外PDO的预处理功能更完善,使用异常模式后能统一捕获数据库错误,MySQLi在MySQL专属功能上更精细,比如多线程查询支持,但普通项目用不到这些。
php连接数据库需要开启哪些扩展?
常见是pdo_mysql和mysqli,日志里如果出现undefined function mysqli_connect()或者could not find driver,说明扩展没装好,用phpinfo()检查后,再确认php.ini里的扩展路径是否正确,这是最直接的解决办法。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/762999.html

