আমি নিম্নলিখিত পিএইচপি পৃষ্ঠায় পোষ্ট হিসাবে জমা দিই:
{a:1}
এটি অনুরোধের মূল অংশ (একটি পোষ্ট অনুরোধ)।
পিএইচপি-তে, এই মানটি বের করতে আমাকে কী করতে হবে?
var_dump($_POST);
সমাধান নয়, কাজ করছে না।
আমি নিম্নলিখিত পিএইচপি পৃষ্ঠায় পোষ্ট হিসাবে জমা দিই:
{a:1}
এটি অনুরোধের মূল অংশ (একটি পোষ্ট অনুরোধ)।
পিএইচপি-তে, এই মানটি বের করতে আমাকে কী করতে হবে?
var_dump($_POST);
সমাধান নয়, কাজ করছে না।
উত্তর:
কোনও পোস্ট বা পুট অনুরোধের (বা অন্য কোনও HTTP পদ্ধতি) এর সত্তা বডিটি অ্যাক্সেস করতে:
$entityBody = file_get_contents('php://input');
এছাড়াও, STDIN
ধ্রুবক এটিতে ইতিমধ্যে খোলার স্ট্রিম php://input
, যাতে আপনি বিকল্পভাবে এটি করতে পারেন:
$entityBody = stream_get_contents(STDIN);
থেকে আমি পিএইচপি ম্যানুয়াল এন্ট্রি ইনপুট / আউটপুট স্ট্রীম করে ডক্স :
পিএইচপি: // ইনপুট একটি পঠনযোগ্য স্ট্রিম যা আপনাকে অনুরোধের বডি থেকে কাঁচা ডেটা পড়তে দেয়। পোষ্ট অনুরোধগুলির ক্ষেত্রে, এটি পিএইচপি: // ইনপুট ব্যবহার করা আরও ভাল
$HTTP_RAW_POST_DATA
কারণ এটি বিশেষ পিএইচপি.এনআই নির্দেশের উপর নির্ভর করে না। তদুপরি, সেই ক্ষেত্রে যেখানে$HTTP_RAW_POST_DATA
ডিফল্টরূপে জনবহুল হয় না, এটি সর্বদা_ জনপরিচয়_র_পোস্ট_ডেটা সক্রিয় করার একটি সম্ভাব্য কম মেমরি নিবিড় বিকল্প। পিএইচপি: // ইনপুট এনক্রিপ = "মাল্টিপার্ট / ফর্ম-ডেটা" সহ উপলভ্য নয়।
বিশেষত আপনি লক্ষ করতে চান যে php://input
স্ট্রিমটি, আপনি এটি কোনও ওয়েব এসপিআইতে কীভাবে অ্যাক্সেস করেন তা নির্বিশেষে, সন্ধানযোগ্য নয় । এর অর্থ এটি কেবল একবার পড়া যায়। আপনি যদি এমন পরিবেশে কাজ করছেন যেখানে বৃহত এইচটিটিপি সত্তা সংস্থা নিয়মিত আপলোড হয় আপনি তার স্ট্রিম ফর্মটিতে ইনপুটটি বজায় রাখতে চান (উপরের প্রথম উদাহরণের মতো এটি বাফারিং না করে)।
স্ট্রিম রিসোর্স বজায় রাখতে এরকম কিছু সহায়ক হতে পারে:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
আপনাকে মেমরির খরচ পরিচালনা করতে দেয় কারণ নির্দিষ্ট পরিমাণে ডেটা সংরক্ষণ করার পরে এটি স্বচ্ছভাবে ফাইল সিস্টেম স্টোরেজে স্যুইচ করবে (ডিফল্ট হিসাবে 2 এম)। এই আকারটি php.ini ফাইলে বা সংযোজন দ্বারা হেরফের করা যেতে পারে /maxmemory:NN
, যেখানে NN
অস্থায়ী ফাইলটি ব্যবহারের আগে বাইটে মেমরি রাখতে সর্বোচ্চ সর্বাধিক পরিমাণ ডাটা থাকে।
অবশ্যই, যদি না আপনি ইনপুট স্ট্রিমটি সন্ধানের জন্য সত্যিকারের ভাল কারণ না পান তবে কোনও ওয়েব অ্যাপ্লিকেশনটিতে আপনার এই কার্যকারিতাটির প্রয়োজন হবে না। এইচটিটিপি অনুরোধ সত্তা বডি একবার পড়ার জন্য সাধারণত যথেষ্ট - আপনার অ্যাপ্লিকেশনটি কী করবে তা নির্ধারণের সময় ক্লায়েন্টদের সারাদিন অপেক্ষা করবেন না।
মনে রাখবেন যে Content-Type: multipart/form-data
শিরোনাম নির্দিষ্ট করার জন্য ( enctype="multipart/form-data"
এইচটিএমএল আকারে) অনুরোধগুলির জন্য পিএইচপি: // ইনপুট উপলব্ধ নয় । পিএইচপি থেকে প্রাপ্ত ফলাফলগুলি ইতিমধ্যে ফর্মের ডেটা $_POST
সুপারগ্লোবলে পার্স করেছে ।
php://input
ফাঁকা application/x-www-form-urlencoded
(পাশাপাশি multipart/form-data
)
php://input
রয়েছে। সুতরাং (দ্রুত) সিজিআই কনফিগারেশনগুলি চলাকালীন কার্যকর stream_get_contents(STDIN)
হবে না file_get_contents("php://input")
।
অ্যারেতে ফেরত মান
$data = json_decode(file_get_contents('php://input'), true);
$data
প্রতিটি মান আপনার ইচ্ছামতোভাবে এনকোড করা হয়েছে কিনা তা পরীক্ষা করতে এখন আপনাকে এসোসিয়েটিভ অ্যারের মাধ্যমে লুপ করতে হবে। "স্ট্রিম টু ডেটাটাইপ" বিষয়গুলি দেখার উপায় সহজ হতে পারে তবে এটি স্ট্রিম ফিল্টার ব্যবহার করে "স্ট্রিম ফর্ম" এ এনকোডিংয়ের সাথে কাজ করার মতো দক্ষ নাও হতে পারে। আপনি যদি এনকোডিংয়ের সমস্যাগুলি পরিচালনা করছেন না এবং কেবল স্যানিটাইজিং এবং বৈধতা দিচ্ছেন, তবে আপনি একটি পদক্ষেপ মিস করছেন।
খালি হওয়ার সম্ভাব্য কারণ $_POST
হ'ল অনুরোধটি নয় POST
, বা POST
আর নয় ... এটি পোস্ট হিসাবে শুরু হয়ে থাকতে পারে, তবে কোথাও একটির মুখোমুখি হয়েছে 301
বা পুনরায় 302
ডাইরেক্টর হয়েছে, যা স্যুইচ করা হয়েছে GET
!
পরিদর্শন করুন $_SERVER['REQUEST_METHOD']
এই ক্ষেত্রে যদি বার করো।
কেন এটি হওয়া উচিত নয় তবুও হয় তা নিয়ে একটি ভাল আলোচনার জন্য https://stackoverflow.com/a/19422232/109787 দেখুন ।
POST
কিন্তু তদন্তের পরে এটি দেখাচ্ছে যে এটি ছিল GET
। আমি একবার /
আমার ইউআরএল এর শেষে একটি যুক্ত করেছি, এটি পোস্ট করা শুরু করে। অদ্ভুত!
ভেরিয়েবল পরীক্ষা করুন$HTTP_RAW_POST_DATA
php://input
। $HTTP_RAW_POST_DATA
সঙ্গে পাওয়া যায় না enctype="multipart/form-data"
।
যদি আপনি এইচটিটিপি পিইসিএল এক্সটেনশানটি ইনস্টল করেন তবে আপনি http_get_request_body()
স্ট্রিং হিসাবে বডি ডেটা পেতে ফাংশনটি ব্যবহার করতে পারেন ।
আপনার যদি পিসিএল / এইচটিপি এক্সটেনশন ইনস্টল করা থাকে তবে আপনি এটি ব্যবহার করতে পারেন:
$request = new http\Env\Request();
$request->getBody();
function getPost()
{
if(!empty($_POST))
{
// when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
// NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
return $_POST;
}
// when using application/json as the HTTP Content-Type in the request
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE)
{
return $post;
}
return [];
}
print_r(getPost());
json_last_error() == JSON_ERROR_NONE
হয় তবে false
খালি অ্যারেটি ফিরিয়ে দেওয়া উচিত। কেউ যদি এক্সএমএল বা ওয়াইএএমএল জমা দেয় তবে কী হবে? সামগ্রী-প্রকারের জন্য একটি পরীক্ষা যুক্ত করুন এবং সেখান থেকে যান।
$_SERVER
দরকারী মান পরীক্ষা করার জন্য সুপারগ্লোবাল দেখুন ।
http_get_request_body()
ডকুমেন্টেশন http://php.net/manual/fa/function.http-get-request-body.php অনুযায়ী দেহ PUT
এবং POST
অনুরোধগুলির জন্য স্পষ্টভাবে তৈরি করা হয়েছিল
$_POST
সুপারগ্লোবালের মাধ্যমে পাওয়া যায় না । এটি পিটিপি অনুরোধের ক্ষেত্রেও (বিশেষত) সত্য, কারণ পিএইচপি-র কোনও সুসংগঠিত নেই।