前後端分離架構下,PHP 常需將資料庫查詢結果編碼為 JSON 回傳。本文提供使用 mysqli (推薦) 與舊版 mysql 兩種寫法,涵蓋單筆與多筆資料結構。
<?php
header('Content-Type: application/json; charset=utf-8');
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
if ($mysqli->connect_errno) {
http_response_code(500);
echo json_encode(['error' => 'Database connection failed: ' . $mysqli->connect_error]);
exit;
}
$mysqli->set_charset('utf8mb4');
// --- 多筆資料查詢 ---
$stmt = $mysqli->prepare('SELECT id, name, email FROM users WHERE status = ?');
$status = 1;
$stmt->bind_param('i', $status);
$stmt->execute();
$result = $stmt->get_result();
$users = [];
while ($row = $result->fetch_assoc()) {
$users[] = $row;
}
$stmt->close();
// 輸出結構:{ "dataList": [ {...}, {...} ] }
echo json_encode(['dataList' => $users], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$mysqli->close();
?>
<?php
// ... 連線同前 ...
$stmt = $mysqli->prepare('SELECT id, name, email FROM users WHERE id = ?');
$id = 123;
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
// 輸出結構:{ "jsonObj": {...} }
echo json_encode(['jsonObj' => $row], JSON_UNESCAPED_UNICODE);
} else {
http_response_code(404);
echo json_encode(['error' => 'User not found']);
}
$stmt->close();
$mysqli->close();
?>
<?php
// 需包含連線設定檔 conn.php,裡面建立 $link = mysql_connect(...)
// 並執行 mysql_select_db('dbname', $link); mysql_query('SET NAMES utf8', $link);
$sql = 'SELECT id, name FROM tbl_user'; // 多筆
// $sql = 'SELECT id, name FROM tbl_user WHERE id=1'; // 單筆
$result = mysql_query($sql);
if (!$result) {
die(json_encode(['error' => mysql_error()]));
}
if (strpos($sql, 'WHERE id=') !== false) {
// 單筆預期
$row = mysql_fetch_assoc($result);
echo json_encode(['jsonObj' => $row]);
} else {
// 多筆
$users = [];
while ($row = mysql_fetch_assoc($result)) {
$users[] = $row;
}
echo json_encode(['dataList' => $users]);
}
mysql_free_result($result);
mysql_close();
?>
{"jsonObj":{"id":"1","name":"lmw","email":"lmw@example.com"}}
{"dataList":[{"id":"1","name":"lmw"},{"id":"2","name":"xxj"},{"id":"3","name":"xxxj"}]}
header('Content-Type: application/json; charset=utf-8'); 讓前端正確解析。\uXXXX,減少傳輸體積且易閱讀。{"error":"message"},前端統一攔截。mysqli 或 PDO),絕不拼接變數進 SQL 字串。<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$stmt = $pdo->prepare('SELECT id, name FROM users WHERE status = ?');
$stmt->execute([1]);
$users = $stmt->fetchAll();
echo json_encode(['dataList' => $users], JSON_UNESCAPED_UNICODE);
?>