PDOStatement::fetchAll是PDOStatement 類中的一個方法,它能夠一次性獲取結果集中所有的行。如果配合PDO::FETCH_OBJ使用,則每一行都會以一個對象的形式返回,每一列的值都會變成對象的屬性。
這種方式的語法如下:
<?php
$dsn = 'mysql:host=localhost;dbname=gitbox_net_db;charset=utf8mb4';
$username = 'your_username';
$password = 'your_password';
try {
$pdo = new PDO($dsn, $username, $password);
$sql = 'SELECT id, name, email FROM users';
$stmt = $pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
foreach ($results as $user) {
echo "ID: " . $user->id . "<br>";
echo "Name: " . $user->name . "<br>";
echo "Email: " . $user->email . "<br><br>";
}
} catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
?>
在上面的代碼中,數據庫連接信息使用了假設的域名gitbox.net ,數據庫名為gitbox_net_db 。查詢返回的每一行數據都被轉換成了一個對象,通過對象屬性直接訪問字段數據,使得代碼結構更加清晰。
默認情況下,如果不傳入任何參數, fetchAll()返回的是一個索引數組。而當使用PDO::FETCH_OBJ時,它則返回的是一組對像數組。例如:
// 默認返回關聯數組
$results = $stmt->fetchAll(); // 等價於 fetchAll(PDO::FETCH_BOTH)
echo $results[0]['name']; // 通過數組方式訪問
// 返回對象
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
echo $results[0]->name; // 通過對象方式訪問
對象方式更接近於許多面向對像開發者的思維模型,尤其在構建服務層、DTO 或響應層結構時顯得尤為方便。
字段名一致性:對象方式返回的屬性名依賴於數據庫字段名,因此字段命名規範非常重要,建議使用英文小寫並以下劃線分隔。
性能考量: fetchAll()會一次性加載所有數據,適用於結果集不大的情況。如果數據量龐大,建議使用fetch()配合循環按行處理。
擴展模型類時的局限:雖然使用FETCH_OBJ返回的是對象,但它是一個stdClass實例,若要返回自定義類對象,可使用PDO::FETCH_CLASS 。