最終更新:2014-10-30 (木) 15:42:55 (3459d)
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の例
DBMS | DSN |
MySQL | mysql:host=localhost; dbname=pdotest |
PostgreSQL | pgsql:host=localhost; dbname=pdotest |
Firebird | firebird:dbname=localhost:pdotest.fdb |
Oracle | oci:dbname=/localhost/pdotest |
Sybase? | dblib:host=localhost; dbname=pdotest |
SQLite 2 | sqlite2:/path/to/pdotest.sq2 |
SQLite 2(memory) | sqlite2::memory: |
SQLite 3 | sqlite:/path/to/pdotest.sq3 |
SQLite 3(memory) | sqlite::memory |
- ODBC
- DB2
- Informix?
- SQL Server
Shift_JISによるSQLインジェクション
プレースホルダにPHP変数を代入するタイミング
- bindParam - execute()実行時
- bindValue - bindValue()実行時