PHP连接数据库常用PDO或mysqli扩展,示例:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); 或 `$conn = new mysqli(‘localhost’, ‘user’, ‘pass’,
是使用 PHP 连接数据库的详细指南,涵盖基础语法、常用方法及最佳实践:
准备工作
在编写代码前需确认以下信息:
- 数据库类型(如 MySQL、PostgreSQL 等);
- 服务器地址(本地通常为
localhost); - 用户名和密码;
- 目标数据库名称。
使用 mysqli 扩展实现基础连接
这是推荐给初学者的方式,因其简单直观且广泛支持,示例如下:
<?php
// 定义连接参数
$servername = "localhost"; // 主机地址(默认本地)
$username = "root"; // 数据库用户名
$password = "your_db_password"; // 对应密码
$dbname = "test_database"; // 要操作的数据库名
// 尝试建立连接并捕获错误
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error); // 输出具体错误信息便于调试
} else {
echo "恭喜!数据库连接成功。";
// TODO: 在此添加后续操作(如查询、插入数据等)
}
// 记得最后关闭连接以释放资源
$conn->close();
?>
关键函数说明:
| 方法/属性 | 作用 | 备注 |
|---|---|---|
new mysqli() |
创建新实例并立即尝试连接 | 参数顺序固定:主机→用户→密码→库名 |
connect_error |
获取最后一次错误的详细描述 | 可用于友好提示或日志记录 |
close() |
显式关闭当前活动的数据库链接 | PHP自动回收但建议手动管理 |
替代方案:传统过程式风格
若习惯面向过程编程,可用以下写法:
$link = mysqli_connect($servername, $username, $password, $dbname);
if (!$link) {
exit("无法建立链接: ". mysqli_connect_error());
}
// 执行其他操作后别忘了调用 mysqli_close($link);
注意这种写法缺乏对象导向的优势,不推荐用于复杂项目。
进阶选择:PDO(PHP Data Objects)
对于需要支持多种数据库类型的应用,推荐使用 PDO:
try {
// DSN格式:驱动名+冒号开头,后面跟具体配置项用分号分隔
$dsn = 'mysql:host=localhost;dbname=test_database;charset=utf8mb4';
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]; // 开启异常模式方便排错
$pdo = new PDO($dsn, $username, $password, $options);
echo "通过PDO成功连接到数据库!";
// 后续所有操作都通过这个统一接口完成
} catch (PDOException $e) {
// 统一处理所有数据库相关异常
echo "连接过程中出现错误: " . $e->getMessage();
}
PDO核心优势对比表:
| 特性 | mysqli | PDO |
|---|---|---|
| 多数据库兼容性 | × 仅限MySQL家族 | 支持主流关系型数据库 |
| 预处理语句安全性 | 有但语法较繁琐 | 标准化接口更易维护 |
| 事务控制能力 | 基础级别 | 完整ACID事务支持 |
| 参数绑定机制 | 分散在不同方法中 | 统一的bindValue/bindParam系列 |
| 错误处理模式 | 混合隐式与显式返回值 | 可配置的异常抛出机制 |
安全注意事项
- 永远不要硬编码敏感信息:将凭证存储在环境变量或配置文件中,并确保其不被版本控制系统追踪;
- 强制使用预处理语句:
// 错误做法(易受SQL注入攻击) // $sql = "SELECT FROM users WHERE email='{$_GET['email']}'"; // 正确做法:准备带占位符的模板然后绑定参数 $stmt = $pdo->prepare("SELECT FROM users WHERE email = :email"); $stmt->execute(['email' => filter_input(INPUT_GET, 'email')]); - 最小权限原则:为应用程序分配仅能满足需求的数据库账户权限;
- 定期更新依赖库:保持PHP版本及数据库驱动处于最新状态以修复安全破绽。
常见调试技巧
当遇到连接问题时,可以按以下步骤排查:
- 检查防火墙设置是否阻止了相应端口(默认MySQL是3306);
- 使用命令行工具单独测试凭据有效性:
mysql -u root -p -h localhost; - 启用PHP错误显示临时辅助诊断:
ini_set('display_errors', 1);; - 验证字符集配置是否正确避免乱码问题。
FAQs
Q1: PHP连接数据库时出现“Access denied”怎么办?
A: 此错误通常由以下原因导致:①提供的用户名/密码不正确;②该用户没有访问指定数据库的权限;③数据库服务器未允许远程连接(如果是远程主机的话),解决方法包括重置密码、授予适当权限(如GRANT ALL PRIVILEGES ON dbname. TO ‘user’@’host’;),以及确认是否启用了远程访问功能。
Q2: PDO与mysqli哪个性能更好?
A: 根据实际测试,两者在大多数场景下的性能差异微乎其微,选择依据应基于项目需求:如果需要跨数据库移植性或高级特性(如事务完整性检查),则优先选PDO;若仅需快速搭建MySQL应用且团队熟悉面向过程风格,可考虑mysqli,现代框架如Laravel、Symfony均内置对PDO的良好支持
