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
𝑃 為貸款總金額
𝑟 為月利率
𝑛 期間(月)
計算結果為每期支付的本金加利息
請函式請依上課的原則規劃