0206-網頁前端設計與開發運用培訓班
===
###### tags: `德鍵`
---
一、後台增加「登出」
---
1. templates/tpl/admin.tpl
```
<ul class="list-group list-group-flush">
<a href="index.php">
<li class="list-group-item">首頁</li>
</a>
<a href="user.php?op=logout">
<li class="list-group-item">登出</li>
</a>
</ul>
```
2. templates/tpl/admin.tpl
```htmlmixed=
<li class="list-group-item">
<a href="index.php" class="btn-block">首頁</a>
</li>
<li class="list-group-item">
<a href="user.php?op=logout" class="btn-block">登出</a>
</li>
```
2.
二、資料庫連線
---
1. 使用phpMyadmin建立一個資料庫
請輸入「資料庫名稱」與語系「utf8_general_ci」
![](https://i.imgur.com/8R8Apfn.png)
2. 讓PHP連線到MySQL資料庫
---
HTML網頁語法無法直接存取資料庫伺服器,需透過程式來介接。
注意!PHP7已經不支援MySQL系列函數,而是改用MySQLi物件,或者PDO物件。
使用PDO物件的好處是方便介接其他資料庫,而用MySQLi物件的優點則是其運作和早期MySQL較像,熟悉MySQL函數的話,幾乎可以無痛轉移。底下還是以MySQLi為範例。
基本MySQL資料庫連線方法:
$db = new mysqli(_DB_HOST, _DB_ID, _DB_PASS, _DB_NAME);
if ($db->connect_error) {
die('無法連上資料庫:' . $db->connect_error);
}
$db->set_charset("utf8");
指定欲連線的來源位置(一般為localhost),資料庫帳號、密碼及資料庫名稱。
若無錯誤訊息,表示連線成功。連線後,需設定用utf8編碼來擷取資料。
sqlConfig.php
---
在head.php 同層目錄下,建立「sqlConfig.php」
```php
<?php
#資料庫伺服器
$db_host = "localhost";
#資料庫使用者帳號
$db_user = "root";
#資料庫使用者密碼
$db_password = "111111";
#資料庫名稱
$db_name = "web11";
#PHP 5.2.9以後
$db = new mysqli($db_host, $db_user, $db_password, $db_name);
if ($db->connect_error) {
die('無法連上資料庫 (' . $db->connect_errno . ') '
. $db->connect_error);
}
#設定資料庫語系
$db->set_charset("utf8");
```
3. 在「head.php」引入「sqlConfig.php」
取消註解即可,然後回到網頁重整,如無錯誤訊息,代表資料庫連線成功
![](https://i.imgur.com/IKfNtWS.png)
三、會員註冊表單
---
會員資料表規劃
---
1. 資料表:users
2. 欄位結構:
| 欄位名稱 | 資料類型 | 欄位設定選項 | 註解 |
| -------- | -------- | -------- | -------- |
| uid | mediumint(8) | AUTO_INCREMENT <br/> UNSIGNED | 會員編號 |
| uname | varchar(255) | | 帳號 |
| pass | varchar(255) | | 密碼 |
| name | varchar(255) | | 姓名 |
| tel | varchar(255) | | 電話 |
| email | varchar(255) | | 信箱 |
| kind | enum('0','1') | DEFAULT '0' | 會員類別 |
| token | varchar(255) | | token |
3. 使用phpMyadmin建立一個資料表
資料表:users 欄位數: 7
![](https://i.imgur.com/WDh49cy.png)
![](https://i.imgur.com/13MlI7y.png)
```sql
--
-- 資料表結構 `users`
--
CREATE TABLE `users` (
`uid` mediumint(8) UNSIGNED NOT NULL COMMENT '會員編號',
`uname` varchar(255) NOT NULL COMMENT '帳號',
`pass` varchar(255) NOT NULL COMMENT '密碼',
`name` varchar(255) NOT NULL COMMENT '姓名',
`tel` varchar(255) NOT NULL COMMENT '電話',
`email` varchar(255) NOT NULL COMMENT '信箱',
`kind` enum('0','1') NOT NULL DEFAULT '0' COMMENT '會員類別',
`token` varchar(255) NOT NULL COMMENT 'token'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='會員資料表';
--
-- 資料表索引 `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`uid`);
--
-- 使用資料表自動遞增(AUTO_INCREMENT) `users`
--
ALTER TABLE `users`
MODIFY `uid` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '會員編號';
COMMIT;
```
4. 資料表建立完成後,可以匯出結構備份,方便日後重建資料表
規劃會員相關功能
---
| 功能 | $op 或參數 |
| -------- | -------- | -------- |
| 登入表單 | user.php?op=op_form |
| 登入檢查 | user.php?op=login |
| 登出 | user.php?op=logout |
google表單
---
1. Line通知
```javascript=
//表單變數
var googleFormID = "googleFormID";
function FormResponse(){
// 通過ID打開一個表單,並記錄對每個問題的回答。
var form = FormApp.openById(googleFormID);
var formResponses = form.getResponses();//得到所有回應
//---- 所有回應
for (var i = 0; i < formResponses.length; i++) {
var formResponse = formResponses[i];//每一筆回應
var itemResponses = formResponse.getItemResponses();//回應內容
var formResponseTime = formResponse.getTimestamp();//時間戳記
var formRespondentEmail = formResponse.getRespondentEmail();//取得表單上「電子郵件地址」
//----宣告試算表每列變數----
var rowdata = {};
var total = 0;
//其他自訂欄位(前)
//rowdata["填報標題"] = "";//填報標題
rowdata["時間戳記"] = formResponseTime;//表單回應時間
rowdata['電子郵件地址'] = formRespondentEmail;//電子郵件地址
//----取得單筆回應資料
for (var j = 0; j < itemResponses.length; j++) {
var itemResponse = itemResponses[j];
var title = itemResponse.getItem().getTitle();//問題名稱
var value = itemResponse.getResponse();//填報內容
rowdata[title] = value;
}
//其他自訂欄位(尾)
//----單筆回應資料end
//----單筆要做的事情
sendToLine(rowdata);//LineNotify通知
//----單筆要做的事情 end
}
//刪除回應問題
form.deleteAllResponses();
}
//填入Line Notify 權杖
var lineToken = "lineToken";
function sendToLine(rowdata){
//整理
var message = "\n";
for (var key in rowdata){
message += key + " : " + rowdata[key] + "\n";
}
var options =
{
method : "post",
payload : "message=" + message,
headers : {"Authorization" : "Bearer "+ lineToken},
muteHttpExceptions : true
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
```
2. LINE通知 + 合計 + 試算表
```javascript=
//表單變數
var googleFormID = "googleFormID";
function FormResponse(){
// 通過ID打開一個表單,並記錄對每個問題的回答。
var form = FormApp.openById(googleFormID);
var formResponses = form.getResponses();//得到所有回應
//---- 所有回應
for (var i = 0; i < formResponses.length; i++) {
var formResponse = formResponses[i];//每一筆回應
var itemResponses = formResponse.getItemResponses();//回應內容
var formResponseTime = formResponse.getTimestamp();//時間戳記
var formRespondentEmail = formResponse.getRespondentEmail();//取得表單上「電子郵件地址」
//----宣告試算表每列變數----
var rowdata = {};
var total = 0;
//其他自訂欄位(前)
rowdata["今日便當"] = "";//填報標題
rowdata["時間戳記"] = formResponseTime;//表單回應時間
rowdata['電子郵件地址'] = formRespondentEmail;//電子郵件地址
//----取得單筆回應資料
for (var j = 0; j < itemResponses.length; j++) {
var itemResponse = itemResponses[j];
var title = itemResponse.getItem().getTitle();//問題名稱
var value = itemResponse.getResponse();//填報內容
rowdata[title] = value;
if(title == "今日菜色(加10元白飯換五穀飯)"){
var subTotal = value.split("-");
total += parseInt(subTotal[1]) ;
}
}
//其他自訂欄位(尾)
//----單筆回應資料end
rowdata['合計'] = total;
//----單筆要做的事情
sendToLine(rowdata);//LineNotify通知
appendRow(rowdata);//寫入試算表
//----單筆要做的事情 end
}
//刪除回應問題
form.deleteAllResponses();
}
//填入Line Notify 權杖
var lineToken = "lineToken";
function sendToLine(rowdata){
//整理
var message = "\n";
for (var key in rowdata){
message += key + " : " + rowdata[key] + "\n";
}
var options =
{
method : "post",
payload : "message=" + message,
headers : {"Authorization" : "Bearer "+ lineToken},
muteHttpExceptions : true
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
//試算表變數
var SpreadsheetAppId = "SpreadsheetAppId";
var sheetName = '總表';
function appendRow(rowdata){
//用id取得試算表
var ss = SpreadsheetApp.openById(SpreadsheetAppId);
//用工作表名稱設定工作表
var Sheet = ss.getSheetByName(sheetName);
//設定工作表 0 1 2 ....
//var Sheet = ss.getSheets()[0];//第1個工作表
//插入第2行空白
var row = 2;
Sheet.insertRowBefore(row);
//
//寫入記錄
//時間戳記 姓名 今日菜色(加10元白飯換五穀飯) 備註 合計
var data = [rowdata['時間戳記'],rowdata['姓名'],rowdata['今日菜色(加10元白飯換五穀飯)'],rowdata['備註'],rowdata['合計']];
data.forEach(function(item,index){
Sheet.getRange(row, index+1).setValue(item);
});
}
```