在處理資料庫查詢結果時,常需同時取得資料陣列與總筆數。PHP 的 mysql_fetch_assoc (舊版) 或 mysqli_fetch_assoc/PDO::fetch 配合計數器是基本模式。本文提供實務範例並說明現代化寫法。
<?php
$link = mysql_connect('localhost', 'root', 'pwd');
mysql_select_db('db');
$sql = "SELECT region_id, local_name FROM regions WHERE region_grade = 1";
$result = mysql_query($sql);
$i = 0;
$list = [];
while ($row = mysql_fetch_assoc($result)) {
$list[$i]['text'] = $row['local_name'];
$list[$i]['value'] = $row['region_id'];
$i++;
}
$json = json_encode($list);
echo $json;
?>
注意:mysql_* 函式自 PHP 5.5 棄用,PHP 7.0 移除,**生產環境嚴禁使用**。
<?php
$mysqli = new mysqli('localhost', 'root', 'pwd', 'db');
$mysqli->set_charset('utf8mb4');
$sql = "SELECT region_id, local_name FROM regions WHERE region_grade = 1";
$result = $mysqli->query($sql);
$list = [];
while ($row = $result->fetch_assoc()) {
$list[] = [
'text' => $row['local_name'],
'value' => $row['region_id'],
];
}
$result->free();
echo json_encode($list, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$mysqli->close();
?>
<?php
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'root', 'pwd', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
$stmt = $pdo->query("SELECT region_id, local_name FROM regions WHERE region_grade = 1");
$list = $stmt->fetchAll(); // 直接取得所有列
// 或逐行處理 (大量資料節省記憶體)
// $list = [];
// while ($row = $stmt->fetch()) { $list[] = [...]; }
echo json_encode($list, JSON_UNESCAPED_UNICODE);
?>
| 方式 | 程式碼 | 適用場景 |
|---|---|---|
| 計數器累加 | $count = 0; while($row=$stmt->fetch()) { $count++; ... } | 需逐行處理、資料量大避免 fetchAll |
| fetchAll 後 count | $rows = $stmt->fetchAll(); $count = count($rows); | 資料量中小、需隨機存取 |
| 額外 COUNT 查詢 | $cnt = $pdo->query("SELECT COUNT(*) FROM ...")->fetchColumn(); | 分頁查詢、只需總數不需明細 |
// 中文不轉義、斜線不轉義、數值不加引號
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
// 錯誤處理
$json = json_encode($data, JSON_THROW_ON_ERROR); // PHP 7.3+
// 或
$json = @json_encode($data, JSON_UNESCAPED_UNICODE);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('JSON encode error: ' . json_last_error_msg());
}
<?php
header('Content-Type: application/json; charset=utf-8');
try {
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$stmt = $pdo->query("SELECT region_id AS id, local_name AS name FROM regions WHERE region_grade = 1");
$data = $stmt->fetchAll();
echo json_encode([
'success' => true,
'count' => count($data),
'data' => $data,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} catch (Throwable $e) {
http_response_code(500);
echo json_encode([
'success' => false,
'message' => $e->getMessage(),
], JSON_UNESCAPED_UNICODE);
}
?>