PHPでデータベースを使う時、今までのmysql〜系のコードは非推奨になっていました(知らなかった汗)代わりにPDOと呼ばれる作り方が用意されています。まずは基本的な部分を勉強していきたいと思います。
確認環境
- PHP 5.6.24
- Apache 2.4.6
- MySQL 5.7.x
データベースに接続する
お決まりのコードがあるようです。try〜catchでエラーなどに対応した状態になっています。
データベース名やパスワードなどは、外部に逃がして中身に固有の情報が入らないようにすると、あとからメンテナンスが便利なのは同じですね。
try{
$db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//ここにコードを記述していく
}catch (PDOException $e) {
echo $e->getMessage();
exit;
}用途に応じてコメンドが変わる
データベースにコマンドを送る時は、セキュリティに配慮しなければいけません。PDOでは、以下のように用途に応じてコマンドを使い分けるようです。
- exec(): 結果を返さない、安全なSQL
- query(): 結果を返す、安全、何回も実行されないSQL
- prepare(): 結果を返す、安全対策が必要、複数回実行されるSQL
この使い分けを見る限り、queryとprepareを使う事が大半なのかな、と思いました。exec()は、内部処理に使うのかな?
基本的な動き
データベースは、追加、編集、削除などありますが、基本的には以下のような動きになるでしょうか。
- PDOはクラスとして用意されています。newをして新しいインスタンスを作成する。
- exec()、query()、prepare()を用いて、SQL文を作成し、ステートメントと呼ばれる一時置き場に渡して処理する。
- ステートメントで生成された結果を配列やオブジェクトの形に変換して、変数に渡す
- 渡された変数を使って、foreachなどで回しながら表示する
【上記コードの続きです】
//ここにコードを記述していく
$stmt = $db->query("select * from users");
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
var_dump($user);
}
- PDO::FETCH_ASSOC……結果を配列で返す
- PDO::FETCH_OBJ……結果をオブジェクトで返す
まとめ
PDOを正しく使えば、データベースに関するセキュリティ対策をいい感じにやってくれるそうなので、シンプルでいいですね。
今回はPHPを直書きしていましたが、ここにクラスの概念が関わってくると、コードが細かく分散・分割されていきます。クラスの書き方も、ネームスペースという考え方が加わって、今までとは変わっているので、こちらも勉強していきたいですね。