WEB

[PHP]queryとprepareの違い/使い方

PHP勉強/初心者

PR

queryとprepareの違い/使い方

  • 実行するSQL文の中に変数などがある場合はprepareを使用する
  • 実行するSQL文が固定されている場合queryを使用する

prepare(PHP/MySQL)

  // DB接続用の関数を呼び出し
  $dbh = connectDb();
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

  // SQL文の実行
  $column = 'id';
  $sql = "select :column from table";
  $stmt = $dbh->prepare($sql);
  $stmt->setFetchMode(PDO::FETCH_ASSOC);
  $stmt->bindParam(':column', $column, PDO::PARAM_INT);
  $stmt->execute();

query(PHP/MySQL)

  // DB接続用の関数を呼び出し
  $dbh = connectDb();
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

  // SQL文の実行
  $sql = "select id from table";
  $stmt = $dbh->query($sql);

参考:prepareメソッド – PDOの利用 – PHP入門

取得した配列が多次元配列

fetchModeのデフォルトは$PDO::FETCH_BOTHに設定されているため、SQLを実行し取得した結果をforeachで配列に格納すると、テーブル名と割り振られた数字がキーとして重複した値を持ってしまう。

テーブル

mysql> SELECT * FROM table;
id | name
—-+——–
1 | たなか
2 | さとう
(2 行)

PDO::FETCH_BOTH(PHP/MySQL)

  // DB接続用の関数を呼び出し
  $dbh = connectDb();
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $columns = [];
  $sql = "select * from table";
  $stmt = $dbh->query($sql);
  foreach ($stmt as $row) {
    $columns[] = $row;
  }
  var_dump($columns);
array(4) {
  ["id"]=>
  int(1)
  [0]=>
  int(1)
  ["name"]=>
  string(9) "たなか"
  [1]=>
  string(9) "たなか"
}
array(4) {
  ["id"]=>
  int(2)
  [0]=>
  int(2)
  ["name"]=>
  string(9) "さとう"
  [1]=>
  string(9) "さとう"
}

PDO::FETCH_ASSOC(PHP/MySQL)

  // DB接続用の関数を呼び出し
  $dbh = connectDb();
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $columns = [];
  $sql = "select * from table";
  $stmt = $dbh->query($sql);
  $stmt->setFetchMode(PDO::FETCH_ASSOC);
  foreach ($stmt as $row) {
    $columns[] = $row;
  }
  var_dump($columns);
array(2) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(9) "たなか"
}
array(2) {
  ["id"]=>
  int(2)
  ["name"]=>
  string(9) "さとう"
}

参考:
PDOの真の力を開放する – PHPでデータベースを扱う(3): Architect Note

PHP – PDOのfetchModeを比較してみた – Qiita

この記事をシェアする

前の記事
次の記事

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この記事と関連性の高い記事