あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

PHPいろいろ - SQL文の実行(MySQL)

さて、DB接続もできたことですし・・・

SQL文を実行していきましょう。

早速、前回のソースにSQLの実行文を付け足します。
※前回の内容はこちら→PHPいろいろ - DB(MySQL)につなごう!*番外編* - あずきみるくのあずきはニガテ - for Engineer


<html>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<head><title>PHP TEST</title></head>
<body>

<?php
// 別ファイルに記述しているDB設定情報ファイルを読み込む
require_once '../conf/db_conf.php';

try{
  // mySQLに接続
  $db = new PDO(DSN, DB_USER, DB_PWD);

  // プリペアドステートメントのエミュレートを無効化
  $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

  // エラーが発生した場合、例外がスローされるようにする
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  echo '<pre>';
  print 'データベースに接続しました<br>';

  // ---------------------------------------------ここから

  // SQL文の作成([:id]がプレースホルダー)
  $sql = 'SELECT * FROM emp WHERE empID = :id';

  $prepare = $db->prepare($sql); // プリペアドステートメント
  $prepare->bindValue('id', 1, PDO::PARAM_INT); // 値の設定
  $prepare->execute(); // 実行

  /*
   * [fetchAll]の引数について
   *  FETCH_NUM  : 結果を数値添え字配列で取得
   *  FETCH_ASSOC: 結果をカラム名をキーとした連想配列で取得
   *  FETCH_BOTH : 結果を数値添え字、カラム名、両方の配列で取得
   */
  $result = $prepare->fetchAll(PDO::FETCH_ASSOC);

  // 結果の表示
  print_r($result);

  echo '</pre>';

  // ---------------------------------------------ここまで

  // 例外が発生したらcatchします
}catch(PDOException $e){

  echo '接続できませんでした 理由: ' . $e->getMessage();

}
?>
</body>
</html>

・・・簡単だ。

実行結果はこちら。

f:id:azuki-milk-lush:20150206134136j:plain

とれた1件が配列になってますね。

結果の配列に関してはコード内に書いてあるとおり、いろんな取り方があるみたい。
でも、個人的にこの形が一番使いやすいと思ったので、あえて「FETCH_ASSOC」を使ってます。

気になる人はいろいろ試してみてくださいな。



プリペアドステートメントについて

プリペアドステートメントっていうのは、

SELECT * FROM emp WHERE empID = :id

みたいに、プレースホルダーを使った記述方法みたい。

これをすることで、以下の2つのメリットがあります。

①速度UP

SQL文の構文解析コンパイル、最適化の実行が最初の1回のみになるため、効率的。

②SQLインジェクションが防げる

SQLインジェクションとは、意図しない文字列を入力されることでSQLの実行結果が変わってしまうこと。
SQL文を最初に固めてしまうことで、意図しない文字列が来ても対処できる、ということかな?



ついでに言うと、このSQLも外だしにしておいたら、カラム名が変更になる、という出来事にも対処できるよね。

なんて思っちゃったり。

なんでも外に出して共通化しようとするあたりがJavaらーなのかもしれませんw
(世のJavaらー様、ごめんなさい)