Pages

2014年1月30日 星期四


file_get_contents("php://input")

本文出自 “濤石的博客” 博客,請務必保留此出處http://taoshi.blog.51cto.com/1724747/1165499

$data = file_get_contents("php://input");
    php://input 是個可以訪問請求的原始資料的唯讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA,因為它不依賴於特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 預設沒有填充, 比啟動 always_populate_raw_post_data 潛在需要更少的記憶體。 enctype="multipart/form-data" 的時候 php://input 是無效的。 
    
1, php://input 可以讀取http entity body中指定長度的值,由Content-Length指定長度,不管是POST方式或者GET方法提交過來的資料。但是,一般GET方法提交資料 時,http request entity body部分都為空。 
2,php://input 與$HTTP_RAW_POST_DATA讀取的資料是一樣的,都唯讀取Content-Type不為multipart/form-data的數據。
學習筆記
 1,Coentent-Type僅在取值為application/x-www-data-urlencoded和multipart/form-data兩種情況下,PHP才會將http請求資料包中相應的資料填入全域變數$_POST 
 2,PHP不能識別的Content-Type類型的時候,會將http請求包中相應的資料填入變數$HTTP_RAW_POST_DATA 
 3, 只有Coentent-Type為multipart/form-data的時候,PHP不會將http請求資料包中的相應資料填入php://input,否則其它情況都會。填入的長度,由Coentent-Length指定。 
 4,只有Content-Type為application/x-www-data-urlencoded時,php://input資料才跟$_POST資料相一致。 
 5,php://input資料總是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更湊效,且不需要特殊設置php.ini 
 6,PHP會將PATH欄位的query_path部分,填入全域變數$_GET。通常情況下,GET方法提交的http請求,body為空。


form enctype=multipart/form-data作用

在設計表單時,如果內容有檔案時,我們都會在上面加上enctype="multipart/form-data"。其實form的enctype有三種
  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

預設的狀況下都是以application/x-www-form-urlencoded為主,會將資料做編碼傳送(空白以+代替,而特殊字元則傳成ASCII HEX。而multipart/form-data則是不做任何編碼,如果需要上傳文件時,就要使用它;text/plan則是僅將空白以+代替,常見於電子郵件表單。

轉自:http://superlevin.ifengyuan.tw/form%E5%8A%A0%E4%B8%8Aenctypemultipartform-data%E4%BD%9C%E7%94%A8/

$_SERVER['PATH_INFO']

PHP中的全域變數$_SERVER['PATH_INFO']是一個很有用的參數,眾多的CMS系統在美化自己的URL的時候,都用到了這個參數。

對於下面這個網址:

http://www.test.com/index.php/foo/bar.html?c=index&m=search

我們可以得到 $_SERVER['PATH_INFO'] = ‘/foo/bar.html’
而此時 $_SERVER['QUERY_STRING'] = 'c=index&m=search';

通常,我們最初開始PHP程式編寫的時候,都會使用諸如: http://www.test.com/index.php?c=search&m=main 這樣的URL,這種URL不僅看起來非常奇怪,而且對於搜尋引擎也是非常不友好的。很多搜尋引擎收錄的時候,都會忽略Query String之後的內容,google雖然不會忽略Query String,但是對於其他不含Query String的頁面,會給于比較高的PR值。

<?php
    echo $_SERVER['REQUEST_URI']
?>
本地測試地址:http://localhost/a.php 得到結果:/a.php
測試地址二:http://localhost/a.php?id=123 得到結果:/a.php?id=123
測試地址三:http://localhost/a.php/123.html 得到結果:/a.php/123.html
即$_SERVER['REQUEST_URI']基本得到的是位址中/後的所有內容
將a.php代碼改為如下:

<?php
    echo $_SERVER['PATH_INFO']
?>
本地測試地址:http://localhost/a.php 得不到任何結果,很鬱悶,不懂什麼意思;
測試地址二:http://localhost/a.php?id=123 同樣得不到任何結果,更鬱悶,因為不懂,所以確實不曉得這個函數什麼意思,感覺挺不舒服的。正當準備放棄繼續baidu時,無意中做了下面的測試,挺幸運
測試地址三:http://localhost/a.php/123.html 得到結果/123.html再在後面加東西,
測試地址四:http://localhost/a.php/123.html?id=2222 結果為:/123.html
什麼意思自己看就應該明白了。是不是還有我沒測試到的作用,不得而知了。希望對各位有用。


本文轉自
http://hi.baidu.com/flyrat/item/44623a365c656ff42784f496