在PHP开发中,操作MySQL数据库执行SQL查询是后端开发的核心基础能力,无论是用户数据存取、业务信息存储还是数据统计,都需要通过PHP和MySQL的交互来完成。目前主流的PHP操作MySQL的方式有两种,分别是mysqli扩展和PDO扩展,其中PDO扩展支持多种数据库类型,使用更灵活,也是官方推荐的方式。

一、使用mysqli扩展操作MySQL
mysqli是PHP针对MySQL开发的专用扩展,支持面向对象和面向过程两种使用方式,下面是面向对象的连接和查询示例。
1. 建立数据库连接
首先需要配置数据库的连接信息,包括主机地址、用户名、密码、数据库名,然后通过mysqli类创建连接对象。
<?php
// 数据库配置信息
$host = '127.0.0.1';
$user = 'root';
$password = '123456';
$dbname = 'test_db';
// 创建mysqli连接对象
$mysqli = new mysqli($host, $user, $password, $dbname);
// 检查连接是否成功
if ($mysqli->connect_error) {
die('数据库连接失败:' . $mysqli->connect_error);
}
echo '数据库连接成功';
?>2. 执行SQL查询并处理结果
连接成功后就可以执行SQL语句,比如查询用户表的数据,然后通过结果集对象获取返回的数据。
<?php
// 执行查询SQL
$sql = 'SELECT id, username, email FROM users WHERE status = 1';
$result = $mysqli->query($sql);
// 判断查询是否成功
if ($result === false) {
die('查询失败:' . $mysqli->error);
}
// 处理查询结果
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo '用户ID:' . $row['id'] . ',用户名:' . $row['username'] . ',邮箱:' . $row['email'] . '<br>';
}
} else {
echo '没有查询到符合条件的用户';
}
// 释放结果集和关闭连接
$result->free();
$mysqli->close();
?>二、使用PDO扩展操作MySQL
PDO是PHP的数据对象扩展,提供统一的数据库操作接口,不仅可以操作MySQL,还可以切换其他数据库,不需要修改太多代码,下面是PDO的使用示例。
1. PDO连接数据库
PDO通过数据源名称(DSN)来配置数据库连接信息,创建PDO对象时传入DSN、用户名、密码即可。
<?php
// 数据库配置
$dsn = 'mysql:host=127.0.0.1;dbname=test_db;charset=utf8mb4';
$user = 'root';
$password = '123456';
try {
// 创建PDO连接对象
$pdo = new PDO($dsn, $user, $password);
// 设置错误模式为异常,方便捕获错误
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'PDO数据库连接成功';
} catch (PDOException $e) {
die('数据库连接失败:' . $e->getMessage());
}
?>2. 执行SQL查询与参数化查询
PDO支持参数化查询,可以有效防止SQL注入攻击,是生产环境推荐的使用方式,下面是查询和插入数据的示例。
<?php
// 参数化查询示例,查询指定用户名的用户信息
$username = 'test_user';
$sql = 'SELECT id, email FROM users WHERE username = :username';
$stmt = $pdo->prepare($sql);
// 绑定参数
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
// 执行查询
$stmt->execute();
// 获取所有结果
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (!empty($users)) {
foreach ($users as $user) {
echo '用户ID:' . $user['id'] . ',邮箱:' . $user['email'] . '<br>';
}
} else {
echo '未查询到该用户';
}
// 插入数据示例,同样使用参数化防止注入
$insertSql = 'INSERT INTO users (username, email, status) VALUES (:username, :email, :status)';
$insertStmt = $pdo->prepare($insertSql);
$newUsername = 'new_user';
$newEmail = 'new@ipipp.com';
$status = 1;
$insertStmt->bindParam(':username', $newUsername, PDO::PARAM_STR);
$insertStmt->bindParam(':email', $newEmail, PDO::PARAM_STR);
$insertStmt->bindParam(':status', $status, PDO::PARAM_INT);
if ($insertStmt->execute()) {
echo '数据插入成功,新增ID:' . $pdo->lastInsertId();
} else {
echo '数据插入失败';
}
?>三、两种方式的对比与注意事项
下面是mysqli和PDO的核心差异对比,方便开发者根据实际需求选择:
| 对比项 | mysqli扩展 | PDO扩展 |
|---|---|---|
| 支持数据库类型 | 仅支持MySQL | 支持MySQL、PostgreSQL、SQLite等多种数据库 |
| 参数化查询支持 | 支持,但语法相对繁琐 | 原生支持,语法简洁 |
| 面向对象支持 | 支持面向对象和面向过程 | 仅支持面向对象 |
| 官方推荐程度 | 不推荐新项目使用 | 推荐所有新项目使用 |
在实际开发中,无论使用哪种方式,都不要直接拼接用户输入到SQL语句中,避免SQL注入风险,优先使用参数化查询。同时操作完成后要及时释放结果集和关闭数据库连接,避免占用过多资源。如果是新项目开发,建议直接使用PDO扩展,后续如果需要切换数据库也只需要修改DSN配置即可,不需要大幅调整代码逻辑。