(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)

第四の「型」
データベース処理はPEARのDBクラスを使おう

リスト1
図5●リスト1を実行したところ
リスト2
図6●リスト2を実行している画面
リスト3
リスト4

 次は,データベース・プログラミングです。PHPにおけるデータベース・プログラミングでぜひ学んでほしい「型」は,「PHP 4標準のクラスライブラリPEAR(PHP Extension and Application Repository)*9のDBクラスを使うこと」です。オブジェクト指向プログラミング*10の知識が必要になりますが,PEARを使えば,どのデータベースにアクセスする時でもほぼ同じコーディングができるからです。

 さっそく,プレゼント・テーブルの中身を一覧する処理present.phpを見てみましょう(リスト1[拡大表示])。このスクリプトを実行すると図5[拡大表示]のようになります。長いPHPスクリプトで面食らったかもしれませんが,要点は(2)と(3)の部分だけです。(2)は直前の行に記述したSQLのselect文を実行する処理,(3)は実行した結果からレコードの値を取り出す処理です(SQLにつ いてわからない方は,別掲記事「マスター・メンテナンスに必要な四つのSQL」を参照してください)。

 PHPでは,オブジェクト名->メソッド名と書くと,そのオブジェクトが持っているメソッドを実行できます。つまり(2)では,$dbオブジェクト(データベースを操作するオブジェクト)のqueryメソッドを使って$resオブジェクト(複数のレコード)を取得し,(3)では$resオブジェクトのfetchRowメソッドを使って$rowオブジェクト(レコード)を取得しているわけです。「あれ? それなら(2)の$dbオブジェクトは,どこから来たの?」――いい質問です。答えは(1)の部分です。ここでDBクラスから$dbオブジェクトを生成することを宣言しています*11。「PEARのDBクラスから$dbオブジェクトを生成」→「$dbオブジェクトから$resオブジェクトを取得」→「$resオブジェクトから$rowオブジェクトを取得」という流れが理解できますね。

第五の「型」
複数画面の連携にはセッション配列を使う

 次に,プレゼント登録フォームのPHPスクリプトpresin.phpを見てみましょう(リスト2[拡大表示] )。このフォーム(図6[拡大表示])は,新規登録と,既存レコード修正の二つの用途で使用します。修正の場合は,後で説明するようにいったんpresupd.phpで該当レコードを読み込んで,それからpresin.phpを呼び出して使います。

…と簡単に書きましたが,何も知らないでこの処理を実装しようとするとおそらく行き詰まるはずです。というのは,WebアプリケーションのベースになっているHTTPプロトコルは,「行って来い」が基本だからです。あるページがほしいとサーバーに要求すると,サーバーはそのページを返す。それで終わりです。つまり,複数のページで連続したデータを扱う場合,どこかにデータをとっておかないと,「行って来い」のまま消えてしまうわけです。

 そこで定番の「型」となるのがセッション機能です。セッションは,連続した処理の流れであり,session_start関数でセッションを開始します。セッションを開始すると,そのセッションが続いている間中,複数のページで共有できるセッション変数を扱えるようになります。

 セッション変数としては,PHPが備える$_SESSION配列を使います。$_SESSION配列に値を格納したり,あるいは取り出したりするのです。「セッション変数は,どこに値を格納しているの?」――答えはサーバーです。Apache,PHP,MySQLをインストールしている方なら,C:\winnt(Windows XPの場合はC:\windows)にあるPHPの設定ファイルphp.iniの[Session]の項をエディタで開いてください。リスト3[拡大表示]のようなコードが書いてあるでしょう。セッションのデータはtmpディレクトリにファイルとして保存する,とデフォルトで指定しています(1)。ですから,リスト2のスクリプトを実行する場合は,C:\tmpフォルダを前もって作成するか,リスト3の(1)で,既存の別フォルダをsession.save_pathに指定しないとエラーが発生します。

 ちなみに,サーバー側にセッション変数のデータを保存しても,ブラウザ側でセッションの情報を持っていないと,ブラウザとサーバーで連携がとれません。そのために,セッションを利用しているのは誰かという情報を関連付けているのがCookie(クッキー)*12です。

 セッション機能を開始すると,PHPは自動的に,セッション変数のデータを記憶したファイルの名前を,クッキーとしてローカルのパソコンに送ります。php.iniのデフォルト設定では,クッキーのlifetime(ライフタイム)はゼロ,つまりブラウザを開いている間だけクッキーが有効なので,ブラウザを閉じれば,セッションは(結果的に)終了するというわけです。

 実際にセッションがどう使われているのか,修正処理用のスクリプトpresupd.phpを見てみましょう(リスト4[拡大表示] )。(1)でセッションを開始しています。(2)でデータベースからselect文でプレゼントのデータを抽出し,(3)でプレゼントの番号(pno),名前(pname),スポンサー名(psponsor)を,$_SESSION['npres']['pno'] のような2次元配列として表したセッション変数に保存しています。(4)でpresin.phpを呼び出しているので,あらためてリスト2のpresin.phpを見てみると,セッション変数に格納された値が,変数$pno,$pname,$psponsorにコピーされていることがわかりますね(リスト2の(2))。こうすることで,複数のスクリプト間でデータを共有するわけです。


マスター・メンテナンスに必要な四つのSQL

リストA
 リレーショナル・データベース(RDB)であるMySQLのマスター・メンテナンス処理を実装するには,RDBのデータを操作する言語SQLを学ぶ必要があります。特にデータの一覧/登録/修正/削除は,それぞれselect文,insert文,update文,delete文の四つのSQLで行います。ここでは基本的な書き方だけを説明し,次回以降でさまざまなバリエーションを紹介していきましょう。

 リストA[拡大表示]は,四つのSQL文の書式を表したものです。まず(a)のselect文です。フィールド・リストにフィールド名をカンマで区切って並べます。フィールド・リストではなく,*(アスタリスク)を指定するとテーブルの全フィールドを取得しますが,フィールド数が多い場合はデータの通信量が増えるので,安易に使うことは控えましょう。where節にはレコードの選択条件,order by節はフィールドを指定してレコードを並べ替えるためのものです。order by節のデフォルトは昇順(asc)で,降順(desc)を指定することもできます。

 新しいレコードをテーブルに登録する場合は,(b)のinsert文を使います。テーブル名の後のかっこの中に列挙したフィールドに,values以下に指定した式の値が入ります。フィールドとvaluesの中の値の数が一致していないとエラーになるので注意してくださいね。

 (c)は既存の値を修正(更新)するupdate文です。setに続けて更新したいフィールド名=式として列挙します。レコードを選択するwhere節を指定しないと,すべてのレコードを更新してしまうので注意してください。

 最後の(d)delete文は,指定したレコードを削除する構文です。update文を使っても,特定のレコードのフィールドの値を削除することはできますが,レコードそのものを削除することはできません。delete文は,一つのレコードの各フィールド値ではなく,レコードを1行丸ごと削除する点に注意してください。レコードの指定にはwhere節を使います。



金宏和實(かねひろ・かずみ)氏

株式会社イーザー代表取締役副社長。
富山県高岡市在住。