php连接 数据库的代码怎么写
- 数据库
- 2025-08-19
- 7
mysqli扩展:`$conn=new mysqli(‘主机’,’用户’,’密码’,’数据库
是关于PHP连接数据库的详细指南,涵盖两种主流方法(MySQLi扩展和PDO),包含具体实现步骤、代码示例及注意事项:
准备工作
在开始编码前,需确认以下环境配置已完成:
- Web服务器支持PHP(如Apache/Nginx);
- 已安装目标数据库系统(以MySQL为例);
- 创建好指定的数据库和用户账号,并为其分配权限;
- PHP环境中启用了对应扩展(
mysqli或pdo_mysql),可通过phpinfo()函数查看是否加载成功。
使用MySQLi扩展实现连接
特点
面向过程风格,适合快速开发简单应用;支持预处理语句防止SQL注入。

核心函数
mysqli_connect()用于建立连接,参数依次为:主机名、用户名、密码、数据库名(可选),若省略最后一个参数,则需后续用select_db切换库。
示例代码
<?php
// 定义数据库配置信息
$servername = "localhost"; // 通常本地部署为localhost或127.0.0.1
$username = "root"; // 替换为你的实际用户名
$password = "your_secure_password"; // 建议使用复杂密码并妥善保管
$dbname = "test_db"; // 预先创建的目标数据库名称
// 尝试建立连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error); // 输出错误详情便于调试
} else {
echo "成功连接到MySQL数据库!";
/ 在这里执行SQL操作,例如查询数据 /
$sql = "SELECT FROM users";
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
print_r($row); // 逐行打印结果集内容
}
$conn->close(); // 显式关闭连接释放资源
}
?>
️ 注意事项
- 错误处理必须到位,避免直接暴露敏感信息;生产环境建议记录日志而非页面显示。
- 字符集设置很重要,中文项目常添加:
$conn->set_charset("utf8mb4");以支持表情符号等特殊字符。 - 安全性提升应优先使用预处理语句替代普通查询,
$stmt = $conn->prepare("INSERT INTO articles (title) VALUES(?)"); $stmt->bind_param("s", $title); // 's'表示字符串类型参数 $stmt->execute();
使用PDO实现更灵活的连接
️ 优势
统一接口适配多种数据库厂商(不限于MySQL),支持尝试事务原子性操作及更高级的功能。

标准流程
通过DSN字符串指定驱动类型与连接参数,结合工厂模式创建实例,推荐用于中大型项目或需要多数据库兼容的场景。
完整示例
<?php
try {
// DSN格式:驱动名称+冒号开头,后跟键值对结构的数据源标识符
$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 开启异常抛出模式方便捕获错误
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC // 默认关联数组形式返回结果
];
// 实例化PDO对象并传入配置数组
$pdo = new PDO($dsn, 'root', 'your_secure_password', $options);
// 测试基础交互功能
$stmt = $pdo->query("SELECT FROM products WHERE price > ?");
$stmt->bindValue(1, 100, PDO::PARAM_INT); // 绑定第一个占位符为整数类型的值100
$stmt->execute();
foreach ($stmt as $record) {
var_dump($record); // 可视化输出每条记录的结构与内容
}
} catch (PDOException $e) {
// 统一的错误处理入口,可在此记录错误日志或触发告警机制
echo "数据库操作异常: " . $e->getMessage();
}
?>
最佳实践建议
- 参数绑定永远不要遗漏,这是防御SQL注入的关键防线;即使看似安全的输入也可能隐藏风险。
- 事务控制可用于保证多个相关操作要么全部成功要么全部回滚:
$pdo->beginTransaction(); // ...执行一系列更新操作... $pdo->commit(); // 若无异常则提交事务 // 如果中途出错则调用rollBack()撤销所有已执行的操作
- 持久化连接复用可通过构造函数第三个布尔参数控制,但需权衡性能与资源占用问题。
对比归纳表
| 特性 | MySQLi | PDO |
|---|---|---|
| API风格 | 专用于MySQL的面向对象接口 | 通用数据库抽象层 |
| 多数据库支持 | 仅限MySQL | SQLite/PostgreSQL/Oracle等均可 |
| 预处理语句语法 | 基于方法链式调用 | 统一的prepare()+bindParam组合 |
| 错误处理机制 | 传统警告抑制模式 | 面向对象的异常捕获体系 |
| 学习曲线 | 相对平缓适合初学者 | 初期稍复杂但长期收益更高 |
常见问题解答FAQs
Q1: 出现“Access denied for user ‘xxx’@’localhost’”怎么办?
A: 此错误通常由以下原因导致:①用户名或密码输入不正确;②该用户未被授权访问指定数据库;③主机地址限制过于严格(如只允许特定IP连接),解决方法包括:检查凭证拼写是否正确;登录MySQL命令行执行GRANT ALL PRIVILEGES ON dbname. TO 'user'@'host'; FLUSH PRIVILEGES;重新授权;确认php配置文件中的mysqli.default_socket路径有效。

Q2: 中文乱码如何解决?
A: 根本原因在于编码不匹配,解决方案是在建立连接后立即设置客户端字符集为UTF-8:对于MySQLi使用$conn->set_charset("utf8mb4");;对于PDO则在DSN中添加charset=utf8mb4参数,同时确保数据库表的DEFAULT COLLATE设置为utf8mb4_general_ci,HTML页面也声明为<meta charset=”UTF-
