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()); } } }
