PHP 将 MySQL 查询结果转换为 JSON 的实用指南**
在现代 Web 开发中,JSON(JavaScript Object Notation)已成为数据交换的事实标准,它轻量、易于阅读和解析,被广泛用于前后端数据交互,PHP 作为一种流行的服务器端脚本语言,经常需要从 MySQL 数据库中检索数据,并将其转换为 JSON 格式以供前端或其他服务使用,本文将详细介绍如何在 PHP 中将 MySQL 查询结果转换为 JSON,涵盖从基础到进阶的各种方法和注意事项。
准备工作:连接 MySQL 数据库
我们需要使用 PHP 连接到 MySQL 数据库,这里我们推荐使用 MySQLi 或 PDO 扩展,PDO 更具通用性,支持多种数据库,而 MySQLi 专门针对 MySQL。
假设我们有一个名为 mydb 的数据库,其中包含一张 users 表,结构如下:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
并且表中有一些数据:
INSERT INTO users (name, email, age) VALUES
('张三', 'zhangsan@example.com', 25),
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);
基础方法:使用 MySQLi 和 json_encode()
json_encode() 是 PHP 中将数组或对象转换为 JSON 字符串的核心函数,我们的主要任务是将 MySQL 查询结果(通常是一个结果集对象)转换为 PHP 数组,然后再使用 json_encode()。
示例代码(MySQLi 面向对象风格):
<?php
// 1. 连接数据库
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydb";
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 2. 执行查询
$sql = "SELECT id, name, email, age FROM users";
$result = $conn->query($sql);
// 3. 将结果集转换为数组
$usersArray = [];
if ($result->num_rows > 0) {
// fetch_assoc() 每次获取一行,关联数组形式
while($row = $result->fetch_assoc()) {
$usersArray[] = $row;
}
} else {
echo "0 结果";
}
// 4. 将数组转换为 JSON
$jsonData = json_encode($usersArray);
// 5. 输出 JSON
// 设置正确的 Content-Type 头信息,以便浏览器正确解析
header('Content-Type: application/json');
echo $jsonData;
// 6. 关闭连接
$conn->close();
?>
代码解释:
- 连接数据库:使用
new mysqli()创建连接对象。 - 执行查询:使用
query()方法执行 SQL 查询,返回一个mysqli_result对象。 - 转换为数组:
- 初始化一个空数组
$usersArray。 - 使用
while循环和fetch_assoc()方法逐行获取查询结果。fetch_assoc()将每一行返回一个关联数组(字段名作为键)。 - 将每一行关联数组添加到
$usersArray中,最终得到一个包含所有用户数据的二维数组。
- 初始化一个空数组
- 转换为 JSON:使用
json_encode($usersArray)将 PHP 数组转换为 JSON 字符串。 - 输出 JSON:使用
header('Content-Type: application/json')设置响应头,告诉客户端返回的是 JSON 数据,然后输出 JSON 字符串。 - 关闭连接:使用
close()关闭数据库连接。
输出结果:
[
{"id":1,"name":"张三","email":"zhangsan@example.com","age":25},
{"id":2,"name":"李四","email":"lisi@example.com","age":30},
{"id":3,"name":"王五","email":"wangwu@example.com","age":28}
]
使用 PDO 转换 MySQL 结果为 JSON
PDO 提供了更灵活的数据库操作方式,其获取结果集的方法略有不同。
示例代码(PDO):
<?php
// 1. 连接数据库
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydb";
$charset = "utf8mb4"; // 推荐使用 utf8mb4 以支持更广泛的字符
$dsn = "mysql:host=$servername;dbname=$dbname;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 设置默认获取模式为关联数组
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// 2. 执行查询
$stmt = $pdo->query("SELECT id, name, email, age FROM users");
// 3. 将结果集转换为数组
// 因为设置了 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,fetchAll() 直接返回关联数组
$usersArray = $stmt->fetchAll();
// 4. 将数组转换为 JSON
$jsonData = json_encode($usersArray, JSON_UNESCAPED_UNICODE); // JSON_UNESCAPED_UNICODE 防止中文被转义
// 5. 输出 JSON
header('Content-Type: application/json');
echo $jsonData;
// 6. 关闭连接 (PDO 对象会在脚本结束时自动关闭,但显式关闭是个好习惯)
$pdo = null;
?>
代码解释:
- 连接数据库:PDO 的连接方式是通过构造函数传入 DSN(数据源名称)、用户名和密码。
- 设置选项:
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC是一个非常有用的设置,它使得后续的fetchAll()或fetch()直接返回关联数组,无需每次指定。 - 执行查询:使用
query()方法执行 SQL,返回一个PDOStatement对象。 - 转换为数组:使用
fetchAll()方法一次性获取所有结果行,并直接返回一个二维关联数组。 - 转换为 JSON:同样使用
json_encode(),这里我们添加了JSON_UNESCAPED_UNICODE选项,确保中文字符不会被转义(\u4e2d\u6587),这在处理中文数据时非常有用。 - 输出和关闭:与 MySQLi 类似。
进阶技巧与注意事项
-
处理空结果集: 当查询没有结果时,
json_encode()会返回[](空数组),这是合理的,如果希望返回一个包含错误信息或状态码的 JSON,可以这样做:if (empty($usersArray)) { $jsonData = json_encode(['status' => 'error', 'message' => 'No users found']); } else { $jsonData = json_encode($usersArray); } -
处理 JSON 编码错误: 如果数组中包含无法编码为 JSON 的值(如资源类型),
json_encode()会返回null并产生一个E_WARNING级别的错误,可以使用json_last_error()和json_last_error_msg()来调试:$jsonData = json_encode($usersArray); if ($jsonData === false) { // 处理编码错误 $errorMsg = json_last_error_msg(); die("JSON 编码失败: " . $errorMsg); } -
美化 JSON 输出: 如果希望输出的 JSON 格式化(缩进),方便阅读,可以添加
JSON_PRETTY_PRINT选项:$jsonData = json_encode($usersArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
输出结果会带有缩进和换行。
-
只选择需要的字段: 在 SQL 查询中明确指定需要的字段 (
SELECT id, name, email ...),而不是使用SELECT *,这样可以减少数据传输量,提高性能,并避免返回敏感或不需要的字段。 -
处理 NULL 值:
json_encode()默认会将 PHP 的NULL转换为 JSON 的null,如果希望将NULL转换为空字符串 或其他值,可以在获取数据后进行遍历处理:foreach ($usersArray as &$user) { foreach ($user as &$value) {



还没有评论,来说两句吧...