たけるのプログラミング

作ったものとか、気ままにアップします。

【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: PDO::exec - Manual

<?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: PDO::query - Manual

<?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 準備

PHP: PDO::prepare - Manual

  • 複数回実行されるSQL文やプレースホルダがある時に有効
  • SQLインジェクションからの保護に有効
  • 返り値はPDOStatementオブジェクト、falseまたはPDOException
  • SQL文にて 名前付きパラメータや?パラメータを使用することができる
PDOStatement::execute 実行

PHP: PDOStatement::execute - Manual

  • prepareのプレースホルダ部分をバインドするために、引数として配列を渡す。他にbindParam()やbindValue()を使用する方法もある。
  • 返り値は成功した時にtrue、失敗した時にfalseを返す