قارن الاختلافات بين طريقتي التقديم للنموذج 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("中") .
fwrite($sock, "POST /posttest/response.php HTTP/1.0rn");
fwrite($sock, "Host: localhostrn");
fwrite($sock, "نوع المحتوى: application/x-www-form-urlencodedrn");
fwrite($sock, "Content-length: " . strlen($data) . "rn");
fwrite($sock, "قبول: */*rn");
fwrite($sock, "rn");
fwrite($sock, "$datarn");
fwrite($sock, "rn");
$headers = "";
بينما ($str = تقليم(fgets($sock, 4096)))
$headers .= "$strn";
صدى "n";
$body = "";
بينما (!feof($sock))
$body .= fgets($sock, 4096);
fClose($sock);
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 إلا عند الإرسال.