端くれプログラマの備忘録 PHP [PHP] PDOでクラスをフェッチする場合のfetch()とfetchAll()の挙動

[PHP] PDOでクラスをフェッチする場合のfetch()とfetchAll()の挙動

きちんと理解するためにサンプルコードを書いて挙動を確かめてみた。

サンプルコード

// クラス定義
class Post {
    var $id;
    var $title;
};

// テストプログラム
$dsn = "mysql:host=localhost;dbname=pdo_test";
$username = "pdo_test";
$password = "pdo_test";

try {
    $pdo = new PDO($dsn, $username, $password, array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,        // 失敗したら例外を投げる
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_CLASS,   //デフォルトのフェッチモードはクラス
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',   //MySQL サーバーへの接続時に実行するコマンド
    ));

    // PDO::fetch()でカレント1件を取得
    $id = 1;
    $stmt = $pdo->prepare('SELECT* FROM posts WHERE id = :id');
    $stmt->bindParam(':id', $id, PDO::PARAM_STR);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Post');
    $post = $stmt->fetch();     //クラスのインスタンスを直接取得
    print_r($post);
    /*
    Post Object
    (
        [id] => 1
        [title] => test01
    )
     */

    // PDO::fetch()を繰り返し呼んでヒット全件を取得
    $stmt = $pdo->prepare('SELECT* FROM posts where id > 0');
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Post');
    while ($post = $stmt->fetch()){     //クラスのインスタンスを直接取得
        print_r($post);
    }
    /*
    Post Object
    (
        [id] => 1
        [title] => test01
    )
    Post Object
    (
        [id] => 2
        [title] => test02
    )
    Post Object
    (
        [id] => 3
        [title] => test03
    )
    Post Object
    (
        [id] => 4
        [title] => test04
    )
    Post Object
    (
        [id] => 5
        [title] => test05
    )
    Post Object
    (
        [id] => 6
        [title] => test06
    )
     */

    // PDO::fetchAll()でヒット全件をインスタンスの配列として取得
    $stmt = $pdo->prepare('SELECT* FROM posts where id > 0');
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Post');
    $posts = $stmt->fetchAll();     //クラスのインスタンスの配列を取得
    print_r($posts);
    /*
    Array
    (
        [0] => Post Object
            (
                [id] => 1
                [title] => test01
            )
        [1] => Post Object
            (
                [id] => 2
                [title] => test02
            )
        [2] => Post Object
            (
                [id] => 3
                [title] => test03
            )
        [3] => Post Object
            (
                [id] => 4
                [title] => test04
            )
        [4] => Post Object
            (
                [id] => 5
                [title] => test05
            )
        [5] => Post Object
            (
                [id] => 6
                [title] => test06
            )
    )
     */

    // PDO::fetch()でヒット1件だけの場合も配列が返る
    $stmt = $pdo->prepare('SELECT* FROM posts where id = 1');
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Post');
    $posts = $stmt->fetchAll();     //クラスのインスタンスの配列を取得
    print_r($posts);
    /*
    Array
    (
        [0] => Post Object
            (
                [id] => 1
                [title] => test01
            )

    )
     */
   
} catch (PDOException $e) {
    echo 'PDO exception: ' . $e->getMessage();
    exit;
}
echo 'Succeeded!';

参考サイト

PHP: PDO::setAttribute – Manual
http://php.net/manual/ja/pdo.setattribute.php

PDO::ATTR_ERRMODE: エラーレポート
– PDO::ERRMODE_SILENT: エラーコードのみ設定する
– PDO::ERRMODE_WARNING: E_WARNING を発生させる
– PDO::ERRMODE_EXCEPTION: 例外を投げる

PHP: PDOStatement::fetch – Manual
http://php.net/manual/ja/pdostatement.fetch.php

PDO::ATTR_DEFAULT_FETCH_MODE: デフォルトのフェッチモード
– PDO::FETCH_ASSOC: は、結果セットに 返された際のカラム名で添字を付けた配列を返します。
– PDO::FETCH_BOTH (デフォルト): 結果セットに返された際のカラム名と 0 で始まるカラム番号で添字を付けた配列を返します。
– PDO::FETCH_BOUND: TRUE を返し、結果セットのカラムの値を PDOStatement::bindColumn() メソッドでバインドされた PHP 変数に代入します。
– PDO::FETCH_CLASS: 結果セットのカラムがクラス内の名前付けされたプロパティにマッピングされている、要求されたクラスの新規インスタンスを返します。 fetch_style に PDO::FETCH_CLASSTYPE が 含まれている場合 (例: PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE) は、最初のカラムの値から クラス名を決定します。
– PDO::FETCH_INTO: 結果セットのカラムがクラス内の名前付けされたプロパティに マッピングされている要求された既存インスタンスを更新します。
– PDO::FETCH_LAZY: PDO::FETCH_BOTH とPDO::FETCH_OBJの 組合せで、オブジェクト変数名を作成します。
– PDO::FETCH_NAMED: PDO::FETCH_ASSOC と同じ形式の配列を返します。 ただし、同じ名前のカラムが複数あった場合は、そのキーが指す値は、 同じ名前のカラムのすべての値を含む配列になります。
– PDO::FETCH_NUM: 結果セットに返された際の 0 から始まるカラム番号を添字とする配列を返します。
– PDO::FETCH_OBJ: 結果セットに返された際のカラム名と同名のプロパティを有する 匿名のオブジェクトを返します。

PHP: MySQL (PDO) – Manual
http://php.net/manual/ja/ref.pdo-mysql.php

PDO::MYSQL_ATTR_INIT_COMMAND: MySQL サーバーへの接続時に実行するコマンド

PHP: 定義済み定数 – Manual
http://php.net/manual/ja/pdo.constants.php

PDO::PARAM_BOOL (integer): ブールデータ型を表します。
PDO::PARAM_NULL (integer): SQL NULL データ型を表します。
PDO::PARAM_INT (integer): SQL INTEGER データ型を表します。
PDO::PARAM_STR (integer): SQL CHAR, VARCHAR, または他の文字列データ型を表します。
PDO::PARAM_LOB (integer): SQL ラージオブジェクト型を表します。