PDOStatementのその他のメソッド
他のサンプルでも使用しているものがありますので、ここでは他のサンプルで紹介しきれていないメソッドについて説明します。
bindParam/bindValue/bindColumn
bind系メソッドは前に紹介しましたが、もう少し詳しく見てみましょう。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->prepare( "INSERT INTO CD(ID, TITLE, CONTENT) VALUES(:ID, :TITLE, :CONTENT)"); $stmt->bindParam(":ID", $id, PDO::PARAM_INT); $stmt->bindParam(":TITLE", $title, PDO::PARAM_STR); $stmt->bindParam(":CONTENT", $content, PDO::PARAM_NULL); $id = 16; $title = "HEXDUMP"; $content = "Hex Dump Music"; $stmt->execute(); $stmt = $pdo->prepare( "INSERT INTO CD(ID, TITLE, CONTENT) VALUES(?, ?, ?)"); $stmt->bindValue(1, 17, PDO::PARAM_INT); $stmt->bindValue(2, "", PDO::PARAM_STR); $stmt->bindValue(3, null, PDO::PARAM_NULL); $stmt->execute(); echo "------------" . PHP_EOL; $stmt = null; $stmt = $pdo->prepare( "SELECT ID, TITLE, CONTENT FROM CD WHERE ID > ?"); $stmt->bindParam(1, $id); $id = 16; $stmt->execute(); var_dump($stmt->fetch(PDO::FETCH_ASSOC)); echo "------------" . PHP_EOL; $stmt = null; $stmt = $pdo->prepare( "SELECT ID, TITLE, CONTENT FROM CD WHERE ID > :ID"); $stmt->bindValue(":ID", 15); $stmt->execute(); var_dump($stmt->fetch(PDO::FETCH_ASSOC)); echo "------------" . PHP_EOL; $stmt = null; $stmt = $pdo->prepare( "SELECT ID, TITLE, CONTENT FROM CD WHERE ID = 16"); $stmt->execute(); $stmt->bindColumn("ID", $id, PDO::PARAM_STR); $stmt->bindColumn("TITLE", $title, PDO::PARAM_INT); $stmt->bindColumn("CONTENT", $content, PDO::PARAM_NULL); $stmt->fetch(); var_dump($id, $title, $content); echo "------------" . PHP_EOL; $stmt = null; $stmt = $pdo->prepare( "SELECT id, title, content FROM CD WHERE ID = 17"); $stmt->execute(); $stmt->bindColumn(1, $id, PDO::PARAM_INT); $stmt->bindColumn(2, $title, PDO::PARAM_STR); $stmt->bindColumn(3, $content); $stmt->fetch(); var_dump($id, $title, $content); } catch (PDOException $e){ var_dump($e->getMessage()); }
bindを行うメソッドは第3引数にデータの型を指定することが可能です。
バインドを行う際に空文字("")とPHPのNULLを扱うときは、この第3引数を正しく設定しておく必要があると言えます。バインドの値は第3引数の値で確定するので、間違ったデータを格納せずに済みます。
また、SELECT
した結果の値にも影響されるので、正しくデータを扱う際は必ず指定しましょう。
上記の実行結果は以下です。
------------ array(3) { ["ID"]=> string(2) "17" ["TITLE"]=> string(0) "" ["CONTENT"]=> NULL } ------------ array(3) { ["ID"]=> string(2) "16" ["TITLE"]=> string(7) "HEXDUMP" ["CONTENT"]=> NULL } ------------ string(2) "16" int(0) NULL ------------ int(17) string(0) "" NULL
getColumnMeta
PDOStatement::getColumnMeta
は指定したカラムの詳細情報を取得することができます。以下にサンプルを示します。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); for($i = 0; $i < $stmt->columnCount(); $i++){ var_dump($stmt->getColumnMeta($i)); } } catch (PDOException $e) { var_dump($e->getMessage()); }
PDOStatement::getColumnMeta
がサポートされていないドライバもあるので注意してください。以下はMySQLでの出力結果です。
array(6) { ["native_type"]=> string(4) "LONG" ["flags"]=> array(2) { [0]=> string(8) "not_null" [1]=> string(11) "primary_key" } ["name"]=> string(2) "ID" ["len"]=> int(11) ["precision"]=> int(0) ["pdo_type"]=> int(2) } array(6) { ["native_type"]=> string(10) "VAR_STRING" ["flags"]=> array(0) { } ["name"]=> string(5) "TITLE" ["len"]=> int(100) ["precision"]=> int(0) ["pdo_type"]=> int(2) } array(6) { ["native_type"]=> string(10) "VAR_STRING" ["flags"]=> array(0) { } ["name"]=> string(7) "CONTENT" ["len"]=> int(200) ["precision"]=> int(0) ["pdo_type"]=> int(2) }
columnCount/rowCount
PDOStatement::columnCount
はSELECT
時のカラム数を返します。PDOStatement::rowCount
はUPDATE
やDELETE
時の変更された行数を返します。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); var_dump($stmt->fetchObject()); echo "column count: " . $stmt->columnCount() . PHP_EOL; echo "row count: " . $stmt->rowCount() . PHP_EOL; $stmt = null; $stmt = $pdo->query("DELETE FROM CD"); echo "column count: " . $stmt->columnCount() . PHP_EOL; echo "row count: " . $stmt->rowCount() . PHP_EOL; } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
object(stdClass)#3 (3) { ["ID"]=> string(1) "1" ["TITLE"]=> string(5) "HAPPY" ["CONTENT"]=> string(10) "HAPPY SONG" } column count: 3 row count: 0 column count: 0 row count: 7
次は、PDOで設定できる各オプション(設定項目)について説明します。