Transcript 2012-07-18

PHP 程式撰寫技巧
By Cwlin
表單



在網頁中需要使用者填寫資料儲存到網站時會使用表單的元素
標籤
需要配合動態網頁的設計來接收資料
表單所使用的元素標籤為 <FORM>

<FORM action=“網址” method=“post”>




表單的內容
</FORM>
action 為用來接收表單資料的網址
method 為資料傳送的方式分為

POST


使用 HTTP 協定來傳送資料
GET

透過網址來傳送資料 (較無隱私)
表單資料傳送的方式

GET





透過網址傳送資訊,有長度的限制 (255 字元)
無私密性,傳送的資訊可從網址列看到
可記錄,網址可透過加入書籤的方式記錄資訊以便下次重新載入
例:
https://maps.google.com/?ll=22.650136,120.335612&spn=0.034378
,0.066047&t=m&z=15
POST

透過協定內容的方式傳送資訊,長度的限制依網頁伺服器所設定




PHP 預設為 8MB
較具私密性,無法直接看到傳送資料的內容
不可記錄,無法記錄傳送的內容
AJAX 技術即是利用 JavaScript 執行表單的 GET/POST 來傳送資
料
使用的時機

GET 傳送的資料短,不具私密性,使用者可直
接更改
 頁面的轉換
 可以記錄狀態的功能

POST 傳送的資料長,較且私密性,使用者無法
直接更改
 文章資料
 帳號密碼資訊
表單元件

表單元件所使用的標籤為 <INPUT>
 <INPUT
type="radio" name="sex" value="Male“>
 type 為表單元件的類型
 送出按鈕(submit),
重置按鈕(reset), 單選方塊(radio), 多選
方塊(checkbox), 文字方塊(text), 檔案瀏覽(file)
 name
為該表單元件的欄位名稱
 供接收資料的動態網頁判斷資料用
 value
為未填寫資料時的預設值 (可不指定)
表單元件-文字方塊


用於表單多選之內容
<form>
First name:
<INPUT type="text" name="firstname" /><br />
Last name:
<INPUT type="text" name="lastname" />
</form>
表單元件-單選方塊

單選表單元件


name 屬性必須相容才會成為同一個群組(Group)
<form>
<INPUT type=“radio” name=“sex” value=“male” />
Male<br />
<INPUT type="radio" name="sex" value="female" />
Female
</form>
表單元件-多選方塊

多選表單元件


適合簡短且項目
<form>
<INPUT type=“checkbox” name=“vehicle” value=“Bike” />
I have a bike<br />
<INPUT type="checkbox" name="vehicle" value="Car" />
I have a car
</form>
表單元件-下拉式選單


下拉式選單

單選項目

較節省空間
<select name=“vehicle”>
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>
表單元件-送出


用於將表單中的資料送交給後端的動態網頁程式(如: PHP,
ASP, JSP 等)
<form name="input" action="html_form_action.asp"
method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>
表單元件-清除


用於將表單中的資料清除,通常會配合送出按鈕使用
<form name="input" action="html_form_action.asp"
method="get">
Email: <input type="text" name=“email" />
Pin: <input type="text" name=“pin" />
<input type=“reset" value=“Reset" />
</form>
檔案上傳

檔案上傳較有別於其他表單欄位的傳送方式,
有以下的限制
 必須使用
POST 的方式傳送
 method="post"
 傳送資料的編碼方式需採用
mutipart/form-data
 enctype="multipart/form-data“

HTML 語法
 <input
type="file" name="somename">
PHP 表單資料的接收

在 PHP 接收表單資料透過以下三個全域變數

$_GET


$_POST


接收表單使用 POST 所傳送到 PHP 的值
$_FILES


