Cookie
php可以在用戶感知不到的情況下支持HTTP cookie,cookie是在客戶端瀏覽器存儲的用戶來跟蹤識別用戶身份的機制。在php中可以用setcookie() 或 setrawcookie() 函數設置cookie。cookie是HTTP頭的一部分,所以setcookie()函數必須在輸出其他信息到瀏覽器之前調用。
如果 variables_order 中包括“C”,則任何從客戶端發送的 cookie 都會被自動被放進$_COOKIE全局數組。如果希望對一個 cookie 變量設置多個值,則需在 cookie 的名稱后加 [] 符號。
解釋一下variables_order:這是php.inpi配置文件中的一個配置項,用來設置全局變量的解析,他有5個值:EGPCS,分別表示Environment, Get, Post, CookieServer,栗子:如果variables_order=SP,php就會創建全局數組$_SERVER,$_POST。
cookie基本用法
setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
參數說明:
name:cookie的變量名。
value:變量值。
expire:過期時間。
path:cookie生效的路徑,如果設置“/“表示在整個域名都有效,如果設置為”/xyy/“,表示只有在xyy目錄以及它的子目錄下有效。
domain:設置cookie生效的域名,栗子:如果設置成php.com,那么所有包含php.com的域名都可以使用這個cookie,如:www.100php.com或www.100php.com.cn
secure:如果這個值設置為true,那么只有通過HTTPS連接客戶端時才會傳遞這個cookie。
httponly:如果設為true,客戶端瀏覽器的js腳本將不能獲取到這個cookie的值。
Session
session(會話)用來保存用戶訪問web應用時的數據,舉個栗子:女神在逛淘寶的時候,看到各種衣服、化妝品、如果每看見一個喜歡的東西就立刻購買、支付,那樣會很麻煩,于是就有了購物車這個東西,女神可以把所有的東西先添加購物車,然后一次性支付。即使女神添加完購物車,不小心把頁面關了,再次打開的時候,發現購物車里面的東西還在,這就是session起的作用了,女神添加購物車的時候,實際上是向session中寫數據,session中的數據是臨時的,當會話結束后session的數據會被銷毀,如果想永久的保存session數據,可以放在數據庫中。
session的工作機制是這樣的:當有新的用戶訪問web應用時,為這個用戶創建唯一的UID,基于這個UID來存儲變量,UID保存在cookie中,當客戶端禁用了cookie,只能通過URL進行傳遞了。
session的基本用法
session_start():開啟一個會話,如果想返回一個已經存在的會話,需要把會話的ID作為一個參數傳進去,并且最好把這個函數放在最開始調用,切在它之前不能有其他輸出,否則會報個warning.
session_register(string name):注冊一個新的session變量,注冊的變量可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式來取值或賦值。
session_unregister(string name) :把注冊的變量名刪除,和session_unset()用法相同
session_is_registered(string name):檢查變量名是否被注冊
session_destroy():結束當前會話,清空會話中的數據。
session_name(string name): 讀寫當前會話名稱,傳name參數表示設置當前會話名稱為name,不傳表示獲取名稱。
session_id(string [id]):讀寫會話id.
處理XForms
XForms是區別于傳統web表單的另外一種form,它和form的區別是,html數據發送格式是application/x-www-form-urlencoded,但是XForm的格式是XML。當使用XForms提交表單時,$HTTP_RAW_POST_DATA中包含了由瀏覽器產生的XML文件,可以將這個XML文件傳遞給其他喜歡XML文件的引擎或文檔解析器處理。
這個栗子中method設置為urlencoded-post表示將數據以原始的方式提交到$_POST變量中。
文件上傳處理
用POST方法可以上傳文本和二進制文件,在php.ini文件中通過這些選項來設置上傳文件的一些限制: file_uploads,upload_max_filesize,upload_tmp_dirpost_max_size 以及 max_input_time。
文件上傳表單栗子:
enctype=multipart/form-data表示接收除了文本之外的其他文件類型,MAX_FILE_SIZE表示上傳文件的最大尺寸,單位字節,如果用戶上傳了超過這個尺寸的文件,會立刻返回錯誤信息。
上傳的文件信息會保存在$_FILES數組里,數組中共有這些內容:
$_FILES['userfile']['name’]:客戶端機器文件的原名稱。
$_FILES['userfile']['type’]:文件的 MIME 類型,如果瀏覽器提供的話,如果不提供則為空。栗子:“image/gif”。
$_FILES['userfile']['size’]:已上傳文件的大小,單位為字節。
$_FILES['userfile']['tmp_name’]:文件被上傳后在服務端儲存的臨時文件名。
$_FILES['userfile']['error’]:和該文件上傳相關的錯誤代碼。
文件被上傳后,默認地會被儲存到服務端的默認臨時目錄中,可以在 php.ini 中設置upload_tmp_dir來改變默認路徑。
使用文件上傳表單需要注意的事:對 MAX_FILE_SIZE 設置的值,不能大于 ini 設置中 upload_max_filesize 選項設置的值,默認值為 2M,而且不能大于post_max_size 設置的值。
如果 max_execution_time 設置的值太小,腳本運行的時間可能會超過該設置。因此,也要保證 max_execution_time 足夠的大。max_execution_time 僅僅只影響腳本本身運行的時間。任何其它花費在腳本運行之外的時間,諸如用函數 system() 對系統的調用、sleep() 函數的使用、數據庫查詢、文件上傳等,在計算腳本運行的最大時間時都不包括在內。max_input_time 以秒為單位設定了腳本接收輸入的最大時間,包括文件上傳。對于較大或多個文件,或者用戶的網速較慢時,可能會超過默認的 60 秒。
處理上傳的文件
用is_uploaded_file()函數判斷文件名是不是通過post表單上傳的,參數是文件名,絕對路徑或相對路徑。
move_uploaded_file ( string $filename , string $destination ),把上傳的文件移動到指定目錄。
上傳一組文件:
在表單中文件名后面加[]即可,栗子:
在服務端用$_FILES["pictures”]獲取到的是保存多個文件信息的二維數組,通過遍歷數組處理每個文件:
<pre>
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
</pre>
常見的錯誤碼,就是$_FILES["pictures"]["error”]的值:
UPLOAD_ERR_OK :其值為 0,沒有錯誤發生,文件上傳成功。
UPLOAD_ERR_INI_SIZE:其值為 1,上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。
UPLOAD_ERR_FORM_SIZE:其值為 2,上傳文件的大小超過了 HTML 表單中MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL:其值為 3,文件只有部分被上傳。
UPLOAD_ERR_NO_FILE:其值為 4,沒有文件被上傳。
UPLOAD_ERR_NO_TMP_DIR:其值為 6,找不到臨時文件夾。
UPLOAD_ERR_CANT_WRITE:其值為 7,文件寫入失敗。