execute
これはプリペアドステートメントを実行するメソッドです。また、引数に配列の値を渡すことで、bind
系メソッドの代理としても使えます。以下がサンプルです。
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
などで使える値と同じです。
以下は上記の実行結果です。
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
とほぼ同じです。
使用できる引数についてはマニュアルを参照してください。
以下がサンプルです。
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()); }
上記の実行結果は次のようになります。
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
クラスは次のような構成にしています。
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()); } } }