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

リスト5
リスト6

第六の「型」
入力値チェックはJavaScriptだけではダメ

 presin.phpは,presin.js(リスト5[拡大表示])というJavaScript*13のファイルを読み込んでいます(リスト2の(1))。一般的に言って,画面周りのコントロールをJavaScriptで行うことは望ましい「型」です。presin.jsは,未入力のチェック(リスト5の(1)),コードが数値か否か(2),tinyintの範囲に収まっているか(3)などをチェックしています。

 しかし,実はサーバー側で(PHPで)チェックすべき項目もあるのです。presin.phpが呼び出すpresinsub.php(リスト6[拡大表示])の(3)を見てください。strlen関数(バイト数の長さを取得する関数)で入力値のバイト数をチェックしています。JavaScriptは文字数のチェックは簡単に行えますが,バイト数のチェックは難しいため,PHPでバイト数のチェックするようにしたわけです。

 このように,入力値チェックは何がなんでもJavaScriptだけで行う必要はありません。データの種類に応じて臨機応変にチェック処理を実装することも,Webアプリケーション開発の重要な「型」と言えるでしょう。

第七の「型」
複数ユーザーの同時アクセスを考慮する

 最後に,リスト6のデータ更新チェックに注目してみましょう。presinsub.phpは,プレゼントのデータを更新する前に,他のユーザーがそのレコードを削除していないかどうかをまずチェックしています(1)。削除されていない場合は再度レコードを読み込み,presupd.phpで読み込んで$_SESSION['opres']に記録してある修正前の値と比較します(2)。このとき,いずれかのフィールド値が違っていたら,誰かが(自分が読み込んでから,書き込む前に)変更したと判断して更新を中止します。

 なぜ,こんな面倒なことをしているのでしょう? それは,Webアプリケーションはどこで誰が使っているか見当がつかないケースが多いからです。クライアント・サーバー(C/S)型のアプリケーションですと,ほとんどの場合,利用者は限られています。そのため,自分が更新しようとしている間はレコードをロックして,ほかの人には更新させないというコードを書いてもさほど不都合は起こりません。

 しかしWebアプリケーションは,不特定多数のユーザーが使います。データ修正ページを開いたまま席を立ってしまうかもしれません。その間ずっと,ほかのユーザーがデータを更新できないのでは困ってしまいますね。そこで,あるユーザーがデータを読み込んで修正作業をしている間にも,ほかのユーザーがデータを修正できるようにします。修正作業を終えてデータを更新しようとする前に,自分が修正前に読み込んだデータの値と現在の値を比較し,合致する場合にだけデータを更新するのです。自分が読み込んだデータの値と現在の値が異なっていたら,誰かが更新したということですから,もう一度,現在のデータに対して修正作業を行い,更新するようにします。

 今回の例のように,フィールド数が少なければフィールド値を全部つき合わせて,更新されたかどうかを判断できます。しかしフィールド数が多い場合は,タイムスタンプ型のフィールドをテーブルに新たに追加し,更新した時点のタイムスタンプ(日時)をセットするようにします。そしてレコードの修正前の処理でタイムスタンプを読み取って記憶しておいて,更新の直前にもう一回タイムスタンプを読み取り,その間にデータが更新されていないかどうかを判断すればよいでしょう。「Webアプリケーションでは,“譲り合い型”の更新チェックを忘れるな」,これが今回最後にマスターしてほしい「型」です。

☆          ☆          ☆

 さあ,肩(型)慣らしは今回でおしまいです。次回はいよいよアンケート入力フォームを作ります。「PHPとデータベースを使うと,気の利いたフォームが簡単に作れるんだ」と実感できると思いますよ。お楽しみに!



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

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