SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

PDOでサクサクDB開発

データベースへのアクセスを抽象化するPHP Data Objectの利用


  • X ポスト
  • このエントリーをはてなブックマークに追加

PDOで設定できる属性(1/3)

 ここではPDOで設定できる属性(setAttribute/getAttributeなどで設定/取得できる値)について説明します。

結果セットを取得する際の設定項目

PDO::FETCH_LAZY

 PDO:FETCH_LAZYは結果セットの取得を、配列からアクセスしたりオブジェクトと同じようにアクセスしたりできる形で行います。

 結果セットの値は、0から始まる配列の添字か、連想配列キー、またはカラム名と同じオブジェクトのプロパティを利用して取得できます。

 これはPDO::FETCH_BOTHPDO::FETCH_OBJの組合せと考えてよいです。

fetch_lazy
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    $rows = $stmt->fetch(PDO::FETCH_LAZY);

    var_dump($rows->ID);
    var_dump($rows[0]);
    var_dump($rows["ID"]);
    var_dump($rows->TITLE);
    var_dump($rows[1]);
    var_dump($rows["TITLE"]);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の結果は以下になります。

result
string(1) "1"
string(1) "1"
string(1) "1"
string(5) "HAPPY"
string(5) "HAPPY"
string(5) "HAPPY"
object(PDORow)#3 (3) {
    ["ID"]=>
    string(1) "1"
    ["TITLE"]=>
    string(5) "HAPPY"
    ["CONTENT"]=>
    string(10) "HAPPY SONG"
}

PDO::FETCH_ASSOC

 PDO::FETCH_ASSOCは結果セットに対して連想配列と同じようにアクセスできる形で取得します。

 結果セットを取得するにはカラム名をキーとした配列にアクセスします。

fetch_assoc
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    $rows = $stmt->fetch(PDO::FETCH_ASSOC);

    var_dump($rows["ID"]);
    var_dump($rows["TITLE"]);
    var_dump($rows["CONTENT"]);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
string(1) "1"
string(5) "HAPPY"
string(10) "HAPPY SONG"
array(3) {
    ["ID"]=>
    string(1) "1"
    ["TITLE"]=>
    string(5) "HAPPY"
    ["CONTENT"]=>
    string(10) "HAPPY SONG"
}

PDO::FETCH_NAMED

 PDO::FETCH_NAMEDは結果セットをカラム名に行数をセットした配列で取得します。

fetch_named
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query(
"SELECT a.ID, b.ID, a.TITLE, b.TITLE FROM CD a,
 CD b WHERE a.ID = 1 and b.ID = 2");
    $rows = $stmt->fetch(PDO::FETCH_NAMED);

    var_dump($rows["ID"]);
    var_dump($rows["TITLE"]);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
}
array(2) {
    [0]=>
    string(5) "HAPPY"
    [1]=>
    string(3) "SAD"
}
array(2) {
    ["ID"]=>
    array(2) {
        [0]=>
        string(1) "1"
        [1]=>
        string(1) "2"
    }
    ["TITLE"]=>
    array(2) {
        [0]=>
        string(5) "HAPPY"
        [1]=>
        string(3) "SAD"
    }
}

PDO::FETCH_NUM

 PDO::FETCH_NUMは結果セットをカラムの順番に格納した配列を取得します。

fetch_num
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    $rows = $stmt->fetch(PDO::FETCH_NUM);

    var_dump($rows[0]);
    var_dump($rows[1]);
    var_dump($rows[2]);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
string(1) "1"
string(5) "HAPPY"
string(10) "HAPPY SONG"
array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(5) "HAPPY"
    [2]=>
    string(10) "HAPPY SONG"
}

PDO::FETCH_BOTH

 PDO::FETCH_BOTHは結果セットを配列でアクセスできる形で取得します。fetchで取得する時に何も引数に設定しない場合は、この結果セットがデフォルトで取得されます。結果セットへのアクセスはカラム名をキーとした配列か、カラムの番号でアクセスすることで結果セットの取得が可能です。

 PDO::FETCH_BOTHPDO::FETCH_NUMPDO::FETCH_ASSOCの組合せと考えてよいです。

fetch_both
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    $rows = $stmt->fetch(PDO::FETCH_BOTH);

    var_dump($rows[0]);
    var_dump($rows["ID"]);
    var_dump($rows[1]);
    var_dump($rows["TITLE"]);
    var_dump($rows[2]);
    var_dump($rows["CONTENT"]);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の結果は以下になります。

result
string(1) "1"
string(1) "1"
string(5) "HAPPY"
string(5) "HAPPY"
string(10) "HAPPY SONG"
string(10) "HAPPY SONG"
array(6) {
    ["ID"]=>
    string(1) "1"
    [0]=>
    string(1) "1"
    ["TITLE"]=>
    string(5) "HAPPY"
    [1]=>
    string(5) "HAPPY"
    ["CONTENT"]=>
    string(10) "HAPPY SONG"
    [2]=>
    string(10) "HAPPY SONG"
}

PDO::FETCH_OBJ

 PDO::FETCH_OBJは結果セットにカラム名と同名のプロパティを持つ匿名オブジェクトを取得します。PDOStatement::fetchObjectと同じ結果を返します。

fetch_obj
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    $rows = $stmt->fetch(PDO::FETCH_OBJ);

    var_dump($rows->ID);
    var_dump($rows->TITLE);
    var_dump($rows->CONTENT);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
