本章實作三個 PHP 腳本,分別服務「學分保存方案」與「歷史同盟」網站:
score_entry.php:測驗/考試分數錄入與修改。pres_quiz.php:美國總統出生地隨機測驗(互動式)。edit_member.php:會員線上編輯個人資料(含密碼驗證)。PHP 自動將 URL 參數(?action=value)與表單欄位(name="field")轉為同名變數($action、$field)。陣列欄位(name="score[123]")自動轉為 $score[123]。腳本主架構:
switch ($action) {
case 'DISPLAY_EVENTS': display_events(); break;
case 'SOLICIT_EVENT': solicit_event_info(); break;
case 'ADD_EVENT': add_new_event(); break;
case 'DISPLAY_SCORES': display_scores(); break;
case 'ENTER_SCORES': enter_scores(); break;
}
函式內需 global $PHP_SELF 取得自身 URL 產生連結/表單遞交目標。
score_entry.php)display_events()):查詢 event 表,每列顯示 ID、日期、類型,ID 為連結帶 ?action=DISPLAY_SCORES&event_id=...。solicit_event_info() → add_new_event()):表單輸入日期、單選按鈕選類型(測驗/考試),送出後寫入 event 表,回列表頁。display_scores()):LEFT JOIN student + score 確保無分數學生也顯示空白欄位。輸入框命名 score[student_id],送出時 PHP 自動建立 $score 陣列。enter_scores()):遍歷 $score,空值執行 DELETE,非空值驗證整數後 REPLACE INTO score(兼具新增/更新)。缺點:無任何認證機制,任何人可修改分數。後續會員編輯腳本示範簡易密碼保護。
pres_quiz.php)ORDER BY RAND() 隨機抽取一位總統:SELECT name, birth_place FROM president ORDER BY RAND() LIMIT 1。SELECT birth_place FROM president WHERE birth_place != ? ORDER BY RAND() LIMIT 4。name、place、choice)保存正確答案與選項組合,遞交時比對 $response 與 $place。edit_member.php)member_pass(member_id, password) 表,密碼存 MD5 雜湊:INSERT ... VALUES (id, MD5(RAND()))。另加管理員帳號 member_id=0, password='secret'。check_pass() 查詢比對 MD5,或管理員密碼通吃。display_entry() 顯示編輯表單:ID、到期日(一般會員唯讀,管理員可編輯)等欄位。密碼以隱藏欄位帶入下一步。update_entry() 重新驗證密碼,處理空值轉 NULL(到期日 NULL 代表終身會員),依欄位中繼資料(mysql_fetch_field() + IS_NOT_NULL())決定是否插入 NULL 或空字串。安全提醒:密碼明文傳輸(HTTP),生產環境應改用 HTTPS + 雜湊挑戰或 PHPLIB 等完整認證庫。