Data Transfer
在Server與Client之間需要資料傳遞,若要將資訊傳回伺服器,通常可使用get與post方式。get會將資料顯示在URL列(不安全且長度有限制),post會將資料整個包裹寄到伺服器再做後續處理。GET
php4_1_get.php
- $_SERVER["PHP_SELF"]用來取得目前之php檔案名。將""替換為"php4_1_get.php"結果會相同。
- 假設URL路徑為http://www.ooxx.com/WorkSpace/php4_1_get.php?name=Tom,那麼
- $_SERVER['HTTP_HOST']傳回www.ooxx.com
- $_SERVER['REQUEST_URI']傳回/WorkSpace/php4_1_get.php?name=Tom
- $_SERVER['PHP_SELF']傳回/WorkSpace/php4_1_get.php
- $_SERVER['QUERY_STRING']傳回name=Tom
- PHP包含數個是先定義好的全域變數稱為Superglobals,可在程式碼中隨時使用。
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
- isset()用來判斷變數是否存在且值不為NULL。e.g. $a=null;isset($a)傳回false。 $_GET["name"]是get表單傳回name="name"的值。
POST
php4_1_post.php
- $_POST["name"]也可以使用$_REQUEST["name"]代替。
- post可傳送較多資料且不會顯示在URL列,較為安全。
- 將<?php echo $_SERVER["PHP_SELF"]; ?>換成<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>,htmlspecialchars()可將特殊字元轉為HTML entities(e.g. <:<),如此網頁可避免其他人惡意侵入,較為安全。
FORM
使用各式表單(Form)來將資料傳遞到伺服器,還有哪些講究?Required
php4_2_form.php
- 因為checkbox可以複選,記得其name要使用pets[]代表為array,並宣告$pets為array。
- 若是每個欄位都是必填(不能空白)要如何設計?
php4_2_formRequired.php
- 使用empty()方法來確認取得內容是否是empty。
- empty()原則上等於!isset($var) || $var == false,以下幾項視為empty:
- "" (an empty string)。
- 0,0.0,'0'(integer, float, string)。
- null。 false。
array() (an empty array)。
- 文字輸入欄可以加上value="<?php echo $name; ?>"這一屬性。
- radio box可以加上<?php if(isset($side)&& $side=="聯盟") echo "checked"; ?>這一段php程式碼。
- check box可以加上<?php if(isset($pets)&& in_array("灰皮貓",$pets)) echo "checked"; ?>這一段php程式碼。
Validation
為了避免有人胡亂輸入,除了要求必填之外,尚須要確認輸入內容符合規範。
php4_3_validation.php
- 使用preg_match(regex, subject)函數來針對某一字串進行檢驗,第一個參數regex為Regular Expression。
- filter_var(variable, filter, options)函數可根據不同的filter來協助過濾不合格的型態,此處filter選擇FILTER_VALIDATE_EMAIL來過濾email格式。
- 使用FILTER_VALIDATE_EMAIL之前先使用FILTER_SANITIZE_EMAIL可以幫我們先去除一些多餘的內容,例如abc@ g m a il.com,其中多了一些空白,FILTER_SANITIZE_EMAIL可以先幫我們去除。
Include File
檔案可以傳輸更多資料,而且在檔案內的內容可以被多次使用。可以使用的語法為include與require。先寫幾個要被include的檔案。php4_4_header.php
php4_4_nav.php
php4_4_js.php
php4_4_footer.php
- 在另一個檔案中使用include或是require指令納入以上幾個檔案。
php4_4_include.php
- 以上指令使用部分JavaScript語法。
- include與require的不同處是若是發生錯誤(例如找不到檔案),include()會產生警告,而require()會產生錯誤並停止執行。
- include_once與require_once的作用與include跟require一樣,只是只會納入一次,如此可避免重複納入的錯誤。
File System
在PHP可以進行檔案操作,包含開啟關閉讀取寫入等。Open&Close File
使用fopen($filename, $mode)函數來開啟檔案並使用fclose($handle)函數來關閉檔案。
php4_5_fopen.php
-
使用file_exists(filename)函數來判斷該檔案是否存在。
- fopen(filename, mode)的mode參數用來確認如何操作檔案,可使用的值如下。
- r: 讀取,file opinter指向檔案開頭。
- r+: 讀寫,file opinter指向檔案開頭。
- w: 寫入,若文件不存在則自動產生。file opinter指向檔案開頭並將檔案大小歸零。
- w+: 讀寫,若文件不存在則自動產生。file opinter指向檔案開頭並將檔案大小歸零。
- a: 寫入,若文件不存在則自動產生。file opinter指向檔案最後(append)。
- x: 產生檔案以寫入。若是檔案已存在則fopen()會傳回false並產生錯誤。
- x+: 產生檔案以讀寫。若是檔案已存在則fopen()會傳回false並產生錯誤。
- c: 寫入,若文件不存在則自動產生。若檔案存在,file opinter指向檔案開頭。
- c+: 讀寫,若文件不存在則自動產生。若檔案存在,file opinter指向檔案開頭。 flag: rb-read binary file(e.g. .gif)。
使用die(errorMessage)函數來輸出錯誤訊息並離開(也可以使用exit(errorMessage),兩者是相同的)。
Read File
讀取檔案使用fread($handle, $length)檔案。
php4_5_fread.php
-
若是直接讀取所有內容印出,會全部擠在一行(filesize($filename)可以得到檔案的大小)。因此使用while來一行一行讀取並換行。
feof()可判斷是否到達end of file,fgets可在file point讀取一行。
-
使用readfile($filename)函數讀取檔案內容連open都不需要,讀取後會直接將內容印出,若想顯示換行,可使用<pre>標籤。
php4_5_readfile.php
使用file_get_contents($filename)函數讀取檔案內容,傳回字串。可用nl2br()函數在每行之前插入<br>,或是使用字串函數str_replace()將\n換成<br>來換行。
php4_5_fileGetContents.php
使用file($filename)函數讀取檔案內容,傳回Array。可用foreach來換行。
php4_5_file.php
Write to a File
使用fwrite($file, $string)函數將$string寫入$filename。
php4_5_fwrite.php
-
使用PHP_EOL來換行。
讀取檔案可使用任意read file方法。
-
使用file_put_contents($filename, $data [,$flags])函數將內容寫入檔案。flags可為FILE_USE_INCLUDE_PATH,FILE_APPEND,LOCK_EX。沒有flag會覆寫舊檔案,使用FILE_APPEND則append。
-
php4_5_fileGetContents.php
Rename&Remove File
使用rename($oldname, $newname)來將檔案改名,使用unlink($filename)來刪除檔案。
php4_5_fileRename.php
-
若是$newname中包含路徑(path),那麼檔案會移至該路徑,而且可以跨device(drive C to drive E),如此方式可以複製檔案。
顯然讀取檔案也可以跨device。
php4_5_unlink.php
- file system相關函數:
- fgetc(): 讀取一個字元。
- fgets(): 讀取一行。
- fgetcsv(): 讀取逗點(,)分隔的一行。
- filetype(): 傳回檔案的型態。
- feof(): 檢查是否到達檔案最後。
- is_file(): 檢查是否是一般檔案。
- is_dir(): 檢查是否為路徑。
- is_executable(): 檢查是否是可執行檔案。
- realpath(): 傳回絕對路徑。 rmdir(): 移除空路徑。
Upload & Download files
資料傳輸當然包含檔案的傳輸,可以上傳檔案到伺服器也可以自伺服器下載檔案。Upload File
- 上傳檔案使用HTTP檔案上傳變數$_FILES,是一個內定的全域變數(Superglobals)。這是一個包含上傳檔案相關資料的array,包含的資料有:
- $_FILES["userfile"]["name"]: 原始檔案名。
- $_FILES["userfile"]["type"]: 檔案的MIME型態。
- $_FILES["userfile"]["size"]: 檔案大小(bytes)。
- $_FILES["userfile"]["tmp_name"]: 暫時檔名。
- $_FILES["userfile"]["error"]: 錯誤碼。
- 0: 沒有錯誤。
- 1: 上傳檔案大小超過upload_max_filesize in php.ini。
- 2: 上傳檔案大小超過form中所限定的大小(MAX_FILE_SIZE)。
- 3: 上傳檔案只有部分上傳成功。
- 4: 沒有檔案上傳。
- 6: 缺少暫時資料夾。
- 7: 寫到磁碟失敗。
- 8: PHP延伸檔名阻止檔案上傳(使用phpinfo()方法可能幫助釐清延伸檔名)。
php4_6_fileUpload.php
- 需先設計上傳表單(post),且將型態定為multipart/form-data。
- 接著設計對應的fileupload.php來處理上傳。
fileupload.php
- 當錯誤訊息大於0,傳回錯誤。
- 此時檔案於暫存位置,若要見到檔案,須使用move_uploaded_file($filename, $destination)將其移至目標資料夾,假設要移動至upload資料夾,先在WorkSpace下建立upload資料夾。
fileupload.php
- 使用move_uploaded_file()函數來移動檔案,若要到其他特定位置可用絕對位置(e.g. E:/Temp/)替換upload/。
- 此例子可上傳任意型態檔案,亦可自訂檔案型態並使用$filetype來過濾,可用來限定上傳型態,例如僅接受圖檔上傳(.gif, .png, .jpg等)。例如if ($filetype!="jpg" && $filetype!="gif" && $filetype!="png") echo("wrong type.");
- 此例子限定上傳檔案大小不超過5M($maxsize)。
- 也可以使用file_exists()來避免重複上傳。
Download File
下載檔案只需要使用html的標籤a即可。
php3_4_time.php
-
如果是PDF或是圖檔,按左鍵僅會開啟不會下載(按右鍵選擇下載),若是zip還是exe檔案會自動下載。
Cookies & Sessions
Cookies是一個文字檔,允許我們儲存小量資料(約莫4KB)在使用者的電腦。Sessions則是儲存在伺服器。Cookies
欲使用cookie,需先使用setcookie($name[, $value[, $expire[, $path[, $domain[, $secure[, $httponly]]]]]])函數設定,否則無法送出cookie。
- setcookie的參數涵義為:
- $name: cookie名稱。
- $value: cookie的值(不要儲存重要的資訊因為會存在使用者的電腦)。
- $expires: expiry date in UNIX timestamp format(如果是0或是沒有設定,cookie會在瀏覽器關閉時失效)。
- $path: the path on the server which the cookie will be available(如果是/則表示全部範圍都可得到)。
- $domain: 可得到cookie的domain(e.g. www.OOXX.com)。
- $secure: 如果是True表示cookie僅在存在安全連線時會送出。
- $httponly: 如果是True表示cookie僅可經由HTTP協議得到。
php4_7_cookies.php
- 養成習慣使用isset()。
- 使用print_r()顯示array資訊。
- 使用一樣的setcookie資訊(將時間改為負的)來刪除cookie。
- 執行第二次才會得到cookie的值。
Sessions
Session會將資料儲存在伺服器,如此可以避免如cookie每次都要將資料先傳回,此外安全性也較高。要使用session需先使用session_start()函數來建立新的session,並同時為使用者產生一個唯一的id。
php3_4_time.php
- session_start()一開始會先偵測session是否已經存在,若不存在才會產生新的。
- 使用print_r()函數印出array內容。
- 使用session_destroy()來刪除session。若僅只要移除特定session資料,可以使用unset函數(e.g. unset($_SESSION['occupation']))。
Email --> Under Research
PHP可以讓我們寄送信件,使用mail($to, $subject, $message[, $headers[, $parameters ]])。- mail的參數涵義為:
- $to: 收件人email address。
- $subject: 主題。
- $message: 信件內容(使用\n換行,每行應少於70 characters)。
- $headers: 通常用於額外header例如From, Cc, Bcc,應使用\r\n來換行。
- $parameters: 用於傳送額外參數。