分析: 我們利用一個(gè)文件(data.dat)來(lái)存儲(chǔ)投票欄目.每個(gè)欄目占據(jù)一行. 這樣一來(lái),便可隨意加入和減去想要投票的欄目.
我們?cè)倮靡粋(gè)文件(votes.dat)來(lái)存儲(chǔ)我們的投票結(jié)果. 并紀(jì)錄最近一位投票者的IP地址,簡(jiǎn)單的防止一人多投.
所以,您應(yīng)該在該程序目錄下自行建立兩個(gè)文件data.dat和votes.dat
程序運(yùn)行過(guò)程部分
程序運(yùn)行時(shí)應(yīng)該先有一個(gè)投票的HTML表單,等待投票. 當(dāng)有人在HTML表單上投票時(shí),判斷它的IP是否為最近一位投票者的IP, 如果此人剛剛投過(guò)票,則兩個(gè)值應(yīng)該相等,顯示"您已投過(guò)票了,謝謝您的參與!" 如果此人沒(méi)投過(guò)票,則兩個(gè)值不等,將它的投票寫入文件(votes.dat) (這里得到投票者的IP方法是:Web客戶機(jī)在對(duì)服務(wù)器發(fā)送請(qǐng)求時(shí)需要提供一個(gè)表識(shí), 這個(gè)表識(shí)就存儲(chǔ)在環(huán)境變量REMOTE_ADDR里,我們引用它就可以了.)
最后是顯示投票結(jié)果,通常我們是以"條形圖表+百分?jǐn)?shù)"來(lái)顯示投票情況. 所以,我們要選擇一個(gè)顏色單一的矩形圖形,以適應(yīng)橫向縮放的要求.
--------------------------------------------------------------------------------
程序代碼部分 可下載程序代碼
//投票欄目存儲(chǔ)文件,您可更改文件名 $data="data.dat"; //投票結(jié)果儲(chǔ)存文件 $votes="votes.dat";
//用以顯示投票結(jié)果比例的圖形文件名圖形文件名, //用單一顏色的矩形較好,方便投票結(jié)果橫向縮放, //自行上傳到本程序目錄下 $path_img="vote.gif";
//投票標(biāo)題 $poll_name="您喜歡我的哪個(gè)欄目?";
// 以下部分不需改動(dòng) //
//打開投票欄目文件,并以數(shù)組的形式將全部?jī)?nèi)容存在變量$dataf中備用 $dataf=file($data); if ($go !=1)
{ //顯示投票程序表單 echo "<font color=red><i>$poll_name</i></font><br>n"; echo "<form method=post>"; for ($i=0; $i<=count($dataf)-1; $i++)
{ echo "<input type=radio name="vote" value="$i"> $dataf[$i]<br>n"; }
echo "<input type=hidden name=go value=1>"; echo "<p><input type=Submit value=投票>"; echo "</form>"; echo "<a href='vote.php?result=1&go=1'>查看結(jié)果</a>";
}
else
{ // $go==1 表示有人投票, // 現(xiàn)在將投票情況以另外一種方式從文件中讀出 $file_votes=fopen($votes, "r"); $line_votes=fgets($file_votes, 255); fclose($file_votes);
// 并將數(shù)據(jù)按指定的字串切開,再將字串傳回到陣列變量中 $single_vote=explode("|", $line_votes);
//準(zhǔn)備寫入投票結(jié)果 if ($result!=1)
{ //檢查IP地址是否重復(fù) $file_votes=file($votes, "r"); if ($REMOTE_ADDR == $file_votes[1])
{ echo "<center><font color=red>您已投過(guò)票了,謝謝您的參與! </font> </center>"; exit; }
//如果IP不重復(fù),則執(zhí)行以下程序 $ficdest=fopen($votes, "w"); for ($i=0; $i<=count($dataf)-1; $i++)
{ //判斷投了那一個(gè)欄目 if ($i == $vote)
{ $single_vote[$i]+=1; }
//將數(shù)據(jù)寫回文件 fputs($ficdest, "$single_vote[$i]|");
}
//寫入投票者IP fputs($ficdest, "n$REMOTE_ADDR"); fclose($ficdest); $result=1; //投票成功
}
//寫入投票結(jié)果后并顯示投票結(jié)果 if ($result==1)
{ echo "<table cellpadding=10>"; for ($i=0; $i<=count($dataf)-1; $i++)
{ //取得投票總數(shù) $tot_votes+=$single_vote[$i]; }
for ($i=0; $i<=count($dataf)-1; $i++)
{ //計(jì)算百分比 $stat[$i]=$single_vote[$i]/$tot_votes*100; echo "<tr><td><li><font face=Verdana size=2>"; echo "$dataf[$i]</font></td><td align=left><font face=Verdana size=2>"; echo "<img src="$path_img" height=10 width=$stat[$i] align=middle> "; //輸出百分?jǐn)?shù) printf("%.1f", "$stat[$i]"); echo "%</font></td><td align=center><font face=Verdana size=2>"; //輸出本欄目投票數(shù) echo "$single_vote[$i]</font>"; echo "</td></tr>"; }
echo "</table><p>"; echo "<font face=Verdana size=2>總投票數(shù):$tot_votes </font>"; }
}
?>
|