เปรียบเทียบความแตกต่างระหว่างวิธีการส่งแบบฟอร์ม POST และ fsockopen
เมื่อส่งแบบฟอร์มในโหมด POST
$_POST และ php://input สามารถรับค่าได้ และ $HTTP_RAW_POST_DATA ว่างเปล่า
$_POST จัดระเบียบข้อมูลที่ส่งในอาร์เรย์ที่เชื่อมโยงและดำเนินการประมวลผลการเข้ารหัส เช่น urldecode และแม้กระทั่งการแปลงการเข้ารหัส
php://input สามารถรับข้อมูลดิบของ POST ที่ยังไม่ได้ประมวลผลได้โดยการอ่านไฟล์ผ่านอินพุตสตรีม
php://input อนุญาตให้อ่านข้อมูลดิบของ POST มันสร้างแรงกดดันต่อหน่วยความจำน้อยกว่า $HTTP_RAW_POST_DATA และไม่ต้องการการตั้งค่า php.ini พิเศษใดๆ php://input ไม่สามารถใช้ได้กับ enctype="multipart/form-data"
ตัวอย่าง fsockopen ที่ส่งข้อมูล POST:
$sock = fsockopen("localhost", 80, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)n");
$data = "txt=" .urlencode("中") . "&bar=" .
fwrite($sock, "POST /posttest/response.php HTTP/1.0rn");
fwrite($sock, "โฮสต์: localhostrn");
fwrite($sock, "ประเภทเนื้อหา: application/x-www-form-urlencodedrn");
fwrite($sock, "เนื้อหาความยาว: " . strlen($data) . "rn");
fwrite($sock, "ยอมรับ: */*rn");
fwrite($sock, "rn");
fwrite($sock, "$datarn");
fwrite($sock, "rn");
$ส่วนหัว = "";
ในขณะที่ ($str = ตัด (fgets($sock, 4096)))
$headers .= "$strn";
เสียงสะท้อน "n";
$ร่างกาย = "";
ในขณะที่ (!feof($sock))
$body .= fgets($ถุงเท้า, 4096);
fclose($ถุงเท้า);
echo $body;
สอดคล้องกับผลลัพธ์ของ (1)
:
1. ใช้ php://input เพื่อรับข้อมูล POST ดั้งเดิมอย่างง่ายดาย
2. $HTTP_RAW_POST_DATA ใช้ได้เฉพาะเมื่อ PHP ไม่รู้จักประเภทเนื้อหาเท่านั้น
ตัวอย่างเช่น ข้อมูล POST ที่มักจะส่งผ่านแบบฟอร์มเพจไม่สามารถส่งผ่านได้ ผ่าน $ HTTP_RAW_POST_DATA ถูกแยกออกมา แอตทริบิวต์ประเภทการเข้ารหัส (แอตทริบิวต์ enctype) คือ application/x-www-form-urlencoded, multipart/form-data
หมายเหตุ: แม้ว่าคุณจะเปลี่ยนแอตทริบิวต์ enctype ในหน้าเป็นประเภทที่ PHP ไม่รู้จักอย่างชัดเจน แต่ก็จะยังคงไม่ถูกต้อง
เนื่องจากแอตทริบิวต์การเข้ารหัสการส่งแบบฟอร์มเป็นแบบจำกัดแบบฟอร์ม ประเภทที่ไม่สามารถจดจำได้จะได้รับการพิจารณาให้ส่งในการเข้ารหัสเริ่มต้น (เช่น application/x-www-form-urlencoded)
3. $_POST เฉพาะเมื่อข้อมูลอยู่ใน application/x-www -form-urlencoded Type สามารถรับได้เฉพาะเมื่อส่งเท่านั้น