0207-網頁前端設計與開發運用培訓班
===
###### tags: `德鍵`
---
一、目前狀況
---
1. 資料庫:web11
2. 資料表:users
```sql
CREATE TABLE `users` (
`uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT 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,
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='會員資料表';
```
二、註冊流程
1. 目前已有流程
| 功能 | $op 或參數 |
| -------- | -------- | -------- |
| 登入表單 | user.php?op=op_form 或<br> user.php |
| 登入檢查 | user.php?op=login |
| 登出 | user.php?op=logout |
2. 在登入畫面,已有註冊按鈕
![](https://i.imgur.com/Vn2p9Fq.png)
3. 在user.php 增加一個流程 op=reg_form
請思考這個流程的畫面,要如何寫在程式中
訪客原本只有一個「登入表單」現在又要增加一個「註冊表單」
![](https://i.imgur.com/oiBQRLu.png)
登入表單:tpl/login.tpl
4. 調整
登入表單:tpl/login.tpl => tpl/login_form.tpl
user.php?op=login_form 或 user.php
![](https://i.imgur.com/9ZdXtmf.png)<br>
![](https://i.imgur.com/i8DX0XR.png)<br>
![](https://i.imgur.com/SD92Zou.png)
5. 增加
註冊表單: tpl/reg_form.tpl => 請在tpl下,建立一個「reg_form.tpl」<br>
![](https://i.imgur.com/cnzLWK8.png)<br>
user.php?op=reg_form
所以要增加一個case 與一個 函式<br>
![](https://i.imgur.com/EuZOHwc.png)<br>
![](https://i.imgur.com/0amnwUA.png)
6. 調整註冊按鈕 tpl/login_form.tpl
```htmlmixed=
user.php?op=reg_form
```
![](https://i.imgur.com/HpbYACF.png)
7. 至此我們已將程式流程調成為
訪客:user.php?op=login_form 與 user.php?op=reg_form
可是去執行上面二個程式,畫面都還是一樣
所以程式應如何調整?
請思考.......
8. 其實可以拿 op 來判斷
![](https://i.imgur.com/6rJ3f3L.png)<br>
```htmlmixed=
<{* 訪客 *}>
<{if $op=="login_form" }>
<{include file="tpl/login_form.tpl"}>
<{elseif $op=="reg_form"}>
<{include file="tpl/reg_form.tpl"}>
<{/if}>
```
9. reg_form.tpl
```htmlmixed=
<div class="container mt-5">
<h1 class="text-center">註冊表單</h1>
<form action="user.php" method="post" id="myForm" class="mb-20" enctype="multipart/form-data">
<div class="row">
<!--帳號-->
<div class="col-sm-4">
<div class="form-group">
<label>帳號<span class="text-danger">*</span></label>
<input type="text" class="form-control" name="uname" id="uname" value="" required>
</div>
</div>
<!--密碼-->
<div class="col-sm-4">
<div class="form-group">
<label>密碼<span class="text-danger">*</span class="text-danger"></label>
<input type="password" class="form-control" name="pass" id="pass" value="" required>
</div>
</div>
<!--確認密碼-->
<div class="col-sm-4">
<div class="form-group">
<label>確認密碼<span class="text-danger">*</span class="text-danger"></label>
<input type="password" class="form-control" name="chk_pass" id="chk_pass" value="" required>
</div>
</div>
<!--姓名-->
<div class="col-sm-4">
<div class="form-group">
<label>姓名<span class="text-danger">*</span class="text-danger"></label>
<input type="text" class="form-control" name="name" id="name" value="" required>
</div>
</div>
<!--電話-->
<div class="col-sm-4">
<div class="form-group">
<label>電話<span class="text-danger">*</span class="text-danger"></label>
<input type="text" class="form-control" name="tel" id="tel" value="" required>
</div>
</div>
<!--信箱-->
<div class="col-sm-4">
<div class="form-group">
<label>信箱<span class="text-danger">*</span class="text-danger"></label>
<input type="text" class="form-control" name="email" id="email" value="" required>
</div>
</div>
</div>
<div class="text-center pb-20">
<input type="hidden" name="op" value="reg">
<button type="submit" class="btn btn-primary">送出</button>
</div>
</form>
</div>
```
10. 表單送出後 op=reg
所以 switch 要加一個 case "reg" 與 reg()
11. function reg()
```php
global $db;
print_r($_POST);
die();
```
12.
二、寫入資料庫
---
1. 可以利用「adminer」寫入一筆記錄,得到語法
2. 資料庫使用說明:https://www.ugm.com.tw/modules/tad_book3/page.php?tbdsn=1602
3. function reg()
```php
/*=======================
註冊函式(寫入資料庫)
=======================*/
function reg(){
global $db;
#過濾變數
$_POST['uname'] = $db->real_escape_string($_POST['uname']);
$_POST['pass'] = $db->real_escape_string($_POST['pass']);
$_POST['chk_pass'] = $db->real_escape_string($_POST['chk_pass']);
$_POST['name'] = $db->real_escape_string($_POST['name']);
$_POST['tel'] = $db->real_escape_string($_POST['tel']);
$_POST['email'] = $db->real_escape_string($_POST['email']);
#寫入語法
$sql="INSERT INTO `users`
(`uname`, `pass`, `name`, `tel`, `email`)
VALUES
('{$_POST['uname']}', '{$_POST['pass']}', '{$_POST['name']}', '{$_POST['tel']}', '{$_POST['email']}');
";
#寫入資料庫
$db->query($sql) or die($db->error. $sql);
$uid = $db->insert_id;
return $uid;
}
```
三、 處理密碼加密
---
1. 早期都是使用md5, 不過它已被破解
2. 現在可以使用「password_hash」
password_hash($pwd, PASSWORD_DEFAULT)
3. 不可逆!同一個密碼加密後的值會不一樣!
4. 可利用 password_verify($password, $hash) 來解密!
```php
$pass = $db->real_escape_string($_POST['pass']);
if (empty($pass)) {
die("密碼為必填!");
}
$pass = password_hash($pass, PASSWORD_DEFAULT);
```
5. 測試
password_hash.php<br>
```
<?php
/*
檔案名稱:password_hash.php
*/
$pwd = "123456";
$hash = password_hash($pwd, PASSWORD_DEFAULT);//加密
$md5 = md5($pwd);
echo "------------------ hash -----------------";
echo "<br>";
echo $hash;
echo "<br>";
if (password_verify($pwd, $hash)) { //判斷密碼
echo "密碼正確(hash)";
}
echo "<br>";
echo "------------------ md5 -----------------";
echo "<br>";
echo $md5;
```
6. 密碼破解網站:https://www.cmd5.com/
7. step5
```php
/*=======================
註冊函式(寫入資料庫)
=======================*/
function reg(){
global $db;
$_POST['uname'] = $db->real_escape_string($_POST['uname']);
$_POST['pass'] = $db->real_escape_string($_POST['pass']);
$_POST['chk_pass'] = $db->real_escape_string($_POST['chk_pass']);
$_POST['name'] = $db->real_escape_string($_POST['name']);
$_POST['tel'] = $db->real_escape_string($_POST['tel']);
$_POST['email'] = $db->real_escape_string($_POST['email']);
#加密處理
if($_POST['pass'] != $_POST['chk_pass'])die("密碼不一致");
$_POST['pass'] = password_hash($_POST['pass'], PASSWORD_DEFAULT);
$sql="INSERT INTO `users` (`uname`, `pass`, `name`, `tel`, `email`)
VALUES ('{$_POST['uname']}', '{$_POST['pass']}', '{$_POST['name']}', '{$_POST['tel']}', '{$_POST['email']}');";
$db->query($sql) or die($db->error() . $sql);
$uid = $db->insert_id;
}
```
8.
四、待處理事項
---
1. 前台驗證
2. 後台驗證
3. 轉向函式
五、美化Google表單
```
<iframe name="returnWin" style="display: none;" onload="this.onload=function(){window.location='ok.html'}"></iframe>
```
1. form 須給一個 target="returnWin"
2. google rpo https://github.com/tawan158/google