CodeZine(コードジン)

特集ページ一覧

PDOでサクサクDB開発

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/07/10 00:00
目次

execute

 これはプリペアドステートメントを実行するメソッドです。また、引数に配列の値を渡すことで、bind系メソッドの代理としても使えます。以下がサンプルです。

execute
try {
    $pdo = new PDO(
"mysql:host=localhost; dbname=pdotest", "root", "pass");
    $stmt = $pdo->prepare("SELECT * FROM CD WHERE ID = ?");
    $stmt->execute(array(5));
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare("SELECT * FROM CD WHERE ID = :ID");
    $stmt->execute(array(":ID" => 6));
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(:ID, :TITLE, :CONTENT)");
    $stmt->execute(array(
":ID" => 18, ":TITLE" => "Assoc", ":CONTENT" => "Assoc Music"));
    var_dump($pdo->query("SELECT * FROM CD WHERE ID = 18")
                 ->fetch(PDO::FETCH_ASSOC));

    echo "------------" . PHP_EOL;
    $stmt = null;
} catch (PDOException $e){
    var_dump($e->getMessage());
}

 PDOStatement::executeではステートメントの実行の他に配列の値をバインドできます。バインドできる値はbindParamなどで使える値と同じです。

 以下は上記の実行結果です。

result
array(3) {
    ["ID"]=>
    string(1) "5"
    ["TITLE"]=>
    string(6) "SLEEPY"
    ["CONTENT"]=>
    string(11) "SLEEPY SONG"
}
------------
array(3) {
    ["ID"]=>
    string(1) "6"
    ["TITLE"]=>
    string(9) "CHRISTMAS"
    ["CONTENT"]=>
    string(14) "CHRISTMAS SONG"
}
------------
array(3) {
    ["ID"]=>
    string(2) "18"
    ["TITLE"]=>
    string(5) "Assoc"
    ["CONTENT"]=>
    string(11) "Assoc Music"
}
------------

PDOStatementの主なメソッド(2/2)

fetch/fetchAll/fetchColumn

 これらはデータを取得する場合に使います。

  • fetchは1行単位で結果セットを取得します。結果セットの形式は引数に渡すPDOの定数で決まります。
  • fetchColumnは1行単位でカラムのインデックスを指定して結果を取得できます。引数にはカラムのインデックスが入ります。
  • fetchAllは全行取得する以外はfetchとほぼ同じです。

 使用できる引数についてはマニュアルを参照してください。

 以下がサンプルです。

fetch
try {
    $pdo = new PDO("mysql:host=localhost; dbname=pdotest",
                   "root", "pass");
    $stmt = $pdo->prepare("SELECT * FROM CD");
    $stmt->execute();

    var_dump($stmt->fetch(PDO::FETCH_ASSOC));
    var_dump($stmt->fetch(PDO::FETCH_OBJ));
    var_dump($stmt->fetch(PDO::FETCH_COLUMN));
    var_dump($stmt->fetchColumn(0));
    var_dump($stmt->fetchColumn(1));

    $stmt = null;

    $stmt = $pdo->prepare("SELECT * FROM CD");
    $stmt->execute();
    var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
} catch (PDOException $e){
    var_dump($e->getMessage());
}

 上記の実行結果は次のようになります。

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

 bind系のメソッドと、設定できる属性(後述します)をうまく使いこなすことで、表現の幅が広がります。面白い組合せがあったらぜひとも教えてください。

 次からは、いくつかのサンプルコードと実行結果を表示していますが、それらは常に初期化されていることに注意してください。

 また、今回はCZ_PDOというPDOアクセスクラスを作成しています。これは、CZ_PDO::getConnectionが呼び出されるたびに、データベースの中身を初期化してからPDOオブジェクトを返しています。よって、今後のサンプルに出てくる結果セットは毎回初期化されています。

 CZ_PDOクラスは次のような構成にしています。

cz_pdo
class CZ_PDO {

    private static $dsn = "sqlite::memory:";
    private static $user = null;
    private static $password = null;
    private static $options = array(
                        PDO::ATTR_PERSISTENT => true,
                    );

    public static function getConnection(){
        $pdo = new PDO(self::$dsn, self::$user,
                       self::$password, self::$options);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        self::initDB($pdo);
        return $pdo;
    }

    private static initDb(PDO $pdo){
        try {
            $pdo->exec(
file_get_contents(dirname(__FILE__) . "/db-schema.sql"));
        } catch (PDOException $e) {
            var_dump($e->getMessage());
        }
    }
}

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • ハタ(ハタ)

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

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5