このサイトはPHPを独習する際に作成したスクリプトを基に、プログラム言語初心者のための入門講座として作成しました。PHPは初心者に親しみやすく、解りやすいプログラム言語です。これからプログラムを学ぶ人の参考になればと思います。
投票アンケートシステム1
ブラウザでアンケートを取る仕組みです。 ROCK BAND! 人気投票! ブラウザ上でアンケート調査をするスクリプトです。以下を目標に作成してみました。 1、<select>で投票項目を選べること ○ 2、投票項目を自由に追加できること ○ 3、投票結果を得票順に棒グラフで表示すること ○ 4、1つの項目の全投票数に対する割合を表示すること ○ 5、同数得票の順位調整ができること ○ 6、1画面に投票と結果を表示すること × 7、<select>はアルファベット順で表示すること ○ 8、連続投票を避ける機能をもつこと ○ 9、記録用のファイルは自動作成できること ○ 6の項目は実現できませんでした。なぜうまく行かなかったかと言うと、ブラウザのキャッシュが大きな壁だったのです。同じ画面にするとどうしても再読込あるいは次の投票を行わないと反映されないのです。ある程度対応策があるのですが、サーバー側のプロキシ(?)の問題もあるようで100%は無理みたいですね。あちこちで見られるアンケートもほとんど2画面ですからね。 さて、今回はほとんど新しい関数はありません。「クイズ」で使ったファイルの読込・書込の形式を利用して作れる内容ですが、実際はちょっと苦労しました。投票の内容として次の5パターンが考えられます。 1、保存用ファイルがない場合作成して最初のデータを記録する 2、選択−既に登録されているデータに数値を1足す 3、登録−ファイルに新しくデータを追加する。 4、重複−登録されたデータと気づかずに、新規登録を行う 5、データを入力せず、結果だけを見る これを次のように構成しました。
if(保存用ファイルがない){ ファイルを作る } if(30秒以内){ 再投票できない //クッキーのタイムスタンプと今のタイムスタンプを比較 } elseif (選択か登録である) { データを読込み配列に格納する if(新規の登録){ 重複をチェックしてデータを追加 } elseif (データ選択){ 既存のデータに1を追加 } }
これでデータの書込みが終了、この後に改めてデータを読出し表示させています。 データをファイルから読込む時、新しい関数を使いました。それが file() です。これまでは fopen(r) - flock - fgets - flock - fclose とやって while で順に配列に格納していたのですが、file() を使えば一発で配列に収まってしまうのですね。便利なものです。これは僕の買った入門書に載ってなかったぞ!(笑)PHPの関数は数が多いので探すのも大変です。
新しい関数としてmb_strwidth()があります。これは新規にデータを追加する際に文字数を制限するために使いました。あまり長い名前を入力されると表示が崩れてしまう可能性があるからです。strlen()という関数は文字数を返してくれるのですが、半角も全角も1文字として返すので、今回のように両方の入力が予想される場合はちょっと困ります。全角は半角の2倍の数を返して欲しいわけです。mb_strwidth()は文字の幅を返す関数なんですね。これを使って「全角15文字、半角30文字以内」という制限を設けました。
次はクッキーの設定です。時間規制を設けると、ただ結果を見ただけで30秒待たなければならなくなるのが困るところ。そこでクッキーの設定で調整しています。
if(選択か登録か記入されている){ クッキーからデータを得る; if(クッキーがなければ){ 今の時間のタイムスタンプをクッキーに記憶 } }
これで投票した場合はその時間のタイムスタンプが30秒間クッキーに記憶されます。ただ結果を見る場合は選択も登録も空欄なのでクッキーが記憶されません。
次ぎはブラウザのキャッシュを削除するための記述です。これで1画面のアンケートができるはずだったのですが、上手くいきませんでした。
header("Content-Type: text/html; charset=EUC-JP"); header("Expires: Thu, 01 Dec 1994 16:00:00 GMT"); header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache");
投票アンケートシステム2(関数を使って)
このスクリプトは上記の「ROCK BAND! 人気投票!」と同じ動作をするものです。スクリプトを書いていて、あまりにも雑然としていて自分でもなんだか訳がわからなくなってきました。 ここではこのスクリプトの一部を ユーザー定義関数 function を使って書き換えています。function はこのように長いプログラムの構造を分かりやすくするために使うことも多いのです。 さらに function を使うことで一つ一つの作業を、部品のように考えることで全体の構造を組み立てやすくする役目も持ちます。上記のユーザー定義関数では、関数名の次に()を設定し、その中に数値を入れることで計算を行うのですが、ここでは()の中が空欄です。()の中の数値は引数と言うのですが、このように引数なしの状態でも関数として作ることが可能なのです。 しかし、関数の処理を行うには、何らかの引数が入力されなければ、計算そのものが行えません。そこで登場するのが global です。これはグローバルの宣言です。 次のスクリプトはファイルを作りデータを書き込む関数なのですが、 $updir $band_2 は function の中にあるため関数の外部で指定をしても、関数内部ではそれが反映されません。そこで gloval の宣言をしてあげると、関数外部での指定が、関数内部でも適用されるのです。
function MAKE_FILE(){ global $updir; global $band_2; $filepointer=fopen("./$updir", "a+"); flock($filepointer, LOCK_EX); fputs($filepointer, "1"."#".$band_2."¥n"); flock($filepointer, LOCK_UN); fclose($filepointer); echo "新規にファイルを作成して1件目の登録を記録しました"; }
|