string(1) "1"
string(5) "HAPPY"
string(10) "HAPPY SONG"
object(stdClass)#3 (3) {
    ["ID"]=>
    string(1) "1"
    ["TITLE"]=>
    string(5) "HAPPY"
    ["CONTENT"]=>
    string(10) "HAPPY SONG"
}

PDO::FETCH_BOUND

 PDO::FETCH_BOUNDbindParambindColumnを用いてPHP変数に割り当てを行い結果セットを取得します。PDO::FETCH_BOUNDの戻り値はtrueが返ります。

fetch_bound
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT ID, TITLE, CONTENT FROM CD");
    $stmt->bindColumn("ID", $id);
    $stmt->bindColumn("TITLE", $title);
    $stmt->bindColumn(3, $content);
    $rows = $stmt->fetch(PDO::FETCH_BOUND);

    var_dump($rows);
    var_dump($id, $title, $content);

    $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $title);
    $stmt->bindParam(3, $content);
    $rows = $stmt->fetch(PDO::FETCH_BOUND);

    var_dump($rows);
    var_dump($id, $title, $content);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
bool(true)
string(1) "1"
string(5) "HAPPY"
string(10) "HAPPY SONG"
bool(true)
string(1) "2"
string(3) "SAD"
string(8) "SAD SONG"

PDO::FETCH_COLUMN

 PDO::FETCH_COLUMNは取得したいカラム番号を指定してカラムの結果セットを取得します。

fetch_column
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    $rows = $stmt->fetchAll(PDO::FETCH_COLUMN, 2);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 PDO::FETCH_COLUMNではfetchAllを使用し全体を取得しています(もちろんfectでも取得可能)。

 また、上記の実行結果は以下になります。

result
array(7) {
    [0]=>
    string(10) "HAPPY SONG"
    [1]=>
    string(8) "SAD SONG"
    [2]=>
    string(10) "ANGRY SONG"
    [3]=>
    string(9) "LOVE SONG"
    [4]=>
    string(11) "SLEEPY SONG"
    [5]=>
    string(14) "CHRISTMAS SONG"
    [6]=>
    string(13) "NEW YEAR SONG"
}

PDO::FETCH_CLASS

 PDO::FETCH_CLASSでは任意のクラスに対して結果セットをマッピングして取得することが可能です。簡単なO/Rマッピング程度ならこの方法でいけるかもしれません。

fetch_class
class CDEntity {

    private $ID;
    private $TITLE;
    private $CONTENT;

    public function getId(){
        return $this->ID;
    }

    public function getTitle(){
        return $this->TITLE;
    }

    public function getContent(){
        return $this->CONTENT;
    }

    public function __get($name){
        $prop = strtoupper($name);
        return $this->$prop;
    }
}

try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");

    //PDO::FETCH_CLASSとマッピングを行うクラス両方を指定できます。
    $rows = $stmt->fetchAll(PDO::FETCH_CLASS, "CDEntity");

    $cd1 = $rows[0];
    $cd2 = $rows[1];
    var_dump($cd1->getId());
    var_dump($cd1->getTitle());
    var_dump($cd1->getContent());
    var_dump($cd2->id);
    var_dump($cd2->title);
    var_dump($rows[2]);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
string(1) "1"
string(5) "HAPPY"
string(10) "HAPPY SONG"
string(1) "2"
string(3) "SAD"
object(CDEntity)#5 (3) {
    ["ID:private"]=>
    string(1) "3"
    ["TITLE:private"]=>
    string(5) "ANGRY"
    ["CONTENT:private"]=>
    string(10) "ANGRY SONG"
}

PDO::FETCH_CLASSTYPE

 PDO::FETCH_CLASSTYPEPDO::FETCH_CLASSと同じように結果セットを任意のクラスにマッピングして取得しますが、PDO::CLASSTYPEは結果セットの最初のカラム名からクラスに対してマッピングします。

fetch_classtype
class CDEntity {

    private $ID;
    private $TITLE;
    private $CONTENT;

    public function getId(){
        return $this->ID;
    }

    public function getTitle(){
        return $this->TITLE;
    }

    public function getContent(){
        return $this->CONTENT;
    }

    public function __get($name){
        $prop = strtoupper($name);
        return $this->$prop;
    }
}

try {
    $pdo = CZ_PDO::getConnection();

    // SELECT文の一番最初にクラス名を設定しました。
    $stmt = $pdo->query("SELECT 'CDEntity', CD.* FROM CD");
    // fetchAllではなく、fetchでマッピングしてる点が
    // PDO::FETCH_CLASS単体で使う場合とは違います。
    $rows = $stmt->fetch(PDO::FETCH_CLASS|PDO::FETCH_CLASSTYPE);

    var_dump($rows->getId());
    var_dump($rows->TITLE);
    var_dump($rows->content);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
string(1) "1"
string(5) "HAPPY"
string(10) "HAPPY SONG"
object(CDEntity)#3 (3) {
    ["ID:private"]=>
    string(1) "1"
    ["TITLE:private"]=>
    string(5) "HAPPY"
    ["CONTENT:private"]=>
    string(10) "HAPPY SONG"
}

次のページ
PDOで設定できる属性(2/3)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ハタ(ハタ)

PHPの魅力に取り付かれた一人。現在はSeasar.PHPとしてSeasar(Java)をPHP5に移植する活動をしている。http://blog.xole.net/(ブログ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/433 2007/12/13 16:05

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング