在 PHP 開發中,php://input 是一個唯讀的資料流,允許讀取請求的原始資料(Raw POST Data)。這在處理非 application/x-www-form-urlencoded 或 multipart/form-data 格式的 POST 請求(如 JSON、XML)時特別有用。本文透過一個完整的表單提交範例,示範如何使用 file_get_contents('php://input') 獲取原始輸入,並與 $_POST 超全域變數進行對比。
首先建立一個簡單的 HTML 表單(index.html),包含使用者名稱、密碼欄位與送出按鈕:
<form action="action.php" method="post">
<input type="text" name="userName" id="userName" /><br/>
<input type="text" name="userPass" id="userPass" /><br/>
<input type="submit" value="ok" />
</form>
在 action.php 中,我們同時輸出 $_POST 陣列與 php://input 讀取的原始字串:
<?php
$raw_post_data = file_get_contents('php://input', 'r');
echo "-------\$_POST------------------<br/>";
echo var_dump($_POST) . "<br/>";
echo "-------php://input-------------<br/>";
echo $raw_post_data . "<br/>";
?>
當表單以預設的 application/x-www-form-urlencoded 方式提交時,$_POST 會自動解析為關聯陣列,而 php://input 則返回未解析的原始查詢字串(如 userName=test&userPass=123456)。


application/x-www-form-urlencoded 與 multipart/form-data,自動解析為陣列。multipart/form-data(檔案上傳)。php://input 不依賴 php.ini 的 enable_post_data_reading 設定,且不會將資料預載入記憶體,適合大量資料處理。開發 API 介接時,若客戶端發送 Content-Type: application/json,務必使用 file_get_contents('php://input') 獲取原始 JSON 字串,再搭配 json_decode() 解析。此時 $_POST 將為空陣列。