如何连接PHP数据库服务器:从基础到实践的完整指南
在PHP开发中,连接数据库服务器是动态网站和应用程序的核心环节——无论是存储用户数据、查询商品信息,还是实现交互功能,都离不开与数据库的交互,本文将以MySQL/MariaDB(PHP中最常用的数据库)为例,从基础概念、核心函数、配置细节到错误处理,带你全面PHP连接数据库服务器的方法。
连接数据库前的准备工作:环境与信息确认
在编写PHP连接代码前,需确保以下准备工作就绪,这是避免后续“连接失败”的关键:
确认数据库服务运行状态
确保你的MySQL/MariaDB数据库服务已启动并正常运行,可以通过以下方式验证:
- 命令行:在终端输入
mysql -u root -p
(若未设置密码可直接回车),能登录则服务正常; - 可视化工具:使用phpMyAdmin、Navicat、DBeaver等工具,尝试连接本地数据库(默认地址
localhost
,端口3306
),若能登录则服务正常。
获取数据库连接信息
连接数据库需要以下核心信息(这些信息由数据库管理员或你在本地安装数据库时设置):
- 主机名(hostname):数据库服务器的地址,本地开发通常为
localhost
或0.0.1
;远程服务器则为IP地址(如168.1.100
)或域名(如db.example.com
)。 - 端口(port):MySQL默认端口为
3306
,若自定义端口(如3307
),需在主机名后指定(如localhost:3307
)。 - 用户名(username):数据库登录用户,本地开发常用
root
;生产环境建议使用低权限用户(如php_user
)。 - 密码(password):对应用户的登录密码。
- 数据库名(database):要操作的数据库名称(如
my_blog
),部分场景下可先连接服务器再选择数据库。
确认PHP环境支持MySQL扩展
PHP连接MySQL主流方式有3种,对应的扩展需已安装并启用:
- MySQLi扩展(MySQL Improved):推荐用于MySQL 4.1及以上版本,支持面向过程和面向对象两种风格,功能稳定;
- PDO扩展(PHP Data Objects):数据库抽象层,支持多种数据库(MySQL、PostgreSQL、SQLite等),代码可移植性更强;
- 旧版MySQL扩展(
mysql_
函数):已自PHP 7.0起废弃,生产环境严禁使用。
可通过 phpinfo()
函数检查扩展是否启用:创建一个PHP文件(如info.php
为<?php phpinfo(); ?>
,访问后搜索“mysqli”或“PDO”,若有类似“MySQLi Support enabled”则已启用,若未启用,需修改PHP配置文件(php.ini
),去掉;extension=mysqli
和;extension=pdo_mysql
前的分号,重启PHP服务(如Apache、Nginx)。
使用MySQLi扩展连接数据库(面向过程风格)
MySQLi是PHP官方推荐的MySQL扩展之一,面向过程风格语法简单,适合初学者,核心步骤为:连接服务器 → 选择数据库 → 执行操作 → 关闭连接。
建立连接:mysqli_connect()
mysqli_connect()
用于创建与MySQL服务器的连接,语法为:
$link = mysqli_connect($host, $username, $password, $database, $port);
$host
:主机名(含端口,如localhost:3306
);$username
:用户名;$password
:密码;$database
:数据库名(可选,也可后续用mysqli_select_db()
选择);$port
:端口(可选,若$host
中已指定则无需传入)。
示例:连接本地MySQL数据库,数据库名为test_db
:
<?php $host = "localhost"; $username = "root"; $password = "123456"; $database = "test_db"; $port = 3306; // 建立连接 $conn = mysqli_connect($host, $username, $password, $database, $port); // 检查连接是否成功 if (!$conn) { die("连接失败: " . mysqli_connect_error()); // 输出错误信息并终止脚本 } echo "连接成功!"; ?>
选择数据库(可选):mysqli_select_db()
若连接时未指定数据库名,可用mysqli_select_db()
选择:
$db_selected = mysqli_select_db($conn, $database); if (!$db_selected) { die("选择数据库失败: " . mysqli_error($conn)); }
关闭连接:mysqli_close()
操作完成后,需关闭连接以释放资源:
mysqli_close($conn);
使用MySQLi扩展连接数据库(面向对象风格)
面向对象风格将数据库连接封装为对象,代码更结构化,适合大型项目,核心类为 mysqli
,通过实例化对象实现连接。
实例化连接对象:new mysqli()
语法为:
$mysqli = new mysqli($host, $username, $password, $database, $port);
参数与面向过程风格一致。
检查连接状态:connect_errno
和 connect_error
通过对象的 $connect_errno
(错误编号)和 $connect_error
(错误信息)判断连接是否成功:
<?php $host = "localhost"; $username = "root"; $password = "123456"; $database = "test_db"; // 实例化连接对象 $mysqli = new mysqli($host, $username, $password, $database); // 检查连接是否成功 if ($mysqli->connect_errno) { die("连接失败: " . $mysqli->connect_error); // 输出错误信息并终止脚本 } echo "连接成功!"; // 关闭连接 $mysqli->close(); ?>
面向对象的优势
- 封装性:连接、查询、结果集处理均通过对象方法实现,避免全局变量污染;
- 方法链式调用:部分方法支持链式调用(如
$mysqli->query("SELECT * FROM users")->fetch_all()
),代码更简洁; - 错误处理更灵活:可通过
try-catch
结合异常处理(需开启mysqli.report_mode
配置)。
使用PDO扩展连接数据库(推荐跨场景使用)
PDO(PHP Data Objects)是数据库抽象层,支持MySQL、PostgreSQL、SQLite、Oracle等多种数据库,是“一次编写,多数据库适配”的理想选择,核心步骤与MySQLi类似,但语法略有差异。
创建PDO对象:new PDO()
PDO通过构造函数连接数据库,语法为:
$dsn = "mysql:host=$host;port=$port;dbname=$database;charset=utf8"; $pdo = new PDO($dsn, $username, $password, $options);
$dsn
(Data Source Name):数据源名称,格式为数据库类型:host=主机名;port=端口;dbname=数据库名;charset=字符集
(charset
建议设为utf8
或utf8mb4
,避免中文乱码);$username
:用户名;$password
:密码;$options
:PDO配置选项,用于设置连接属性(如持久连接、错误模式等)。
关键配置选项($options
)
PDO的$options
参数非常重要,常用选项包括:
PDO::ATTR_ERRMODE
:错误报告模式,推荐设为PDO::ERRMODE_EXCEPTION
(抛出异常,便于捕获错误);PDO::ATTR_DEFAULT_FETCH_MODE
:默认获取结果集的模式,推荐设为PDO::FETCH_ASSOC
(返回关联数组);PDO::ATTR_PERSISTENT
:是否使用持久连接(true
为持久连接,减少频繁连接开销,但需注意数据库连接数限制)。
完整示例
<?php $host = "localhost"; $username = "root"; $password = "123456"; $database = "test_db"; $port = 3306; // DSN配置 $dsn = "mysql:host=$host;port=$port;dbname=$database;charset=utf8"; // PDO选项(错误模式设为异常,默认获取关联数组) $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_PERSISTENT => false, // 不使用持久连接 ]; try { // 创建PDO对象(连接数据库) $pdo = new PDO($dsn, $username, $password, $options); echo "连接成功!"; } catch (PDOException $e
还没有评论,来说两句吧...