傳遞變數
GET V.S. POST
兩者差別
- GET是透過URL傳遞資料;POST是透過表單。
- URL傳遞資料會有長度限制;POST則不會。
- GET使用者能從URL看到資料;POST則不會。
- GET會有快取問題;POST不會。
攔封包問題可以利用SSL去解決。
快取問題可以在最後面帶timestmp的方式解決。
傳遞變數
GET V.S. POST
使用時機
GET適合用在頁面切換(能上一頁);
POST適合用在不準返回的表單。
傳遞變數
GET
在網址列後面加參數,每個參數以&隔開,
除了英文數字,其他都要做url encode。
index.php?參數1=123&參數2=鬼才好厲害
PHP urlencode
echo urlencode("鬼才好厲害");//%E9%AC%BC%E6%89%8D%E5%A5%BD%E5%8E%B2%E5%AE%B3
傳遞變數
GET練習2
get2.php?v1=123&v2=456&v3=789
指定列出GET值
<p><?php echo $_GET['v1'];?></p><p><?php echo $_GET['v3'];?></p>
傳遞變數
GET練習3
判斷有沒傳值
<?php if( isset( $_GET['v1']) ) {?> <p>v1=<?php echo $_GET['v1'];?></p><?php }else{?> <p>沒傳傳值</p><?php }?>
傳遞變數
GET練習4
用GET指定產生表格的行列數
傳遞變數
利用GET切換網頁
index.php?page=blog
<?php if( isset( $_GET['page']){ if($_GET['page']=='blog'){ include('blog.php');
} elseif($_GET['page']=='profile'){ include('profile.php');
} else{ include('index.php'); } }?>
傳遞變數
利用GET切換網頁
傳遞進來的參數都是"髒的"要先處理過。
錯誤示範
<?php if( isset( $_GET['page'] ) ){ require( $_GET['page'] ); }?>
我可以用這漏洞隨意瀏覽你伺服器上的檔案。
index.php?page=..\..\..\bin\php\php5.3.13\php.ini
傳遞變數
HTML 表單
- action = 要傳遞的網址 (必需)
- method = 傳遞的方式 (可選,預設GET)
- enctype = 編碼方式,
在處理檔案上傳時必需設定為multipart/form-data
<form action="url" method="post">
</form>
傳遞變數
HTML表單
我們先建一個檔案 test.php,放在c:/wamp/www/
作用是把GET、POST的變數全列出來
<p>GET : <?php print_r($_GET);?></p><p>POST : <?php print_r($_POST);?></p>
傳遞變數
HTML 表單
type=元件類型;name=變數名稱;value=數值。
<form action="test.php" method="get">
<input type="text" name="user_name" />
<input type="password" name="user_password" />
</form>
傳遞變數
HTML表單
value = 按紐上的文字。
<form action="test.php" method="get">
<input type="text" name="user_name" />
<input type="password" name="user_password" />
<input type="submit" value="登入" />
<input type="reset" value="重填" />
</form>
傳遞變數
HTML表單
練習 :
-
把剛剛的表單改成用POST的型式,
傳遞資料給test.php。
-
把乘法表改成用POST的方式 [GET練習4]。
傳遞變數
HTML表單
複選框 type="checkbox"
name=變數名稱;value=數值;checked=是否勾選。
<form action="test.php" method="post">
<input type="checkbox" name="A" value="A" checked="checked" />
<input type="checkbox" name="B" value="B" />
<input type="checkbox" name="C" value="C" />
<input type="checkbox" name="D" value="D" />
<input type="submit" />
</form>
傳遞變數
HTML表單
複選框 type="checkbox"
傳送陣列
<form action="test.php" method="post">
<input type="checkbox" name="item[]" value="A" checked="checked" />
<input type="checkbox" name="item[]" value="B" />
<input type="checkbox" name="item[]" value="C" />
<input type="checkbox" name="item[]" value="D" /></form>
傳遞變數
HTML表單
文字區塊 textarea
cols=寬度;rows=行數;name=變數名稱。
<form action="test.php" method="post">
<textarea rows="3" cols="20" name="message">預設訊息</textarea>
<input type="submit" />
</form>
傳遞變數
HTML表單
下拉式選單 select
name=變數名稱;size=可見數目。
<form action="test.php" method="post">
<select name="select_name"> ....
</select>
<input type="submit" />
</form>
傳遞變數
HTML表單
下拉式選單項目 - option
value="傳送的數值";selected="selected",預設選擇。
<form action="test.php" method="post">
<select name="select_name">
<option value="1">Android</option>
<option value="2">UNITY3D</option>
<option value="3">SHIVA3D</option>
<option value="4">ANDROID(高階)</option>
<option value="5" selected="selected">雲端</option>
</select>
<input type="submit" />
</form>
傳遞變數
HTML表單
下拉式選單項目群組 - optgroup
label = 群組名稱。
<form action="test.php" method="post">
<select name="cpu">
<optgroup label="INTEL">
<option value="i3">i3</option>
<option value="i4">i4</option>
<option value="i5">i5</option>
</optgroup>
<optgroup label="AMD"> <option value="AM3+">AM3+</option>
<option value="FM2">FM2</option>
</optgroup>
</select>
<input type="submit" />
</form>
傳遞變數
HTML表單
隱藏欄位 type="hidden"
可以填入預設的參數跟數值,使用者通常不會去改他。
舉例 : Blog的文章回應
<form action="test.php" method="get">
<input type="text" name="user_name" />
<textarea rows="3" cols="20" name="message">我要留言</textarea>
<input type="hidden" name="id" value="123" />
<input type="submit" value="留言" />
<input type="reset" value="重填" />
</form>
傳遞變數
資訊安全
你確定 單選框、複選框、下拉式選單、、、,
真的只能傳送你指定的數值嗎?
示範:
從DEBUG視窗修改數值再傳送。
傳遞變數
資訊安全
你確定 別人填進來的文字 安全嗎?
示範:
XSS、CSRF攻擊。
當然還有 SQL Injection,講PHP資料庫連接時會示範。
傳遞變數
HTML表單
改善UI/UX
-
標籤 - label
-
提示輸入(HTML5) - placeholder
<input type="text" name="inputEmail" placeholder="這邊要輸入Email!!">
傳遞變數
HTML表單 - label用法
type="text"、type="password"、select、textarea
for屬性值=輸入框的ID
<form action="test.php" method="post">
<label for="user_name">帳號</label>
<input type="text" id="user_name" name="user_name" />
<label for="user_password">密碼</label>
<input type="password" id="user_password" name="user_password" />
<input type="submit" value="登入" />
</form>
傳遞變數
HTML表單 - label用法
check
<form action="test.php" method="post">
<label>
<input type="checkbox" value="boy"> 男 </label>
<label>
<input type="checkbox" value="girl"> 女 </label>
<input type="submit" />
</form>
傳遞變數
HTML表單 - label用法
radio
<form action="test.php" method="post"> <label>
<input type="radio" name="sex" value="boy" checked="checked" >
男
</label>
<label>
<input type="radio" name="sex" value="girl">
女
</label>
<input type="submit" />
</form>
傳遞變數
HTML表單 - 練習
建立一個活動回饋表單,內容要有以下(要使用label)。
- 留言者
- 電話(用密碼欄位)
- 有參加的活動名稱
- 最喜歡的活動名稱(下拉式選單)
- 性別(單選)
- 意見(文字區塊)
傳遞變數
HTML表單
按紐 button
type = button、reset、submit;
name=變數名稱;value=變數值。
裡面可以放HTML。
<button type="button"> <h1>test</h1> <img src="https://www.google.com.tw/images/srpr/logo4w.png" /></button>
傳遞變數
檔案上傳 type="file"
test.php 加一段程式碼 :
$_FILES:<?php print_r($_FILES) ?>
HTML
<form action="test.php" method="post" enctype="multipart/form-data">
<input name="file_upload" type="file" id="file_upload">
<input type="submit" name="Submit" value="確定上傳">
</form>
傳遞變數
PHP檔案上傳
上傳要記得確認身份、檔案類型,最好還要資料庫記錄。
<?php
$base_path = "";
if(!empty($_FILES['file_upload']['name'])) {
$upfile = $base_path . $_FILES['file_upload']['name'] ;
if(copy($_FILES['file_upload']['tmp_name'],$upfile)){
echo "上傳成功";
}else{
echo "上傳失敗";
}
}
?>