Toggle main menu visibility
下載輕鬆架
套件下載
使用手冊
發問討論
網站地圖
:::
登入
登入
帳號
密碼
登入
:::
所有書籍
「PHP7 入門研習」目錄
MarkDown
13-3 同時讀取兩個資料表
1. 寫在開始之前
1-1 安裝開發環境
1-2 上課範例及需求
2. PHP基本語法
2-1 註解
2-2 PHP資訊頁
2-3 建立專案目錄
3. 套用Smarty樣板
3-1 使用 Smarty
4. 前端操作界面
4-1 BootStrap 基礎排版
4-2 設計登入面板
4-3 登入表單
4-4 讓sublime自動排版
4-5 引入樣板檔
5. 判斷是否登入
5-1 接收變數
5-2 設定管理密碼
5-3 過濾變數
5-4 if 判斷式
5-5 用 $op 及 switch 迴圈來做流程控制
5-6 檢查帳號密碼
5-7 登入後,畫面應有的變化
6. 把程式片段打包成函數
6-1 資料類型
6-2 PHP常用運算符(子)
7. 資料庫規劃
7-1 常用資料庫的欄位類型
8. 增加註冊機制
8-1 連上資料庫
8-2 新增使用者到資料庫
8-3 註冊哪有這麼簡單!
8-4 異常處理
9. 從資料庫中讀取資料的方法
9-1 改寫 login()
9-2 改寫工具列
10. 製作活動管理頁面
10-1 製作頁首、頁尾檔
10-2 用物件來做表單
10-3 寫入活動到資料庫
11. 重新調整流程
11-1 列出所有活動
11-2 列出單一活動
12. 加入管理功能
12-1 執行修改
12-2 加入刪除功能
12-3 確認後刪除
13. 加入報名功能
13-1 怎樣才叫做已經報名?
13-2 列出已報名名單
13-3 同時讀取兩個資料表
13-4 報名過後,就不可再報
13-5 取消報名
14. 開始處理小細節
14-1 過期活動不該顯示出來
14-2 新增分頁
14-3 個資保護
14-4 刪除活動得同時刪除報名者
14-5 寄發通知信
15. 我參加的活動
13-5 取消報名
PHP7 入門研習 ========= 1. 其實,我們已經悄悄的內建此功能了!為什麼?因為我們當初設計資料表時,就把「uid」和「action\_id」組合成主索引,主索引只能有一組,所以絕對不會讓您有機會出現第二筆重複資料。若硬是要報名就會出現「Duplicate entry '2-1' for key 'PRIMARY'」的訊息。 2. 「那為何還要提出來修改?」因為,您覺得使用者看得懂「Duplicate entry '2-1' for key 'PRIMARY'」是啥意思嗎?更別說當使用者明明報完活動了,卻還在該活動頁面看到「我要報名」的按鈕,這時心裡會如何評價這位開發者呢? 3. 所以,請修改一下列處,以及活動頁面裡面,偵測,若使用者已經報名,就不顯示「我要報名」的按鈕。 4. 思考一下,作法有那些? ### 一、建議作法 1. 登入時就撈出所有已經參加的資料,存成陣列,並放入session 2. 列出活動時,只要利用in\_array()判斷該活動有無在陣列中即可。 3. 優點,只多做了一次SQL請求就可以搞定。 ### 二、修改 login() 登入函數 1. 修改 index.php 中的 login 函數,在登入成功後撈取該使用者所有已報名的活動編號 ``` //登入 function login() { global $db; $email = clean_var('email', 'Eamil', FILTER_VALIDATE_EMAIL); $pass = clean_var('pass', '密碼'); $sql = "SELECT * FROM `users` where `email`='{$email}'"; $result = $db->query($sql); if (!$result) { throw new Exception($db->error); } $data = $result->fetch_assoc(); if (password_verify($pass, $data['pass'])) { $_SESSION['group'] = $data['group']; $_SESSION['name'] = htmlspecialchars($data['name'], ENT_QUOTES); $_SESSION['uid'] = $data['uid']; $_SESSION['email'] = htmlspecialchars($data['email'], ENT_QUOTES); //抓取該使用者已報名的活動編號 $sql = "SELECT action_id FROM `signups` where `uid`='{$data['uid']}'"; if (!$result2 = $db->query($sql)) { throw new Exception($db->error); } $_SESSION['uid_signup'] = []; while (list($action_id) = $result2->fetch_row()) { $_SESSION['uid_signup'][] = $action_id; } } else { throw new Exception("登入失敗!"); } } ``` 2. 我們將活動編號都放入 $\_SESSION\['uid\_signup'\] 陣列中 3. 另外,讀取資料庫的迴圈中若還有讀取資料庫迴圈,其 $result 記得改名,否則第一個迴圈的 $result 會被 第二個迴圈的 $result 給取代。 4. 由於第二個迴圈只抓了一個欄位,故改用 $result2->fetch\_row() 來抓,並利用 list() 做指派,把值放到 $action\_id 中。 ### 三、修改 logout() 登出函數 1. 既然登入多了一組 session,登出時也應該要拿掉才是。 ``` //登出 function logout() { unset($_SESSION['group']); unset($_SESSION['name']); unset($_SESSION['uid']); unset($_SESSION['email']); unset($_SESSION['uid_signup']); } ``` ### 四、修改 signup() 報名函數 1. ,這部份很容易就被忽略,這是指登入後,如果又去報名其他活動,那麼報名的當下,應該要把該活動也加到 $\_SESSION\['uid\_signup'\] 陣列中才合理。 ``` //報名 function signup($action_id) { global $db; $uid = $_SESSION['uid']; $sql = "INSERT INTO `signups` ( `action_id`, `uid`, `signup_date`) VALUES ('{$action_id}', '{$uid}', NOW())"; if (!$db->query($sql)) { throw new Exception($db->error); } $_SESSION['uid_signup'][] = $action_id; } ``` ### 五、修改主樣板的活動列表 1. 我們直接在樣板中判斷即可,編輯 list\_action.tpl ``` {if $group=="admin"}
刪除
修改
{elseif $group=="user"} {if $action.action_id|in_array:$smarty.session.uid_signup}
取消報名
{else}
我要報名
{/if} {/if} ``` 2. 我們利用smarty的變數修飾器,直接使用 php 的 in\_array() 函數來判斷目前此活動編號有無在 $\_SESSION\['uid\_signup'\] 陣列中 ### 六、修改單一活動頁面下方報名按鈕 1. 一樣直接在樣板中判斷即可,編輯 show\_action.tpl ```
{if $group=="admin"}
刪除
修改
{elseif $group=="user"} {if $action.action_id|in_array:$smarty.session.uid_signup}
取消報名
{else}
我要報名
{/if} {/if}
```
:::
書籍目錄
展開
|
闔起
快速登入
所有討論區
Tad Search 資料查詢
懶人框架討論區
實戰PHP7+MySQL
XOOPS輕鬆架快速上手
校園網站輕鬆架一般討論區
Booking Helper 預約助手
es_stud_sign 班級報名
es charge 學生收費管理
E-Stud import 學生名冊管理
es_after_school 課後照顧報名
es_exam 學生作業繳交
ES_panel 校務行政面板
es_timetable 課表
ES_youtube 本校影音
info_whats 網路設備記錄
jill booking 場地預約
jill_notice 臨時公告
jill query 簡易查詢
jill receipt 領據填報
kw club 社團報名
kw device 設備借用管理系統
ntpc_oprnid 新北市 OpenID 登入
TinyD嵌入內容模組
ugm contact us 聯絡我們
ugm page 自訂頁面
ugm table 萬用表格
Yaoh Servicelearning 服務學習管理系統
dummy 自訂模組
soone_submit 投稿模組
Tad Adm 站長工具箱
Tad Assignment 作業上傳展示模組
Tad Blocks 進階區塊管理
Tad Book3 線上書籍
Tad Cal 行事曆
Tad Cbox 即時留言簿
Tad Discuss 討論區模組
Tad Embed 崁入模組
Tad Evaluation 評鑑檔案管理
Tad Form 萬用表單模組
Tad FAQ 常見問答
Tad Google 相簿
Tad Gallery 電子相簿
Tad Guide 安裝精靈
Tad Honor 榮譽榜
Tad idioms 背背成語
Tad Link 好站連結
Tad Login 快速登入
Tad Lunch3 午餐資訊
Tad Lunch2 營養午餐公告
Tad Meeting 會議系統
Tad Merage 線上合併套印
Tad News 本站消息
Tad Player 影音播放
Tad RSS 友站新聞
Tad Repair 維修通報
Tad SiteMap網站地圖
Tad Timeline 重要紀事
Tad Themes 佈景管理
Tad Tools 工具包
Tad TV 直播電視
Tad Uploader 檔案上傳模組
Tad Users 大量會員管理
Tad Web 多人網頁模組
MyTabs 我的頁籤
Random Quote 隨機小語
LogCounterX 網站流量統計
Yaoh light 多區塊多層次跑馬燈模組
校園網站輕鬆架功能建議區
佈景討論區
即時留言簿
計數器
今天:
昨天:
總計: