データベース(DB)は、さまざまな処理によって発生したデータを保存しておく重要なシステム基盤です。また、保存されたデータを随時読み込んで(参照して)Webブラウザ画面に表示するためにも、よく用いられます。
ちなみに情報システムのデータベースは、多くがリレーショナル・データベース(RDB)です。本稿でもそれに倣い、データベースはRDBを指すものとします。
DBアクセス機能の概要
PHPプログラムからDBにアクセスする機能はいくつかありますが、PHPの処理系自身で用意されているのは次の2つです。
- 組み込み関数
-
- DBの種類ごとに用意された関数を用いてアクセスする
- PHP5よりも前から広く用いられてきた機能
- PDO
-
- DBの種類を問わず、統一化された方法でアクセスする
- PHP5から導入された新しい機能(PHP5.1から標準)
ただし、これらは用意されているとはいっても、すぐにすべての機能が利用できるとは限りません。DBごとに機能を利用するかどうかを設定する必要があります。もしLinuxなどでソースコードからコンパイルしたPHP処理系を用いている場合は、必要な機能がコンパイル済みであるかも事前に確認しておかなくてはなりません。
DBアクセスのための準備
PHPプログラムからDBにアクセスできるようにするためには、以下に列挙するようないくつかの準備が必要です。それを順に説明していきます。
- 利用するDBの種類を確認
- DBサーバのインストールと動作確認
- SQLの習得
- データ保護とセキュリティ確保への配慮
1. 利用するDBの種類を確認
DBアクセスを実践する前に確認しておきたいのは、アクセスするDBの種類です。なぜなら、これによってPHP処理系に必要な設定や実行する関数の種類が変わるからです。
執筆時点で最新のPHP5.2.5では、以下のDBに対応した組み込み関数をサポートしています。このほかに、DBのAPIなどに対応したものもあります。設定やインストールの方法は、それぞれのモジュールの説明に従ってください。
- Firebird/InterBase
- DB2/Cloudscape/Apache Derby
- Informix
- Ingres II
- MaxDB
- MySQL
- mSQL
- ODBC
- Oracle
- Ovrimos SQL
- PostgreSQL
- SQL Server
- SQLite
- Sybase
関数を実行できるようにするには、php.iniというファイルを変更します。このファイルはPHP処理系に関する設定が記述されているファイルですから、内容を変更する前にコピー(バックアップ)をとっておいたほうが良いでしょう。
たとえば、PHPのWindows版処理系でPostgreSQLに対応した関数を用いるときは、php.iniの以下の行の先頭にある;
を削除します。このファイルには、他にもアクセスのための設定(pgsql.XXXXX = value)が記述されていますので、必要に応じてそれらも変更してください。
DBにアクセスするときは日本語を用いることも多いため、マルチバイト関連の関数を実行できるように、以下の行も変更しておくと良いでしょう。他の設定(mbstring.XXXXX = value)も必要に応じて変更してください。
2. DBサーバのインストールと動作確認
利用するDBサーバが決まったら、それらをインストールし、動作を確認します。インストールと起動の方法についての説明は割愛しますが、自分で開発環境を構築する場合には、少なくともサーバ(サービス)の起動と停止、DBアクセスを行うクライアント(コマンドプロンプトなど)からのSQLの実行はできるようにしておくべきでしょう。
3. SQLの習得
SQLとは、DBサーバに対してアクセスするときに用いる言語で、仕様のほとんどの部分が規格によって標準化されています。ですから標準化されている部分については、1. や 2. の前に習得しておくのがベストです。
しかし、DBの種類によって仕様が異なる部分もあるため、標準化された部分のみでDBを自在に扱えるとはいえないのが実情です。SQL以外に実行しなければならないコマンドもあります。もし事前に利用するDBの種類が分かるのであれば、それで実行可能なSQLとコマンドをまず習得するというのも、現実的な選択かもしれません。
4. データ保護とセキュリティ確保への配慮
情報システムで扱うデータには、業務上の秘密事項や個人情報など、扱いに配慮を要するものが含まれます。そのため、データの紛失・漏洩・散逸といった事態を引き起こさないよう、データを保護し、セキュリティを確保する必要があります。
ことPHPプログラムによるDBアクセスにおいては、プログラムを設計する時点で配慮すべきこととして、パスワードのように機密性の高いデータは暗号化して保存したり、ユーザからのアクセスによって、本来公開すべきでないデータを公開してしまうことがないようにするなどがあります。
プログラムを設計する上で注意すること
データ保護やセキュリティ確保以外でも、DBアクセスを行うプログラムを設計する上で注意すべきことがあります。以下にその代表的なものを列挙し、これらについて説明していきます。
a. 文字コードの変換(ブラウザ→DB/DB→ブラウザ)
b. エラー対策(DB接続/SQL実行など)
c. SQLのチューニング
a. 文字コードの変換(ブラウザ→DB/DB→ブラウザ)
Webブラウザ画面に表示する文字にも、データベースに保存する文字にも、日本語が用いられる場合は、両者間の文字コードを変換する処理が必要になる場合があります。
文字コードが両者で統一されていれば、ほぼ問題ないのですが、それでも安心できないことがあります。というのは、両者が共に文字コードを「シフトJIS」に設定している場合でも、文字とコードの配置に微妙なずれがあって、いくつかの文字が化けてしまうということがあります。
入力可能な文字が限定できる場合は、このずれを回避することもできますが、個人情報やユーザーのコメントなど、一言一句まですべて保存・表示しなくてはならない場合には工夫が必要になります。
b. エラー対策(DB接続/SQL実行など)
DBサーバは、Webサーバとは別で起動・停止されるものです。ですから、エラーの発生によってうまくアクセスできなくなることがあります。エラーとは、たとえば以下のようなものです。
- アクセスしたのにDBサーバが起動されていない(メンテナンス、停電など)
- アクセスの途中でDBサーバが停止してしまった(アクセス殺到時など)
- アクセスに用いたSQLに間違いが混入していた(テスト不十分など)
- データの保存状態に異常を来してしまった(プログラムの不具合など)
- データの保存容量が不足している(システム管理不十分など)
このように、処理の実行中に起こりうるエラーを想定し、それぞれの場合に応じた処理を適切に行えるように設計を行う必要があります。このときもデータの保護やセキュリティのことを忘れてはなりません。
c. SQLのチューニング
チューニングとは、アクセスにかかる時間をより短くするために工夫することをいいます。何を工夫するかというと、DBサーバ内部におけるデータアクセス時の動作です。PHPプログラムからアクセスするときに実行させるSQLの記述によってこの動作が変わります。それを利用して、少しでも早く目的のデータを参照できるようにするのです。
ある程度のところまでは、DBサーバが最適化という処理によって自動的にチューニングを行いますが、それでも専門家から見ると改善の余地が残っています。そこから先は開発者の工夫次第というわけです。これを行うには、SQLを受け取ってから参照するデータの一覧を得るまでに行われるDBサーバ内部の動作について熟知していなくてはなりません。
データベースは情報システムの基盤として、専門の担当者が置かれることもあるほど重要な位置を占めています。そのため、取り扱うにあたって上記をはじめとしたさまざまな注意が必要です。どんな点に注意すべきかをあらかじめ知った上で、データベースを扱うようにしてください。