【PHP】データベース周りをフレームワークに頼りすぎていたのでPDOについてもう一度復習する【その1】
optionなど詳しい仕様はドキュメントを参照
PHP: PDO - Manual
PHP: PDOStatement - Manual
PDOオブジェクトを生成する
PHP: PDO::__construct - Manual
<?php //データソース $dsn = 'mysql:dbname=pdo_test;host=localhost;charset=utf8'; //ユーザー名 $user = 'root'; //パスワード $password = 'root'; //第4引数にオプションも追加することができる try { $db = new PDO($dsn,$user,$password); }catch(PDOException $e){ echo $e->getMessage(); } ?>
PDO::exec
<?php $exec_count = $db->exec('INSERT INTO members SET name="DwightHoward", number=39, position="center", age=36'); //1と表示される echo $exec_count; ?>
- SQLを実行し、返り値として更新か削除された行数を返す
- SELECT文は対応していない
- SELECT文を実行したいなら、PDO:query() か PDO:prepare()とその返り値であるPDOSTatementオブジェクトのexecute()を利用する
PDO::query
<?php //PDOStatementオブジェクトを取得 $pdo_stm = $db->query('SELECT * FROM members'); //PDOStatementオブジェクトのfetchメソッドを使用 var_dump($pdostm->fetch()); ?>
- 返り値はPDOStatementオブジェクト、失敗したらfalseを返す
- プレースホルダを指定しない時(SQLが固定)に使用する。
- 複数回SQL文を実行したい時、SQL文にプレースホルダがある時は、PDO:prepare()とその返り値であるPDOStatementオブジェクトのexecute()
PDOStatement::fetch
PHP: PDOStatement::fetch - Manual
- SQLの実行結果セットの次の一行を取得する
さっきのvar_dumpの出力結果のfetch()をfetchAll()に変えると以下のような返り血となる
array(10) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["name"]=> string(11) "LebronJames" [1]=> string(11) "LebronJames" ["number"]=> string(1) "6" [2]=> string(1) "6" ["position"]=> string(7) "forward" [3]=> string(7) "forward" ["age"]=> string(2) "37" [4]=> string(2) "37" }
つまり
var_dump($pdostm->fetch()); var_dump($pdostm->fetch());
と実行すると
array(10) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["name"]=> string(11) "LebronJames" [1]=> string(11) "LebronJames" ["number"]=> string(1) "6" [2]=> string(1) "6" ["position"]=> string(7) "forward" [3]=> string(7) "forward" ["age"]=> string(2) "37" [4]=> string(2) "37" } array(10) { ["id"]=> string(1) "2" [0]=> string(1) "2" ["name"]=> string(14) "CarmeloAnthony" [1]=> string(14) "CarmeloAnthony" ["number"]=> string(1) "7" [2]=> string(1) "7" ["position"]=> string(7) "forward" [3]=> string(7) "forward" ["age"]=> string(2) "37" [4]=> string(2) "37" }
PDOStatement::fetchAll
PHP: PDOStatement::fetchAll - Manual
- SQLの実行結果セットの残りの行すべてを取得
array(5) { [0]=> array(10) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["name"]=> string(11) "LebronJames" [1]=> string(11) "LebronJames" ["number"]=> string(1) "6" [2]=> string(1) "6" ["position"]=> string(7) "forward" [3]=> string(7) "forward" ["age"]=> string(2) "37" [4]=> string(2) "37" } [1]=> array(10) { ["id"]=> string(1) "2" [0]=> string(1) "2" ["name"]=> string(14) "CarmeloAnthony" [1]=> string(14) "CarmeloAnthony" ["number"]=> string(1) "7" [2]=> string(1) "7" ["position"]=> string(7) "forward" [3]=> string(7) "forward" ["age"]=> string(2) "37" [4]=> string(2) "37" } [2]=> array(10) { ["id"]=> string(1) "3" [0]=> string(1) "3" ["name"]=> string(12) "YutaWatanabe" [1]=> string(12) "YutaWatanabe" ["number"]=> string(2) "18" [2]=> string(2) "18" ["position"]=> string(7) "forward" [3]=> string(7) "forward" ["age"]=> string(2) "27" [4]=> string(2) "27" } [3]=> array(10) { ["id"]=> string(1) "4" [0]=> string(1) "4" ["name"]=> string(9) "ChrisPaul" [1]=> string(9) "ChrisPaul" ["number"]=> string(1) "3" [2]=> string(1) "3" ["position"]=> string(5) "guard" [3]=> string(5) "guard" ["age"]=> string(2) "37" [4]=> string(2) "37" } [4]=> array(10) { ["id"]=> string(1) "5" [0]=> string(1) "5" ["name"]=> string(12) "DwightHoward" [1]=> string(12) "DwightHoward" ["number"]=> string(2) "39" [2]=> string(2) "39" ["position"]=> string(6) "center" [3]=> string(6) "center" ["age"]=> string(2) "36" [4]=> string(2) "36" } }
PDO::prepare と PDOStatement::execute
<?php //ユーザーがnameにYutaWatanabeを指定したとする。 //YutaWatanabeに関する行を取得する。 $player_name = "YutaWatanabe"; //PDOStatementオブジェクトを取得、SQL文を"準備" $pdo_stm = $db->prepare('SELECT * FROM members WHERE name = ? '); //PDOStatementオブジェクトのexecuteメソッドを"実行" //?にYutaWatanabeをバインドする $isSuccess = $pdo_stm->execute(array($player_name)); //取得したデータを表示してみる var_dump($pdo_stm->fetch()); //実行が成功したか表示してみる var_dump($isSuccess); ?>
実行結果
array(10) { ["id"]=> string(1) "3" [0]=> string(1) "3" ["name"]=> string(12) "YutaWatanabe" [1]=> string(12) "YutaWatanabe" ["number"]=> string(2) "18" [2]=> string(2) "18" ["position"]=> string(7) "forward" [3]=> string(7) "forward" ["age"]=> string(2) "27" [4]=> string(2) "27" } bool(true)
PDO::prepare 準備
- 複数回実行されるSQL文やプレースホルダがある時に有効
- SQLインジェクションからの保護に有効
- 返り値はPDOStatementオブジェクト、falseまたはPDOException
- SQL文にて 名前付きパラメータや?パラメータを使用することができる
PDOStatement::execute 実行
PHP: PDOStatement::execute - Manual
- prepareのプレースホルダ部分をバインドするために、引数として配列を渡す。他にbindParam()やbindValue()を使用する方法もある。
- 返り値は成功した時にtrue、失敗した時にfalseを返す