『PDO』データベース接続クラスについて

PDOクラスを使うメリット

データベース(以下DBと略)に接続する関数は以下3行で書いていました。

mysql_connect('サーバ名','ユーザ名','パス')or die(mysql_error());
mysql_select_db('データベース名');
mysql_query('文字コード');

これでも充分接続に問題はないのですが、複数のDB(MySQLPostgreSQLSQLiteなど)に接続する場合はそれぞれのDBに応じた関数をつけなければいけませんが『PDO(PHP Data Object)』で接続するクラスを設定すれば容易*1になります。


PDOの設定

PDOはPHP標準機能ですので、特別機能拡張としてインストールなどはする必要はありませんが、もしPDOが動かない場合はphp.iniを編集する必要があります。
C:\xampp\php\php.ini の950行目(PHPのバージョンにより儀行番号が異なる場合があります。)

extension=php_pdo.dll
extension=php_pdo_mysql_libmysql.dll
extension=php_pdo_sqlite.dll

行頭の";"(セミコロン)を削除します。

PDOによるDB接続

<?php
try{
$server = "サーバ名";
$user = "ユーザ名";
$pass = "パスワード";
$database = "データベース名";

// MySQLサーバへ接続
$dbh = new PDO("mysql:host=" . $server . "; dbname=".$database, $user, $pass );
}
catch(Exception $e ) {
print 'ただいま障害により大変ご迷惑をお掛けしております。';
exit();
try〜catchステートメント

まずtry〜catchステートメントについて説明します。

  • try{〜}の中身は例外が発生する可能性がある正常系処理のコードを記述(この場合はDB接続コード)。
  • cathc(例外クラス名 変数){〜}には第一引数にtry節で発生した例外処理をキャッチする例外クラス名(Exception)を指定。
    第二引数は例外クラスのインスタンスを代入する変数($e)を指定します。
    {〜}の中身は例外発生時の処理コード、ここでは「ただいま障害により〜」とエラーメッセージを表示させています。
new演算子=クラスのコピー(インスタンス化)。

PDOのようなクラスをコピーする事をインスタンス化といい、インスタンスすることで定義だけでしかないクラスを実際処理できるようになり、引数に先述のDB接続のキーワード群を代入することで機能します。
インスタンスにはnew演算子を使います。

PDOでDBにデータ書込

まず、ここで新しくでる演算子『->』はオブジェクトやクラスのメソッドやフィールド変数を参照するための演算子です。

見た目が似た『=>』がありますが、こちらは配列に値を代入する演算子ですので。

『->』はアウトプット。『=>』はインプットするもので違いがあります。もっとも引き出す親元の型が違いますが。

話を戻しまして、
先述のPDOで実際DBにSQL文を送るにはqueryメソッドやprepar,executeメソッドと『->』演算子を使用します。

queryメソッド(1回限りの文を発行する)

1回だけ使用するようなSQL文をDBへ送信するにはPDOクラスで用意されている「query」メソッドを使います。

インスタンス化して変数$dbnに入れたのでここから
文字コード設定のコマンドを打ちます。

$dbh-> query('SET NAMES UTF8');
オブジェクト = $pdo->query('実行するSQL文');

これでPDOのインスタンスから文字コードUTF-8が設定できました

prpareメソッドとexecuteメソッド

SQL文の基本部分が同じで値だけ異なるような場合*2
「prepare」メソッドを使用します。

「prepare」メソッドはSQL文を発令する前段階の準備みたいなもので,その次に出る「execute」メソッドで初めてSQL文を発行します。

$sql = 'INSERT INTO my_staff(name,password) VALUES(?,?)';

$stmt = $dbh -> prepare($sql);
//prepare()でSQL文を用意。
  $data[] = $staff_name;
  $data[] = $staff_password;
//$date配列に登録データを代入。
  $stmt -> execute($data);
//execute()でSQL文を発行。

prepareメソッド、executeメソッドは本来
SQLインジェクションから防ぐため安全にSQLを処理をするためのコードです。

以上のスクリプトが一通り終了すればDB接続も切断されますが、明示的にちゃんと接続を遮断するためにNULLをPDOクラスのオブジェに使用します。

$dbh = null;

*1:同様の仕組みでPEAR::DBやCreoleなどがありますが、PDOの方が処理速度が速いです。

*2:SQL文で定型文があり、値が異なる文は主に INSERT文の様に登録データが毎度異なる物や SELECT文の様に入力キーワードが知りたい情報により 検索単語が変わるものなどが該当します。