簡易線上投票系統(php)——投票頁面

THE_ZERO發表於2016-01-10

登陸後才可以進入投票頁面,否則將自動回到主頁。投票頁面分為多選和單選兩種形式。在投票完成後根據投票活動釋出時設定的是否允許檢視結果來確定是否自動跳轉到結果頁面。若不允許,會自動彈出提示框,並返回主頁。

1、獲取投票資訊

		if($ouser == ''){
			echo "<script>alert('請先登入!');location.href='index.php';</script>";
		}else{
			$voteid=@$_GET['vid'];
			if($voteid == ''){
				echo "location.href='index.php';</script>";
			}else{
				$sql="select vname,starttime,uid,vintro,open,more,max,min from vote where vid='".$voteid."'";
				$voteitem=mysql_query($sql);
				$vitem=mysql_fetch_array($voteitem);

				$sql2="SELECT itemcount,item,num FROM votetitle where vid='".$voteid."'";
				$votetitle=mysql_query($sql2);
				$vtitle=mysql_fetch_array($votetitle);

				$sql3="SELECT username FROM users where uid='".$vitem['uid']."'";
				$uname=mysql_query($sql3);
				$username=mysql_fetch_row($uname);
(此處也是我認為這個系統的一大問題,對資料庫的訪問過於頻繁)

一共三次訪問資料庫,獲得所需的全部投票資訊。

2、投票活動資訊的顯示

將php程式碼結合進html中方便顯示。

            <center><h2><?php echo $vitem['vname']; ?></h2></center>
            <div id="vote">
            	<table>
                	<tr>
                   	  <td>釋出人:<?php echo $username[0];?></td><td>釋出時間:<?php echo $vitem['starttime']; ?></td>
                    </tr>
                </table>
                <div id="vote_intro">
                	<?php echo $vitem['vintro'] ?>
                </div>
                <div id="vote_contend">

3、對錶單的設定

$itemcount=$vtitle['itemcount'];
$multi=$vitem['more'];
$option=explode('*',$vtitle['item']);
分別獲得投票活動的選項數目、是否為多選、將各個選項儲存在option物件中

(1)單選

a、前臺表單

                                       if($multi==0){//單選
						$out="<form id='choice' name='choice' action='' method='post'><table>".
							"<tr><td>注意:只能選擇一項!</td></tr>";
						for($i=0;$i<$itemcount;$i++){
							$j=$i+1;
							$out=$out."<tr><td><label><input type='radio' name='RadioGroup1' value='".$i."' id='".$j."' />".$option[$i]."</label></td></tr>";
						}
						$out=$out."<tr><td><input type='submit' name='choiceSend' value='提交併檢視結果'/> <input type='reset'/></td></tr>".
							"</table></form>";
						echo $out;
					}
通過迴圈,將各個選項的單選框顯示出來,並以數字順序命名,以choiceSend為名提交資訊

b、後臺處理

<?php
//單選投票
if(@$_POST['choiceSend']){
	$ouser=@$_GET['user'];
	$voteid=@$_GET['vid'];
	if($ouser == ''){
		echo "<script language='javascript'> alert('請先登入!'); </script>";
	}else{
		$sql="SELECT itemcount,item,num FROM votetitle where vid='".$voteid."'";
		$votetitle=mysql_query($sql);
		$vtitle=mysql_fetch_array($votetitle);

		$sql2="select open from vote where vid='".$voteid."'";
		$voteitem=mysql_query($sql2);
		$vitem=mysql_fetch_array($voteitem);

		$open='';
		if($vitem['open']==0){
			$open="alert('您無權檢視投票結果!');location.href='./index.php?user=".$ouser."';";
		}else{
			$open="location.href='./result.php?user=".$ouser."&vid=".$voteid."';";
		}

		$ballot=explode('*',$vtitle['num']);
		$decide=$_POST['RadioGroup1'];
		$ballot[$decide]=$ballot[$decide]+1;
		$num=implode('*',$ballot);
		$sql2="UPDATE votetitle SET num = '".$num."' WHERE vid = '".$voteid."'";
		mysql_query($sql2);
		echo "<script language='javascript'>alert('投票成功!');".$open."</script>";
	}
}
?>
點選提交後,會先檢查是否處在登入的狀態,通過查詢資料庫的方式確定資訊,再將投票增加的選票新增到原有的投票統計中,並組成字串,對資料庫做出相應的更改,以實現投票的操作。

確定能否顯示投票結果的過程:

if($vitem['open']==0){
			$open="alert('您無權檢視投票結果!');location.href='./index.php?user=".$ouser."';";
		}else{
			$open="location.href='./result.php?user=".$ouser."&vid=".$voteid."';";
		}
計算並更改的過程:

                $ballot=explode('*',$vtitle['num']);
		$decide=$_POST['RadioGroup1'];
		$ballot[$decide]=$ballot[$decide]+1;
		$num=implode('*',$ballot);
		$sql2="UPDATE votetitle SET num = '".$num."' WHERE vid = '".$voteid."'";
		mysql_query($sql2);
(2)多選

a、前臺表單

elseif($multi==1){//多選
						$out="<form id='mult' name='mult' method='post' action=''><table>".
							"<tr><td>注意:最多選擇".$vitem['max']."項,最少選擇".$vitem['min']."項!</td></tr>";
						for($i=0;$i<$itemcount;$i++){
							$j=$i+1;
							$out=$out."<tr><td><label><input type='checkbox' name='checkbox[]' value='".$i."' id='".$j."' />".$option[$i]."</label></td></tr>";
						}
						$out=$out."<tr><td><input type='submit' name='mutiSend' value='提交併檢視結果'/> <input type='reset'/></td></tr>".
							"</table></form>";
						echo $out;
					}
大部分內容與單選相同,只是在獲取資訊時專門獲取多選的兩個資訊:max最多選項、min最少選項。並提示使用者

b、後臺處理

<?php
//多選投票
if(@$_POST['mutiSend']){
	$ouser=@$_GET['user'];
	$voteid=@$_GET['vid'];
	if($ouser == ''){
		echo "<script language='javascript'> alert('請先登入!'); </script>";
	}else{
		$sql="SELECT itemcount,item,num FROM votetitle where vid='".$voteid."'";
		$votetitle=mysql_query($sql);
		$vtitle=mysql_fetch_array($votetitle);

		$sql2="select open from vote where vid='".$voteid."'";
		$voteitem=mysql_query($sql2);
		$vitem=mysql_fetch_array($voteitem);

		$open="";
		if($vitem[0]==0){
			$open="alert('您無權檢視投票結果!');location.href='./index.php?user=".$ouser."';";
		}else{
			$open="location.href='./result.php?user=".$ouser."&vid=".$voteid."';";
		}

		$itemcount=$vtitle['itemcount'];
		$ballot=explode('*',$vtitle['num']);
		$decide=$_POST['checkbox'];
		for($i=0;$i<$itemcount;$i++){
			for($j=0;$j<count($decide);$j++){
				if($i==$decide[$j]){
					$ballot[$i]=$ballot[$i]+1;
				}
			}
		}
		$num=implode('*',$ballot);
		$sql2="UPDATE votetitle SET num = '".$num."' WHERE vid = '".$voteid."'";
		mysql_query($sql2);
		echo "<script language='javascript'>alert('投票成功!');".$open."</script>";
	}
}
?>
大多與單選相似,通過迴圈的方式將表單提交的投票資訊逐條新增到投票統計資訊中。

逐條新增的迴圈過程:

for($i=0;$i<$itemcount;$i++){
			for($j=0;$j<count($decide);$j++){
				if($i==$decide[$j]){
					$ballot[$i]=$ballot[$i]+1;
				}
			}
		}
此處發現了一個bug,前臺可以正確的獲取選擇的限制資訊,但在後臺卻沒有有效的甄別機制,所以這個max和min的資料並沒有起到它的作用。要修復並不難,只需在後臺獲取max和min的資訊並用一個if語句進行確認,因為時間關係,暫時不做修改,希望有機會可以不斷的完善。


相關文章