お盆はお墓参りをしたり,酒を飲んでいるとあっと言う間に過ぎていく。前回はこうしろうにPHPのSmartyの導入を説明した。PHPと来ればデータベースはMySQLだ。こうしろうの帰省期間は2週間しかない。こうしろうが大学に戻ってしまう前に,MySQLの今について説明しておきたい。

 MySQL5.0.45-community-nt MySQL Community Editionのインストールを進めるこうしろうに「文字コードはどうした?」と聞く。「シフトJIS」と何の疑いもない声で答える。

 「cp932というキャラクタセットが追加されたのは知っているか」と説明を始める。一口にシフトJISと言っても,実はいろいろなのである。MySQLのsjis(シフトJIS)はIANA(アイアナ)で定義されるShift_JISキャラクタセットに対応しており,JIS X0201およびJIS X0208キャラクタセットをサポートしている。ちなみにIANA(Internet Assigned Number Authority)とは,インターネット上で利用されるアドレス資源(IPアドレス、ドメイン名、プロトコル番号など)の標準化や割り当てを行なっていた組織で,現在,その管理はICANNに移管されている。

 これに対し,日本語Windows環境で使用されているシフトJISは,NEC特殊文字,NEC選定IBM拡張文字,IBM拡張文字などベンダーの拡張文字を含む。このコードがcp932である。WindowsPCに学習用としてMySQLをインストールするだけなら,sjisでも構わないが,Windows環境で実用するのなら,cp932を選んだほうがよいだろう。
 
 次にphp.iniを編集して,MySQL関係のモジュールをすべて利用可能にする。

------------------------------------------------------------------
extension=php_mysql.dll
extension=php_mysqli.dll
------------------------------------------------------------------

 セミコロン(;)をとって, php_mysql.dllと拡張版php_mysqli.dllを有効にするだけではなく,PDOモジュールも有効にした。

------------------------------------------------------------------
extension=php_pdo.dll
extension=php_pdo_mysql.dll
------------------------------------------------------------------

 PEARライブラリのDBクラスもインストールしたいので,c:\php5の中のgo-pear.batを実行して,パッケージ・マネージャをインストールする。次に,

------------------------------------------------------------------
pear install DB
------------------------------------------------------------------

をコマンドプロンプトで実行して,DBパッケージをインストールする。

 MySQLのテーブルをGUI操作で簡単に作れるように,MySQL GUI TOOLSもダウンロードしてインストールする。

 MySQL GUI TOOLSにはMySQL AdministratorやQuery Browserが含まれている。

 こうしろうは,MySQL Administratorでテーブルを作成し始める。ログインを管理するuser_id,pass_word,user_name の3フィールドからなるテーブル(user_table)だ。

 「PEARライブラリは有名で,DBクラスは広く使われており,コードはPHPで記述されている。MySQLi関数はMySQL 4.1以降で利用可能だが,PHP5.1以降で利用できるようになったPDOがこれからの本命だろう」とこうしろうに説明する。

 まずは,PEARのDBクラスを使った例からみていこう。

------------------------------------------------------------------
require_once("DB.php");
------------------------------------------------------------------

 PEARのDBクラスを使うには,まず,DB.phpを読み込む。

------------------------------------------------------------------
リスト1
------------------------------------------------------------------
$sql = "SELECT user_id,usr_name FROM user_table "
." WHERE user_id = ?"
." AND pass_word = ?";
$update_data = array($p_user, $p_pass);
$sth = $this->db_object->prepare($sql);
$sql_result = $this->db_object->execute($sth,$update_data);
$row_result = $sql_result->fetchRow(DB_FETCHMODE_ASSOC);
------------------------------------------------------------------

 ログイン画面で入力された入力されたユーザーIDとパスワードをパラメータにSELECT文を実行するコードだ。一致するユーザーIDとパスワードがuser_tableに存在すれば$row_resultに行を取得できる。

 prepare文でSELECT文を準備して,execute文でパラメータの配列を渡し,実行している。いわゆるプリペアードステートメントを使うことで,処理の高速化とSQLインジェクション対策を実施することが可能だ。
 
 mysqli拡張モジュールは,従来の関数型のmysqlインタフェースをオブジェクト指向インタフェースに拡張する。

------------------------------------------------------------------
リスト2
------------------------------------------------------------------
$mysqli = new mysqli($this->env_array["db_host"], $this->env_array["db_user"], $this->env_array["db_pass"], $this->env_array["db_name"]);
$sql = "SELECT user_id,usr_name FROM user_table "
." WHERE user_id = ?"
." AND pass_word = ?";
$sql_result = $mysqli->prepare($sql);
$sql_result->bind_param('is', $p_user,$p_pass);
$sql_result->execute();
$row_result = $sql_result->fetchRow(DB_FETCHMODE_ASSOC);
------------------------------------------------------------------

 mysqliでも,PEAR同様にプリペアードステートメントを使ったデータベース・アクセスがサポートされている。

 次に,こうしろうはこれまでのコードをPHP5.1.0で追加されたPDOを使ったコードに書き直す。

------------------------------------------------------------------
リスト3
------------------------------------------------------------------
$db=new PDO('mysql:host=$this->env_array["db_host"];dbname=$this->env_array[" db_name"]',$this->env_array["db_user"], $this->env_array["db_pass"]);
$sql = "SELECT user_id,usr_name FROM user_table "
." WHERE user_id = ?"
." AND pass_word = ?";
$sql_result = $db->prepare(sql);
$sql_result->execute(array($p_user,$p_pass));
$row_result = $sql_result->fetchRow(DB_FETCHMODE_ASSOC);
------------------------------------------------------------------

 PDOは各データベースに共通のインタフェースでアクセスする手段を提供する。

 結局,どの方法でもプリペアードステートメントを利用でき,プログラムの書き方も似通っているのだが,PDOはPEARのDBクラスとは異なりC言語で書かれている分だけオーバーヘッドが少なく,より高速に動作することが期待できる。