採用兩張資料表支援多主題、多選項、啟用/停用控制:
-- 投票主題表
CREATE TABLE poll (
Poll_Id INT(11) NOT NULL AUTO_INCREMENT,
Poll_Name CHAR(50),
Poll_Del INT(10) DEFAULT '0', -- 1=啟用, 0=停用
PRIMARY KEY (Poll_Id)
);
-- 投票選項表
CREATE TABLE pollsele (
Pollsele_Id INT(11) NOT NULL AUTO_INCREMENT,
Pollsele_Name CHAR(50),
Poll_Del INT(10) DEFAULT '0',
Pollsele_poll_Id INT(10), -- 關聯 poll.Poll_Id
pollsele_num INT(10) DEFAULT 0, -- 得票數
PRIMARY KEY (Pollsele_Id)
);
| 檔案 | 功能 |
|---|---|
poll.php | 前台投票介面:顯示啟用主題及其選項,提交至 pollsee.php |
poll_input.php | 後台主題管理:新增/啟用/停用/刪除主題(含級聯刪除選項) |
pollsele.php | 後台選項管理:針對特定主題新增/啟用/停用選項 |
pollsee.php | 投票處理與結果顯示:更新得票數、顯示統計 |
Poll_Del=1 的啟用主題Poll_Del=0 的啟用選項pollsee.php?poll_id=...INSERT INTO poll VALUES('','$title','')Poll_Del=0,再設定指定 Poll_Del=1(單一啟用邏輯)pollsele 關聯選項<?php
if ($toupiao != "") {
// 更新得票數
$sql = "SELECT pollsele_num FROM pollsele WHERE pollsele_name='$toupiao'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$new_num = $row[0] + 1;
mysql_query("UPDATE pollsele SET pollsele_num=$new_num WHERE pollsele_name='$toupiao'");
// 顯示結果
$sql = "SELECT Pollsele_Name, pollsele_num FROM pollsele
WHERE pollsele_del='0' AND pollsele_poll_id='$poll_id'";
// ... 輸出統計表格
} else {
echo "<font color=red>你不能投空票!!!</font>";
}
?>
| 問題 | 風險 | 修正方案 |
|---|---|---|
| 直接拼接 SQL 字串 | SQL Injection | 改用 Prepared Statements (PDO/mysqli) |
| 硬編碼資料庫帳密 | 洩露風險、難維護 | 集中設定檔、環境變數 |
| 重複連線資料庫 | 效能差、連線耗盡 | 單一連線/連線池、require 共用 |
| 無 CSRF 保護 | 偽造投票請求 | 表單加入 CSRF Token |
| 無防重複投票機制 | 刷票 | IP/Session/Cookie/登入會員限制 |
| Meta Refresh 跳轉 | 體驗差、SEO 不友善 | HTTP Header Location 重導向 |
| 使用已棄用 mysql_* 函式 | PHP 7+ 移除 | 全面遷移至 PDO 或 mysqli |
vlucas/phpdotenv 管理環境變數此範例展示了經典 PHP 程式設計風格:單一檔案混合 HTML/邏輯/SQL、直接輸出、Meta Refresh 跳轉。雖邏輯完整,但安全性與可維護性嚴重不足,僅供教學參考,生產環境務必全面重構。