上一篇
php怎么连接mysql数据库
- 数据库
- 2025-08-04
- 42
P连接MySQL数据库常用
mysqli或
PDO扩展,通过指定主机、用户名、密码和数据库名建立连接,执行SQL语句后记得关闭释放资源
是关于PHP如何连接MySQL数据库的详细指南,涵盖从基础配置到最佳实践的内容:
前期准备与环境确认
- 软件安装验证:确保已正确安装PHP和MySQL服务端程序,可通过命令行输入
php -v查看PHP版本,使用systemctl status mysql(Linux)或任务管理器(Windows)确认MySQL运行状态,若未安装,需前往官网下载对应版本并配置环境变量。 - 数据库实例创建:通过phpMyAdmin或命令行新建目标数据库(例如命名为
mydb),并设计合理的表结构,建议为项目单独创建用户账号,避免使用root权限进行日常开发。 - 扩展启用检查:在
php.ini文件中确认已开启mysqli或pdo_mysql扩展,重启Web服务器后,可用phpinfo()函数查看支持的数据库模块信息。
核心连接方式详解
MySQLi扩展实现(推荐面向对象写法)
| 参数名称 | 作用说明 | 默认值/可选性 | 示例值 |
|---|---|---|---|
| host | 数据库主机地址 | localhost | |
| username | 登录账号 | 无 | root |
| password | 对应密码 | 无 | secret@123 |
| dbname | 默认选择的数据库名 | 可留空稍后指定 | customer_system |
| port | 自定义端口号 | 3306 | |
| socket | Unix套接字路径 | /var/run/mysqld/mysqld.sock |
代码示例:

<?php
try {
$conn = new mysqli('localhost', 'root', 'secret@123', 'customer_system');
if ($conn->connect_error) {
throw new Exception("连接失败: " . $conn->connect_error);
}
echo "成功建立连接!";
// 设置字符集防止乱码
$conn->set_charset("utf8mb4");
// 执行查询操作...
$sql = "SELECT FROM users LIMIT 1";
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
print_r($row);
}
} catch (Exception $e) {
error_log($e->getMessage(), 3, '/tmp/db_errors.log'); // 记录错误日志而非直接输出
exit();
} finally {
$conn->close(); // 确保释放资源
}
?>
PDO接口实现(跨数据库兼容性方案)
优势对比:PDO支持12种以上数据库协议,统一的方法命名规范更利于维护大型项目,其参数化绑定特性可有效防御SQL注入攻击。
代码模板:

<?php
class Database {
private static $instance;
public static function getInstance(): PDO {
if (!self::$instance) {
try {
$dsn = 'mysql:host=localhost;dbname=mydb;charset=utf8mb4';
self::$instance = new PDO($dsn, 'appuser', 'securepass');
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $th) {
mail('admin@example.com', 'DB Error', $th->getMessage());
die("系统繁忙,请稍后再试");
}
}
return self::$instance;
}
}
// 使用示例
$stmt = Database::getInstance()->prepare("INSERT INTO logs (content) VALUES (:msg)");
$stmt->execute(['msg' => filter_input(INPUT_POST, 'comment')]);
?>
安全防护措施
- 预处理语句强制使用:所有涉及用户输入的场景都必须采用占位符绑定方式,
// 错误做法 易受攻击 $id = $_GET['uid']; $query = "SELECT FROM profiles WHERE userid=$id"; // 危险! // 正确做法 $stmt = $conn->prepare("SELECT FROM profiles WHERE userid=?"); $stmt->bind_param("i", $id); // i表示整数类型参数 - 敏感信息隔离策略:永远不要在生产环境中直接输出数据库错误详情,建议设置错误触发器将异常写入专属日志文件,同时向用户展示通用提示信息。
- 权限最小化原则:为不同应用模块创建具有仅限必要权限的数据库账户,例如博客系统的评论功能只需WRITE权限,无需DROP表权限。
- 输入验证增强:即使使用了预处理语句,仍应对输入数据进行类型校验,可以使用PHP内置函数如
filter_var()进行基础过滤。
性能优化技巧
- 连接池复用机制:对于高并发场景,可借助PDO的持久化连接特性减少TCP握手开销:
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true);
- 索引优化实践:定期使用
EXPLAIN分析慢查询,为常用排序/条件字段添加合适类型的索引,注意避免过度索引导致写操作变慢。 - 批量操作合并:将多个独立INSERT语句合并为单条多值插入,可显著提升导入效率:
INSERT INTO products (name, price) VALUES ('A',10),('B',20),('C',30); - 结果集控制策略:处理大数据集时采用分页机制,配合
LIMIT offset, count子句逐步加载数据块。
常见问题排查手册
| 现象特征 | 可能原因 | 解决方案 |
|---|---|---|
| Call to undefined function | 未启用相关扩展 | 检查php.ini中的extension配置 |
| Access denied for user | 认证凭证错误 | 核对用户名密码加密方式 |
| No database selected | 未指定默认库 | 使用mysqli_select_db()切换库 |
| Too many connections | 达到最大连接数限制 | 增加max_connections参数值 |
| Chinese characters garbled | 字符集不匹配 | 统一使用utf8mb4编码 |
FAQs
Q1:为什么应该避免使用已经废弃的mysql扩展?
A:早期的mysql_函数系列自PHP5.5起已被官方标记为弃用,主要存在两个严重缺陷:①不支持现代安全特性如预处理语句,容易导致SQL注入破绽;②缺乏对新特性的支持(如事务隔离级别控制),建议全面迁移至mysqli或PDO实现。
Q2:如何处理跨域请求中的数据库交互安全问题?
A:当面临RESTful API等开放接口场景时,除遵循基本的参数化查询外,还应实施以下措施:①严格限制CORS白名单域名;②采用JWT令牌进行身份鉴权;③对敏感字段实施字段级加密存储;④启用WAF防护

