PHPデータベース入門に入る。……とその前にPuTTYの替わりにRLoginでVagrantに簡単接続。

CakePHP入門に備え、一日一日ステップアップをしております。今日はPHPデータベース入門を学んでいく。


http://dotinstall.com/lessons/basic_php_db/


第一回の講義では、ターミナルに複数のタブを立ち上げ片方でMySQLをもう一方でPHPビルトインWebサーバーをモニタしていく、とのこと。なんとMacには、タブのついたsshターミナルがある。すごい。PuTTYで複数ウインドウを立ち上げるのも考えたができたら一つの画面に抑えたい。そういうツールはもちろんWindowsにもある。Poderosaとか、RLoginとか。海外製のもあるけど、日本語に対応してなかったりする。Poderosaはいいんだけど、最近活気づいているRLoginも使ってみよう。


難しいのはsshでつなぐ設定。慣れれば簡単だが、なれるまでは一苦労だと思う。

  1. vagrant ssh-configでIdentify Keyの場所をコピーしておく
  2. RLoginの新規サーバー接続設定では、プロトコルssh、サーバーアドレスは127.0.0.1、ポートは2222、SSH Identify KeyにうえでコピーしたIdentify Keyを選択。
  3. 保存して接続。認証キーをキャッシュするので"y"を選んで保存する。すると起動できる。

Poderosaでも同じ。プロトコル、アドレス、ポート、SSH Identify Keyを入れれば接続できるようになります。PoderosaとRLoginの違いはなんだろう、好み……かな?


置いといて、PHPDB入門の続き、2回めから。

  1. 講義用のDB、テーブル、ユーザーを作成。
  2. PDOで接続。new PDO(DSN, USENAME, PASSWORD)でPDOオブジェクトが作られる。setAttributeでExceptionを出すように設定する。
  3. exec()、接続を切る方法。exec()にSQL文を渡す。接続をきるには、PDOオブジェクトをnullとするだけ。例えば $db=null;
  4. prepare():exec→結果を返さない・安全、query→結果を返す・安全・一回のみ実行、prepare→結果を返す・安全対策必要・複数回実行する。prepareでは渡される値は「?」とする。実行するとステートメントが帰ってくる。ステートメントのメソッドexecuteに配列の形で値を渡す。PDOオブジェクトのメソッド、lastInsertIdを使うと最後に挿入されたID値を取り出せる。
  5. prepare()による名前付きパラメータ:?の替わりに「:name」のようにコロンを付けてexecute時に値を渡せる。渡すパラメータが多いときに便利。
  6. bindValue():prepareの引数に値を結びつける。その後引数無しでexecuteを実行すると、結び付けられた値を与えてSQLを実行する。似たようなデータを複数つくるのに便利。for、foreachなどと相性が良い。
  7. bindParam():bindValueと似ているが、prepareの引数と変数とを結びつける。bindValueでは異なる値を与える度にbindVlaue次いでexecuteを呼び出す必要があるが、bindParamでは変数の値を変えて、executeするだけで良い。便利。
  8. query()で全件抽出:fetchAll(PDO::FETCH_ASSOC)で全レコードをKey-Valueペアの配列で返すので、foreachなどで処理する。rowCountで件数を取得できる。
  9. 条件付き抽出:prepareをつかってwhere句のパラメータに渡すやりかた。limitなどに渡す場合は数値で渡す必要があるので、bindValueを使う。
  10. FETCH_CLASS:DBからデータを取得する時に定義済みのクラスオブジェクトとして取得する。なお、カラムはすべてpublicで同じ名前のフィールドとして解釈されるので、class定義で同名のpublicプロパティの定義は不要。privateにしたいときなどには定義する必要がある。
  11. レコード更新、削除:prepareを使って"update users set ..."で更新、"delete from users where..."で削除。
  12. トランザクション:beginTransaction, commit, rollback(これは例外処理で使う)

13/13完了

覚えておくべきは、PDOでの接続の定型文。

define('DB_DATABASE', 'DBの名前');
define('DB_USERNAME', 'DBアクセスユーザー名');
define('DB_PASSWORD', 'パスワード');
define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE);

try {
  $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
  $db->setAttribute(PDO_ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // ここから下にやりたいことを書く。

 $db = null;
} catch (PDOException $e) {

  echo $e->getMessage();
  exit;
}