1. 环境准备与驱动选择
1.1 安装与配置 PHP 环境
在开始学习 PHP 连接数据库之前,需要确认 PHP 环境已就绪并启用数据库扩展,常用的扩展包括 mysqli 与 pdo_mysql。为确保兼容性,推荐使用 PHP 版本 7.2 及以上,并搭配至少一个主流数据库(如 MySQL/MariaDB)。另外,确认环境变量、PATH、以及 php.ini 的扩展加载,以便后续通过命令行或网页脚本调用数据库。
为了快速验证,可执行以下命令检查已加载的扩展:mysqli、pdo_mysql,确保没有缺失。还有一个重要点是字符集,开发时应统一指定为 utf8mb4,以提升国际化与表情符号的兼容性。

1.2 mysqli 与 PDO 的对比与适用场景
在实际开发中,两种常用驱动 mysqli 与 PDO各有优缺点。mysqli 提供面向对象和过程化 API,适合对性能和细粒度控制有要求的场景;PDO 提供统一的数据库抽象层,便于切换数据库且默认启用严格的异常处理。对于新项目,许多开发者更倾向于 PDO 的异常驱动与命名占位符,有助于提升代码的可维护性。
下面是一个简要要点对照,帮助你在初学阶段快速定位:示例驱动、异常处理、参数化查询、跨数据库迁移等方面的差异。
2. 使用 mysqli 连接数据库的基础
2.1 典型连接写法(面向对象)
使用 mysqli 进行连接时,最常见的方式是面向对象的构造函数调用。核心要点在于正确传入主机、用户名、密码、数据库名以及可选端口,同时要处理连接错误并设置字符集以避免编码问题。
下面给出一个最简的连接示例,演示如何建立连接并做基本错误处理与字符集设置:
connect_errno) {die('连接失败: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4'); // 设置字符集,避免乱码
?>
2.2 使用 mysqli 的预处理语句
为了防止 SQL 注入,强烈推荐使用预处理语句和参数绑定。通过 prepare、bind_param、execute 的组合,可以安全地执行带有动态参数的查询。
下面展示一个常见的按邮箱查找用户的示例,包含参数绑定与结果获取:
prepare('SELECT id, name FROM users WHERE email = ?');
$stmt->bind_param('s', $email); // s 表示字符串
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
?>
3. 使用 PDO 连接数据库的基础
3.1 连接数据库的基本写法(PDO)
PDO 提供统一的接口和丰富的配置选项,DSN(数据源名称)中指定主机、数据库、字符集,并通过选项数组开启错误处理为异常模式,从而在出现错误时抛出异常,便于调试与日志记录。
下面给出一个使用 PDO 连接数据库的最基本示例:
PDO::ERRMODE_EXCEPTION, // 将错误处理设为异常模式PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 默认取出关联数组PDO::ATTR_EMULATE_PREPARES => false, // 真实预处理,避免模拟
];
$pdo = new PDO($dsn, $user, $pass, $options);
?>
3.2 通过 PDO 进行预处理查询
使用 PDO 的预处理语句,可以使用命名占位符或问号占位符,且绑定方式更清晰。尽量使用命名占位符,以提高可读性。
prepare('SELECT id, name FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
?>
4. 常用语句与安全要点
4.1 参数化查询的典型用法(mysqli 与 PDO 对比)
无论选择 mysqli 还是 PDO,参数化查询都是防止 SQL 注入的关键手段。以下示例同时展示两种实现方式,帮助你快速落地:
prepare("SELECT id, name FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();// using PDO
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE id = :id");
$stmt->execute(['id' => $id]);
$user = $stmt->fetch();
?>
4.2 插入、更新与删除的常用语句
对于数据增删改,参数化的 INSERT、UPDATE、DELETE 提高了安全性与可维护性。下面给出一个通用模板,适用于两种驱动:
prepare("INSERT INTO users (name, email) VALUES (:name, :email)")->execute(['name' => $name,'email' => $email
]);// mysqli 插入
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$stmt->execute();
?>
4.3 事务与错误处理的实用要点
在复杂业务场景中,事务是确保数据一致性的关键,建议在对多张表进行更新时使用 BEGIN、COMMIT、ROLLBACK,并在 PDO 的情况下结合异常处理实现自动回滚。
beginTransaction();
try {$pdo->prepare("UPDATE accounts SET balance = balance - :amt WHERE id = :id")->execute(['amt' => $amt, 'id' => $fromId]);$pdo->prepare("UPDATE accounts SET balance = balance + :amt WHERE id = :id2")->execute(['amt' => $amt, 'id2' => $toId]);$pdo->commit();
} catch (Exception $e) {$pdo->rollBack();throw $e;
}
?>
5. 实战案例:一个简单的用户管理模块
5.1 创建与初始化数据表
在实际项目中,通常需要先创建数据表结构。下面给出一个简单的用户表 SQL,用于存储用户基本信息。字符集设为 utf8mb4,以兼容多语言和表情符号。
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,email VARCHAR(120) NOT NULL UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARSET=utf8mb4;
5.2 查询并返回结果的完整流程
以下示例演示如何通过 PDO 以及参数化查询,按邮箱查找用户并返回结果。注意 fetch 的模式设置,确保返回格式符合前端需求。
prepare('SELECT id, name, email FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
?>