接收表單使用 GET 所傳送到 PHP 的值
接收表單傳送到 PHP 的檔案
三個變數皆為陣列型態,需要代入 HTML 表單元件所使用
的 name 屬性
<?php
echo 'Hello ' . htmlspecialchars($_GET[“user"]) . '!';
?>
PHP 表單檔案的接收

$_FILES 變數所傳送的資料較多,包含

$_FILES[‘fieldname’][‘name’]


$_FILES[‘fieldname’][‘type’]


檔案的大小
$_FILES[‘fieldname’][‘tmp_name’]


檔案的類型
$_FILES[‘fieldname’][‘size’]


檔案的名稱
檔案的暫存路徑
$_FILES[‘fieldname’][‘error’]

上傳錯誤的代號
PHP 表單檔案的接收 (續)


PHP 的會將上傳的檔案放置在伺服器暫存的位置,可
以用 $_FILES[‘fieldname’][‘tmp_name’] 取得路徑
當開發者確認檔案無誤可使用 move_uploaded_file()
函式將檔案移至開發者自訂的目錄當中
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}
函式的用途



function 可以翻作函數、函式、功能
在數學中函數可以代表一個公式,在程式中函數可
以代表一段程式的功能
函式最大的目地在於讓程式碼
易於閱讀、有架構
 重複使用



函式通常是從可能會被重複執行的程式碼當中所歸
納出來
當一段程式在撰寫時,已經知道後面可能會被重複
使用,就可以先規劃函數
何謂函式

函式
𝑓

𝑥 = 𝑥2
函式會有以下東西
 名稱,代表函式所處理的事情:
𝑓()
 傳入值,函式計算時必要的參數: 𝑥
2
 回傳值,函式計算完的結果: 𝑥

例如:
 平方的計算:
𝑆𝑞𝑢𝑎𝑟𝑒 𝑥 = 𝑥 2
 平方根的計算: 𝑅𝑜𝑜𝑡 𝑥 = ± 𝑥
函式的使用

函式的來源通常有兩種:

程式語言本身所提供的


自行定義的


每個程式語言本身都會提供許多的基本函式供開發者使用,也就是程
式語言最原始的功能
當程式提供的函數不足以使用,我們便會自己撰寫函數
使用函式只需要知道函數的功能是什麼,需要那些參數便
可以使用


在程式語言中函式的使用稱作呼叫(Call)
重覆顯示 10 個 A,例如:
<?php
echo str_repeat(“A", 10);
?>
PHP 函建函式的查詢



每種程式語都有文件可以查詢內建的函式的用
法,俗稱 API (Application Programming Interface)
文件
根據文件找到適合的函式使用
PHP 文件的網址
 http://tw.php.net/manual/en/funcref.php
函式的定義


在程式中的函式依程式語言的不同表答方式也略有
所異,但觀念是一樣的
以 PHP 為例:
function square($x) {
return $x * $x;
}

程式中的函式與數學函式的差異

可以處理的型態不只有數字一種


如: 整數、浮點數、字串、布林值、物件
除了計算可以處理在程式中的任何動作
練習: 次方的計算

請將以下數學公式寫成函式
𝑥, 𝑦 = 𝑥 𝑦
 計算 𝑥 的 𝑦 次方
𝑓
範例: 次方的計算

以 PHP 函式為例
function power($x, $y) {
$result = 1;
for($i=0; $i<$y; $i++) {
$result = $result * $x;
}
return $result;
}
練習: BMI 的計算

請將以下數學公式寫成函式
 𝑏𝑚𝑖
𝑤, ℎ =
𝑤
ℎ2
為體重 (公斤)
 ℎ 為身高 (公尺)
 註: 請運用先前寫的次方函式
𝑤
範例: BMI 的計算

以 PHP 函式為例
function bmi($w, $h) {
return $w / power($h, 2);
}
練習: BMI 的結果建議

請將以下數學公式寫成函式
 𝑏𝑚𝑖𝑆𝑢𝑔𝑔𝑒𝑠𝑡𝑖𝑜𝑛
𝑏𝑚𝑖 = 𝑠𝑢𝑔𝑔𝑒𝑠𝑡𝑖𝑜𝑛
 𝑠𝑢𝑔𝑔𝑒𝑠𝑡𝑖𝑜𝑛 為建議的訊息如下表所示
 註: 請運用先前寫的次方函式
範例: BMI 的結果建議

以 PHP 函式為例
function bmiSuggestion($bmi) {
$suggestion = '';
if( $bmi < 18.5 ) {
$suggestion = '體重過輕';
} else if( $bmi < 24 ) {
$suggestion = '正常範圍';
} else if( $bmi < 27 ) {
$suggestion = '稍重';
} else if( $bmi < 30 ) {
$suggestion = '輕度肥胖';
} else if( $bmi < 35 ) {
$suggestion = '中度肥胖';
} else {
$suggestion = '重度肥胖';
}
return $suggestion;
}
練習: 整存整付



請將以下數學公式寫成函式
事先約定存款年限及金額,在期初將本金一次
存入,每月產生的利息皆滾入本金計算並成為
本金一部份,於期末領回本金及利息
𝑓𝑣(𝑃, 𝑟, 𝑛) = 𝑃 × 1 + 𝑟 𝑛
為現值
 𝑟 為利率
 𝑛 期間(月)
𝑃
練習: 零存整付的計算



請將以下數學公式寫成函式
零存整付,每個月皆固定存入一定金額的本金,
然後將本月的本金加利息滾入下個月的本金。
於到期後本金連同加計之複利利息一併領回
𝑚𝑜𝑛𝑡ℎ𝑙𝑦𝐷𝑒𝑝𝑜𝑠𝑖𝑡(𝑃, 𝑟, 𝑛) = 𝑛𝑖=1 𝑓𝑣 𝑃, 𝑟, 𝑖
為本利合
 𝑃 為每月存入總金額
 𝑟 為月利率
 𝑛 期間(月)
𝑐
好的程式撰寫


一個有易於閱讀、有結構、容易維護及使用的
程式,通常所有的動作是用函式所組成
函式命名很重要,好的函數命名可以讓程式看
起來像文章,看了名稱就能知道函式在做什麼
函式與副程式的差異



副程式其實就是沒有傳回值的函數
副程式指的是程式裡的某一段程式碼,沒有特
定的傳回值、處理的結果,但可以歸納成為一
個動作
當程式在過於攏長時,我們會把一段攏長的程
式切割成數個不同的副程式,給予適當的名稱
易於閱讀、再利用
函式的規劃原則



函式名稱

以英文命名名稱簡潔明瞭,可以表達函式在做的事情

根據函式內的程式找到必要的參數,每個參數型態要明
確,不可模糊不清
傳入值的名稱與型態
傳回值的名稱與型態


函式一定要回傳處理、計算完的結果,否則函式的結果
將無法再利用,型態要明確、統一,不可混合不同型態,
會導致使用函式的人無法辨別
函式內容

每個函式只處理一件事,如名稱所定義,函式與函式之
間要可以獨立使用
作業


按月本息平均攤還為貸款的其中一種還款方式,將
貸款期間內全部貸款本金與利息平均分攤於每一期
中償還,設計一個表單可以計算本息平均攤還,公
式如下
𝑓(𝑃, 𝑟, 𝑛) = 𝑃 × 1 + 𝑟
𝑛
×
𝑟
1+𝑟 𝑛 −1
𝑃 為貸款總金額
 𝑟 為月利率
 𝑛 期間(月)
 計算結果為每期支付的本金加利息


請函式請依上課的原則規劃