Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. PDOStatement::fetch() / fetchAll()

PDOStatement::fetch() / fetchAll()対応: PHP 5(2004)

プリペアドステートメントの実行結果からデータを取得するメソッドです。1行ずつ取得する『fetch()』と、全行をまとめて取得する『fetchAll()』を用途に応じて使い分けます。

構文
// 結果セットから1行取得します。
$stmt->fetch($mode);

// 結果セットの全行を取得します。
$stmt->fetchAll($mode);

// 単一カラムの値を取得します。
$stmt->fetchColumn($column_number);

// 影響を受けた行数を取得します。
$stmt->rowCount();
メソッド一覧
メソッド概要
fetch($mode)結果セットから次の1行を取得します。行がなくなると『false』を返します。
fetchAll($mode)結果セットの全行を配列として一括取得します。大量のデータでは『fetch()』をループで使うほうがメモリ効率が良くなります。
fetchColumn($column)結果セットの次の行から指定したカラム番号の値だけを返します。引数を省略すると最初のカラムの値を返します。
rowCount()直前のSQL文で影響を受けた行数を返します。INSERT・UPDATE・DELETEの結果確認に使用します。
フェッチモード一覧
定数概要
PDO::FETCH_ASSOCカラム名をキーとした連想配列で返します。最もよく使われるモードです。
PDO::FETCH_NUMカラム番号をキーとした数値添字配列で返します。
PDO::FETCH_BOTH連想配列と数値添字配列の両方で返します。デフォルトのモードです。
PDO::FETCH_OBJカラム名をプロパティとした無名オブジェクトで返します。
PDO::FETCH_CLASS指定したクラスのインスタンスとして返します。
PDO::FETCH_COLUMN指定したカラムの値だけを配列で返します。『fetchAll()』で使用します。
サンプルコード
<?php
// fetch() で1行ずつ取得します。
$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE active = :active");
$stmt->execute([':active' => 1]);

$user = $stmt->fetch(PDO::FETCH_ASSOC);
echo $user['name']; // 最初の行のユーザー名が出力されます。
echo $user['email']; // 最初の行のメールアドレスが出力されます。

// fetch() をループで使い、1行ずつ処理します。
$stmt->execute([':active' => 1]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
	echo $row['name'] . ": " . $row['email'] . "\n";
}

// fetchAll() で全行をまとめて取得します。
$stmt = $pdo->prepare("SELECT * FROM users ORDER BY id");
$stmt->execute();
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo count($users) . "件のデータがあります。"; // 全行数が出力されます。

// FETCH_OBJ でオブジェクトとして取得します。
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_OBJ);
echo $user->name; // プロパティとしてアクセスできます。

// fetchColumn() で単一の値を取得します。
$stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE active = :active");
$stmt->execute([':active' => 1]);
$count = $stmt->fetchColumn();
echo "アクティブユーザー: " . $count . "人"; // 『アクティブユーザー: 42人』のように出力されます。

// fetchAll() で特定のカラムだけを配列として取得します。
$stmt = $pdo->prepare("SELECT email FROM users ORDER BY id");
$stmt->execute();
$emails = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
print_r($emails); // メールアドレスの一次元配列になります。

// rowCount() で更新件数を確認します。
$stmt = $pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = :id");
$stmt->execute([':id' => 1]);
if ($stmt->rowCount() > 0) {
	echo "ログイン日時を更新しました。";
} else {
	echo "該当するユーザーが見つかりません。";
}

// FETCH_CLASS でクラスのインスタンスとして取得します。
class User {
	public int $id;
	public string $name;
	public string $email;
}

$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = :id");
$stmt->execute([':id' => 1]);
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
$user = $stmt->fetch();
echo $user->name; // Userクラスのインスタンスとして取得できます。
概要

『fetch()』は結果セットから1行ずつ取得し、『fetchAll()』は全行をまとめて取得します。大量のデータを扱う場合は『fetchAll()』を使うとメモリを大量に消費するため、『fetch()』をループで回して1行ずつ処理してください。

フェッチモードは接続時に『PDO::ATTR_DEFAULT_FETCH_MODE』で設定しておくと、毎回指定する手間が省けます。一般的には『PDO::FETCH_ASSOC』が最もよく使われ、カラム名で直感的にアクセスできるため便利です。

SQL文の準備と実行は『PDO::prepare() / execute()』で行い、データベースへの接続は『new PDO()』で行ってください。複数のSQLをまとめて実行する場合は『トランザクション』の使用を検討してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。