php连接 数据库的代码怎么写
- 数据库
- 2025-08-19
- 9
是关于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-