PHP与数据库连接是Web开发中的核心环节,通常通过扩展(如MySQLi、PDO)实现,不同扩展适用于不同场景,且连接过程需兼顾安全性与性能,以下是详细步骤及注意事项:
选择数据库扩展
PHP提供多种数据库连接扩展,主流选择包括:
- MySQLi(MySQL Improved):专为MySQL设计,支持面向过程和面向对象两种方式,性能较好,但仅限MySQL数据库。
- PDO(PHP Data Objects):数据库抽象层,支持多种数据库(MySQL、PostgreSQL、SQLite等),通过统一接口操作不同数据库,代码可移植性更强。
- 旧版MySQL扩展:已废弃,不推荐使用。
根据需求选择扩展,若项目仅使用MySQL,可选MySQLi;若需跨数据库支持,PDO更合适。
MySQLi连接方式
面向对象方式
$servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接是否成功 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "连接成功";
面向过程方式
$conn = mysqli_connect($servername, $username, $password, $dbname); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } echo "连接成功";
关键参数说明:
$servername
:数据库服务器地址,本地通常为localhost
。$username
:数据库用户名。$password
:数据库密码。$dbname
:要连接的数据库名(可选,也可在连接后选择)。
PDO连接方式
$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8"; $username = "root"; $password = "password"; try { $pdo = new PDO($dsn, $username, $password); // 设置错误模式为异常 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "连接成功"; } catch (PDOException $e) { die("连接失败: " . $e->getMessage()); }
PDO特性:
$dsn
(Data Source Name):包含数据库类型、主机名、数据库名及字符集(如charset=utf8
可避免乱码)。setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
:启用异常模式,便于捕获错误。
连接配置与优化
字符集设置
连接时需指定字符集(如utf8mb4
),避免乱码:
// MySQLi方式 $conn->set_charset("utf8mb4"); // PDO方式(在DSN中指定) $dsn = "mysql:host=localhost;dbname=test_db;charset=utf8mb4";
持久化连接
高频访问场景下,可使用持久化连接减少连接开销:
// MySQLi持久化连接 $conn = new mysqli("p:localhost", "root", "password", "test_db"); // PDO持久化连接 $dsn = "mysql:host=localhost;dbname=test_db;charset=utf8mb4"; $pdo = new PDO($dsn, $username, $password, array(PDO::ATTR_PERSISTENT => true));
注意:持久化连接需谨慎使用,可能因未正确释放导致资源耗尽。
连接池管理
生产环境中建议使用连接池(如Swoole、PDO连接池),避免频繁创建/销毁连接。
安全注意事项
避免硬编码敏感信息:数据库凭证不应直接写在代码中,可通过环境变量或配置文件管理:
// 使用环境变量(需配合php.ini或dotenv库) $username = getenv('DB_USER'); $password = getenv('DB_PASS');
最小权限原则:数据库用户仅授予必要权限(如
SELECT
、INSERT
,避免GRANT ALL
)。防SQL注入:
- MySQLi:使用预处理语句
$stmt = $conn->prepare("SELECT * FROM users WHERE id=?"); $stmt->bind_param("i", $id); $stmt->execute();
- PDO:同样支持预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE id=:id"); $stmt->bindParam(":id", $id); $stmt->execute();
- MySQLi:使用预处理语句
关闭连接
操作完成后需关闭连接,释放资源:
// MySQLi $conn->close(); // PDO $pdo = null;
常见问题与解决
问题现象 | 可能原因 | 解决方案 |
---|---|---|
连接超时 | 数据库服务未启动/防火墙阻拦 | 检查数据库服务状态,开放端口(如3306) |
“Access denied”错误 | 用户名/密码错误或权限不足 | 核对凭证,检查数据库用户权限 |
乱码问题 | 字符集不匹配 | 统一使用utf8mb4 字符集 |
相关问答FAQs
Q1: PHP连接数据库时出现“Too many connections”错误怎么办?
A: 此错误表明数据库连接数已达上限,解决方案包括:优化代码,及时关闭连接;使用连接池复用连接;调整数据库配置(如max_connections
参数)或增加服务器资源。
Q2: PDO和MySQLi在性能上哪个更好?
A: 在纯MySQL环境下,MySQLi性能略优(因针对MySQL优化);若需跨数据库支持或使用预处理语句的灵活性,PDO更推荐,实际差异通常可忽略,应根据项目需求选择。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复