PHP连接数据库是Web开发中的基础操作,掌握正确的连接方法不仅能提高开发效率,还能确保数据交互的安全性和稳定性,本文将详细介绍PHP连接数据库的常用方法,包括MySQLi和PDO两种扩展的使用,以及连接过程中的注意事项和最佳实践。

PHP连接数据库的两种主流方式
PHP提供了多种连接数据库的方式,其中最常用的是MySQLi扩展和PDO(PHP Data Objects)扩展,MySQLi专门用于MySQL数据库,而PDO则支持多种数据库类型,具有更好的跨平台性,开发者可以根据项目需求选择合适的方式。
使用MySQLi扩展连接数据库
MySQLi(MySQL Improved)是PHP官方推荐的MySQL操作扩展,提供了面向过程和面向对象两种编程风格,以下是面向对象方式连接MySQL数据库的代码示例:
<?php
// 数据库配置信息
$host = 'localhost'; // 数据库主机地址
$username = 'root'; // 数据库用户名
$password = ''; // 数据库密码
$dbname = 'test_db'; // 数据库名称
// 创建连接
$conn = new mysqli($host, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
代码解析:
new mysqli()用于创建数据库连接对象,参数依次为主机地址、用户名、密码和数据库名。connect_error属性用于获取连接错误信息,die()函数会在连接失败时终止脚本并输出错误信息。- 连接成功后,
$conn对象将用于后续的数据库操作。
使用PDO扩展连接数据库
PDO是PHP的一个轻量级数据库访问层,支持多种数据库(如MySQL、PostgreSQL、SQLite等),以下是使用PDO连接MySQL的代码示例:
<?php
// 数据库配置信息
$host = 'localhost';
$dbname = 'test_db';
$username = 'root';
$password = '';
try {
// 创建PDO连接
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
// 设置PDO错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
代码解析:
- PDO的连接字符串格式为
mysql:host=主机名;dbname=数据库名,不同数据库的连接字符串略有不同。 setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)启用异常模式,便于捕获和处理错误。- 使用
try-catch块捕获连接过程中可能出现的异常,提高代码的健壮性。
连接数据库的注意事项
-
数据库安全配置

- 避免在代码中硬编码数据库密码,建议使用配置文件或环境变量存储敏感信息。
- 为数据库用户设置最小权限原则,避免使用
root账户直接操作业务数据库。
-
字符集设置
连接数据库时,建议明确指定字符集,避免乱码问题,在MySQLi连接后添加:$conn->set_charset("utf8");在PDO连接字符串中添加:
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); -
连接关闭与资源释放
数据库连接是有限资源,使用完毕后应及时关闭。// MySQLi关闭连接 $conn->close(); // PDO关闭连接 $pdo = null;
数据库操作的最佳实践
-
使用预处理语句防止SQL注入
无论是MySQLi还是PDO,都应使用预处理语句(Prepared Statements)处理用户输入,避免SQL注入攻击,PDO预处理语句示例:$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)"); $stmt->execute(['name' => 'John', 'email' => 'john@example.com']); -
统一数据库操作封装
在大型项目中,建议将数据库连接和操作封装成类或函数,提高代码复用性和可维护性。class Database { private $pdo; public function __construct($host, $dbname, $username, $password) { $this->pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } public function query($sql, $params = []) { $stmt = $this->pdo->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(); } } -
连接池管理
对于高并发应用,可以使用连接池技术(如Swoole的MySQL连接池)复用数据库连接,减少频繁创建和销毁连接的开销。
常见问题与解决方案
-
连接超时问题
如果数据库连接耗时较长,可以通过调整max_execution_time和connect_timeout参数解决,在PHP脚本开头添加:set_time_limit(30); // 设置脚本最大执行时间为30秒
-
数据库连接数过多
当大量并发请求导致数据库连接数超过限制时,可以通过优化连接管理或使用连接池缓解压力。
相关问答FAQs
Q1: PHP连接数据库时出现“Access denied”错误怎么办?
A1: 此错误通常是由于数据库用户名或密码错误、用户权限不足或主机地址不正确导致的,解决方案包括:
- 检查数据库用户名和密码是否正确;
- 确认用户是否有访问目标数据库的权限(如
GRANT ALL ON db_name.* TO 'user'@'host'); - 验证
$host参数是否正确,尤其是远程连接时需确认数据库服务器的防火墙设置。
Q2: MySQLi和PDO应该如何选择?
A2: 选择取决于项目需求:
- MySQLi:适合仅使用MySQL数据库的项目,性能较好,支持MySQL的特有功能;
- PDO:适合需要支持多种数据库的项目,代码更具通用性,且预处理语句的写法更简洁。
如果未来可能切换数据库类型,推荐优先选择PDO。