首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP while 迴圈取得資料筆數與 JSON 輸出實務範例

     編輯:PHP 相關知識

在處理資料庫查詢結果時,常需同時取得資料陣列與總筆數。PHP 的 mysql_fetch_assoc (舊版) 或 mysqli_fetch_assoc/PDO::fetch 配合計數器是基本模式。本文提供實務範例並說明現代化寫法。

傳統 mysql 擴充寫法 (已棄用/移除)

<?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 移除,**生產環境嚴禁使用**。

現代 mysqli 物件導向寫法

<?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();
?>

PDO 通用寫法 (推薦)

<?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 輸出最佳實踐

// 中文不轉義、斜線不轉義、數值不加引號
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());
}

完整 API 回應範例

<?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);
}
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved