最終更新:2014-10-30 (木) 15:42:55 (3459d)  

PHP/PDO
Top / PHP / PDO

PHP Data Objects

http://jp2.php.net/manual/ja/book.pdo.php

  • PDO は PHP 5.1 以降にバンドルされており、PHP 5.0? では PECL 拡張モジュールとして使用可能です。
  • PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。

コンストラクタ

  $pdo = new PDO("mysql:host=localhost; dbname=pdotest","root", "password");

PDO

PDO::query

  • SQL文を実行し、その結果をPDOStatementに格納 - SELECT文
  • PDO::queryは一見PDO::prepareと同じような動きをしますが、PDOStatement::executeを実行しなくともPDOStatement::executeの発行後のSQLの結果セットをPDOStatementに格納します。
        $stmt = $pdo->query("SELECT * FROM CD");
    
        // 一つめの結果セットを取得します。
        $rows1 = $stmt->fetch(PDO::FETCH_ASSOC);
        var_dump($rows1);
    
        // 同様に2つめの結果セットを取得
        $rows2 = $stmt->fetch(PDO::FETCH_ASSOC);
        var_dump($rows2);
    
        // 結果セットの形式を変更することもできます。
        $rows3 = $stmt->fetch(PDO::FETCH_OBJ);
        var_dump($rows3);

PDO::exec

  • SQL文を発行し、変更を行った行数を返す - INSERT文?UPDATE文?DELETE文?
  • SELECT文の結果は返されません。通常はPDO::prepareを行い、PDOStatement::executeすることが多いでしょう。
        $count = $pdo->exec("UPDATE CD SET TITLE = 'BERCEUSE',
                            CONTENT = 'CRADLE SONG' WHERE ID = 5");
        echo "Update Count: " . $count . PHP_EOL;

PDO::prepare

  • SQLを解釈し、PDOStatementのオブジェクトを返します。
  • PDO::prepareは一度SQLを解釈しキャッシュしているので、複数回実行されるようなSQLを発行する場合に向いています。
        // PDO::prepareによってPDOStatementオブジェクトが返されます。
        $stmt = $pdo->prepare( "INSERT INTO CD(ID, TITLE, CONTENT) VALUES(?, ?, ?)");
        // パラメータ '?' に値を設定し実行(execute)します。
        $stmt->bindValue(1, 10);
        $stmt->bindValue(2, "Hoge");
        $stmt->bindValue(3, "Hoge Song");
        $stmt->execute();
    
        // 他のパラメータを代入し実行します。
        $stmt->bindValue(1, 11);
        $stmt->bindValue(2, "Foo");
        $stmt->bindValue(3, "Foo Song");
        $stmt->execute();
    
        //PDOStatementオブジェクトを開放します。
        $stmt = null;
    
        // SELECT文にも使えます。
        $stmt2 = $pdo->prepare("SELECT * FROM CD WHERE ID = :ID");
        $stmt2->bindValue(":ID", 10);
        $stmt2->execute();
        var_dump($stmt2->fetch(PDO::FETCH_ASSOC));
    
        $stmt2->bindValue(":ID", 11);
        $stmt2->execute();
        var_dump($stmt2->fetch(PDO::FETCH_ASSOC));
    
        $stmt = $pdo->query("SELECT * FROM CD");
    
        // 一つめの結果セットを取得します。
        $rows1 = $stmt->fetch(PDO::FETCH_ASSOC);
        var_dump($rows1);
    
        // 同様に2つめの結果セットを取得
        $rows2 = $stmt->fetch(PDO::FETCH_ASSOC);
        var_dump($rows2);
    
        // 結果セットの形式を変更することもできます。
        $rows3 = $stmt->fetch(PDO::FETCH_OBJ);
        var_dump($rows3);
     

メモ

  • like検索の時の%%とかも引数の方に含める。プレースホルダは値全体に対して使う。
    //$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
    $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");

PDOStatement

PDOStatement::execute

  • プリペアドステートメントを実行するメソッド
     $stmt->execute();

PDOStatement::fetch

  • 結果セットから次の行を取得する

PDOStatement::fetchAll

  • 全ての結果行を含む配列を返す

対応

DSNの例

DBMSDSN
MySQLmysql:host=localhost; dbname=pdotest
PostgreSQLpgsql:host=localhost; dbname=pdotest
Firebirdfirebird:dbname=localhost:pdotest.fdb
Oracleoci:dbname=/localhost/pdotest
Sybase?dblib:host=localhost; dbname=pdotest
SQLite 2sqlite2:/path/to/pdotest.sq2
SQLite 2(memory)sqlite2::memory:
SQLite 3sqlite:/path/to/pdotest.sq3
SQLite 3(memory)sqlite::memory

Shift_JISによるSQLインジェクション

プレースホルダにPHP変数を代入するタイミング

  • bindParam - execute()実行時
  • bindValue - bindValue()実行時

ATTR_EMULATE_PREPARES

関連

参考