জিকুয়ারি থেকে অ্যাজাক্স অনুরোধের সাথে ইন্টারঅ্যাক্ট করার php://input
পরিবর্তে আমাকে পদ্ধতিটি ব্যবহার করার নির্দেশনা দেওয়া হয়েছে $_POST
। আমি যা বুঝতে পারি না তা হ'ল এটির বনাম $_POST
বা এর বৈশ্বিক পদ্ধতি ব্যবহার করার সুবিধা $_GET
।
জিকুয়ারি থেকে অ্যাজাক্স অনুরোধের সাথে ইন্টারঅ্যাক্ট করার php://input
পরিবর্তে আমাকে পদ্ধতিটি ব্যবহার করার নির্দেশনা দেওয়া হয়েছে $_POST
। আমি যা বুঝতে পারি না তা হ'ল এটির বনাম $_POST
বা এর বৈশ্বিক পদ্ধতি ব্যবহার করার সুবিধা $_GET
।
উত্তর:
কারণটি হ'ল php://input
অনুরোধের এইচটিটিপি-শিরোনামের পরে সমস্ত কাঁচা তথ্য ফেরত দেয়, সামগ্রীর প্রকার নির্বিশেষে।
পিএইচপি superglobal হয় $_POST
, শুধুমাত্র অনুমিত হয় মোড়ানো ডেটা রয়েছে যা হয়
application/x-www-form-urlencoded
(সাধারণ ফর্ম-পোস্টগুলির জন্য মানক সামগ্রীর ধরণ) বাmultipart/form-data
(বেশিরভাগ ফাইল আপলোডের জন্য ব্যবহৃত হয়)এর কারণ এটি কেবলমাত্র সামগ্রী ধরণের যা ব্যবহারকারী এজেন্টদের দ্বারা সমর্থিত হওয়া উচিত । সুতরাং সার্ভার এবং পিএইচপি traditionতিহ্যগতভাবে অন্য কোনও সামগ্রীর প্রকারের প্রত্যাশা করবেন না (যার অর্থ এই নয় যে তারা পারবেন না)।
সুতরাং, যদি আপনি কেবল একটি ভাল পুরানো এইচটিএমএল পোস্ট করেন form
, অনুরোধটি এরকম কিছু দেখায়:
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
তবে আপনি যদি আজাক্সের সাথে অনেক বেশি কাজ করছেন, তবে এই পরীক্ষার মধ্যে প্রকারের (স্ট্রিং, ইন্ট, বুল) এবং স্ট্রাকচার (অ্যারে, অবজেক্টস) সহ আরও জটিল তথ্য আদান-প্রদান করা রয়েছে, তাই বেশিরভাগ ক্ষেত্রে জেএসএনই সেরা পছন্দ choice তবে জেএসএন-পে-লোডের সাথে একটি অনুরোধটি এরকম কিছু দেখাচ্ছে:
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
বিষয়বস্তুটি এখন হবে application/json
(বা উপরে উল্লিখিতগুলির মধ্যে অন্তত কোনও নয়), সুতরাং পিএইচপি-র- $_POST
র্যাপার কীভাবে এটি পরিচালনা করতে পারে তা এখনও জানেন না (এখনও)।
তথ্য এখনও আছে, আপনি কেবল মোড়কের মাধ্যমে এটি অ্যাক্সেস করতে পারবেন না। সুতরাং আপনাকে এটিকে নিজেরাই কাঁচা ফর্ম্যাটে আনতে হবে file_get_contents('php://input')
( যতক্ষণ না এটি multipart/form-data
এনকোডযুক্ত নয় )।
আপনি এক্সএমএল-ডেটা বা অন্য কোনও মানহীন সামগ্রীর ধরণের অ্যাক্সেসটিও এইভাবে পাবেন।
application/json
জন্য বৈধ ডেটা উত্স হিসাবে অর্থাত পিএইচপি থামাতে কিছুই থামায় না $_POST
। এমনকি সেখানে বিশেষত সমর্থনটির জন্য প্রকাশিত অনুরোধগুলিও রয়েছে।
php://input
আপনাকে ডেটার কাঁচা বাইট দিতে পারে। পোস্টড ডেটা যদি কোনও জেএসএন এনকোডেড কাঠামো হয় তবে এটি একটি অ্যাজাক্স পোস্টের অনুরোধের জন্য প্রায়শই হয় This
এটি করতে এখানে একটি ফাংশন রয়েছে:
/**
* Returns the JSON encoded POST data, if any, as an object.
*
* @return Object|null
*/
private function retrieveJsonPostData()
{
// get the raw POST data
$rawData = file_get_contents("php://input");
// this returns null if not valid json
return json_decode($rawData);
}
$_POST
যখন আপনি একটি ফর্ম, একটি ঐতিহ্যগত পোস্ট দ্বারা জমা কী-ভ্যালু ডাটা হ্যান্ডলিং করছি অ্যারের আরো দরকারী। এটি কেবল তখনই কাজ করে যদি পোস্টড ডেটা একটি স্বীকৃত ফর্ম্যাটে থাকে, সাধারণত application/x-www-form-urlencoded
( বিশদের জন্য http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 দেখুন)।
true
দ্বিতীয় প্যারামিটার হিসাবে পাস করেন তবে json_decode
এটি একটি সহযোগী অ্যারে ফিরিয়ে দেবে।
পোস্টের ডেটা যদি ত্রুটিযুক্ত হয় তবে $ _POST তে কোনও কিছুই থাকবে না। তবুও, পিএইচপি: // ইনপুটটিতে ত্রুটিযুক্ত স্ট্রিং থাকবে।
উদাহরণস্বরূপ কিছু এজাক্স অ্যাপ্লিকেশন রয়েছে, যেগুলি কোনও ফাইল আপলোড করার জন্য সঠিক পোস্ট কী-মান ক্রম তৈরি করে না এবং কেবলমাত্র সমস্ত ফাইল ফাইলের ডেটা হিসাবে ভেরিয়েবলের নাম বা কিছুই ছাড়াই ডাম্প করে। $ _POST খালি থাকবে, $ _FILES খালিও হবে এবং পিএইচপি: // ইনপুটটিতে স্ট্রিং হিসাবে লিখিত সঠিক ফাইল থাকবে।
পিএইচপি আপনাকে এইচটিটিপি অনুরোধগুলি পরিচালনা করার জন্য ইন্টারফেসের মতো খাঁটি বিশ্রাম (জিইটি, পোষ্ট, পুট, প্যাচ, ডিলেট) মুছে ফেলার জন্য ডিজাইন করা হয়নি ।
যাইহোক, $_POST
, $_GET
, এবং $_FILES
superglobals , এবং ফাংশন filter_input_array()
গড় ব্যক্তির / layman এর প্রয়োজনের জন্য খুব দরকারী।
$_POST
(এবং $_GET
) এর এক নম্বর গোপন সুবিধাটি হল যে আপনার ইনপুট ডেটা পিএইচপি দ্বারা স্বয়ংক্রিয়ভাবে urldecoded হয় । আপনি এটি করার কথা কখনও ভাবেন না, বিশেষত স্ট্যান্ডার্ড জিইটি অনুরোধের মধ্যে স্ট্রিং প্যারামিটারগুলির জন্য।
বলা হচ্ছে, আপনি যখন আপনার প্রোগ্রামিং জ্ঞানের দিকে এগিয়ে যান এবং জাভাস্ক্রিপ্টের XmlHttpRequest
অবজেক্ট (কারও জন্য jQuery) ব্যবহার করতে চান , আপনি এই স্কিমের সীমাবদ্ধতা দেখতে এসেছেন।
$_POST
আপনাকে HTTP Content-Type
শিরোনামে দুটি মিডিয়া ধরণের ব্যবহার সীমাবদ্ধ করে :
application/x-www-form-urlencoded
, এবংmultipart/form-data
সুতরাং, আপনি যদি সার্ভারে পিএইচপি-তে ডেটা মানগুলি প্রেরণ করতে চান এবং এটি $_POST
সুপারগ্লোবালটিতে প্রদর্শিত হতে চান , তবে আপনাকে অবশ্যই এটি ক্লায়েন্ট-সাইডে প্রবিষ্ট করতে হবে এবং কী / মান জোড়া হিসাবে ডাটারগুলি প্রেরণ করতে হবে - নবীনদের জন্য অসুবিধাপূর্ণ পদক্ষেপ (বিশেষত ইউআরএল-এর বিভিন্ন অংশের বিভিন্ন ধরণের ইউরেলকোডিংয়ের প্রয়োজন আছে: সাধারণ, কাঁচা ইত্যাদি figure
আপনার সমস্ত jQuery ব্যবহারকারীর জন্য, $.ajax()
পদ্ধতিটি আপনার JSON কে সার্ভারে ট্রান্সমিশনের আগে URL এনকোডেড কী / মান জোড়গুলিতে রূপান্তর করছে। আপনি সেট করে এই আচরণটি ওভাররাইড করতে পারেন processData: false
। কেবলমাত্র aj .axax () ডকুমেন্টেশনটি পড়ুন এবং কন্টেন্ট-টাইপ শিরোনামে সঠিক মিডিয়া প্রকারটি প্রেরণ করতে ভুলবেন না।
সাধারণত, আপনি যদি কোনও সাধারণ, সিঙ্ক্রোনাস করছেন (পুরো পৃষ্ঠাটি পুনরায় চিত্রিত করা হয়) যখন এইচটিএমএল ফর্মের সাথে এইচটিটিপি অনুরোধ করে, ব্যবহারকারী-এজেন্ট (ওয়েব ব্রাউজার) আপনার জন্য আপনার ফর্ম ডেটা ইউলিনকোড করবে। যদি আপনি এই XmlHttpRequest
অবজেক্টটি ব্যবহার করে একটি অ্যাসিঙ্ক্রোনাস এইচটিটিপি অনুরোধ করতে চান , তবে আপনাকে অবশ্যই একটি অবরুদ্ধ কোডিং স্ট্রিংটি ফ্যাশন করতে হবে এবং প্রেরণ করতে হবে, যদি আপনি সেই ডেটা $_POST
সুপারগ্লোবালটিতে প্রদর্শিত হতে চান ।
একটি জাভাস্ক্রিপ্ট অ্যারে বা অবজেক্টকে একটি urlncoded স্ট্রিংয়ে রূপান্তর করা অনেক বিকাশকারীকে বিরক্ত করে (এমনকি ফর্ম ডেটার মতো নতুন এপিআই সহ )। তারা বরং বরং জেএসএন পাঠাতে সক্ষম হবেন এবং ক্লায়েন্ট কোডটি এটি করা আরও কার্যকর হবে।
মনে রাখবেন (উইঙ্ক, উইঙ্ক), গড় ওয়েব ডেভেলপার XmlHttpRequest
সরাসরি অবজেক্টটি, গ্লোবাল ফাংশন, স্ট্রিং ফাংশন, অ্যারে ফাংশন এবং আপনার এবং আমি মতো নিয়মিত এক্সপ্রেশন ;-) ব্যবহার করতে শেখে না । তাদের জন্য ইউরলিনকোডিং একটি দুঃস্বপ্ন। ;-)
পিএইচপি-র স্বজ্ঞাত এক্সএমএল এবং জেএসএন হ্যান্ডলিংয়ের অভাব অনেক লোককে সরিয়ে দেয়। আপনি ভাবেন যে এটি এখন (দীর্ঘশ্বাস) দ্বারা পিএইচপি এর অংশ হয়ে যাবে।
এক্সএমএল, জেএসন, এবং ওয়াইএএমএল সবার মিডিয়া প্রকার রয়েছে যা এইচটিটিপি Content-Type
শিরোনামে রাখা যেতে পারে ।
দেখ কত মিডিয়া-ধরনের (পূর্বে, MIME প্রকারসমূহ) IANA দ্বারা সংজ্ঞায়িত করা হয়।
কতটি HTTP শিরোনাম রয়েছে তা দেখুন।
php://input
স্ট্রিমটি ব্যবহার করে আপনাকে পিএইচপি বিশ্বজুড়ে বাধ্য করেছে এমন বাচ্চা বসা / হাত ধরে থাকা বিমূর্ততার স্তরকে ছিন্ন করতে দেয়। :-) মহান শক্তি দিয়ে মহান দায়িত্ব আসে!
এখন, আপনি স্ট্রিমযুক্ত ডেটা মানগুলির সাথে ডিল করার আগে আপনার php://input
কয়েকটি জিনিস করা উচিত / তা করা উচিত।
এএইচ, এইচএ! হ্যাঁ, আপনি আপনার অ্যাপ্লিকেশনটিতে প্রবাহিত ডেটা স্ট্রিমটি ইউটিএফ -8 এনকোড করাতে চাইতে পারেন, তবে এটি কী না আপনি কীভাবে জানতে পারবেন?
php://input
।আপনি প্রথমে কত আছে তা না জেনে স্ট্রিম ডেটা হ্যান্ডেল করার চেষ্টা করছেন? এটি একটি ভয়ানক ধারণা । Content-Length
প্রবাহিত ইনপুট আকারের দিকনির্দেশনার জন্য আপনি এইচটিটিপি শিরোনামের উপর একচেটিয়া নির্ভর করতে পারবেন না কারণ এটি স্পোফ করা যেতে পারে।
আপনার একটি প্রয়োজন হবে:
আপনি কি স্ট্রিমের বর্তমান এনকোডিং না জেনে স্ট্রিম ডেটা ইউটিএফ -8 এ রূপান্তর করার চেষ্টা করছেন? কিভাবে? আইকনভ স্ট্রিম ফিল্টার ( আইকনভি স্ট্রিম ফিল্টার উদাহরণ ) এর মতো একটি শুরু এবং শেষ এনকোডিং চাইছে।
'convert.iconv.ISO-8859-1/UTF-8'
সুতরাং, আপনি যদি বিবেকবান হন তবে আপনার প্রয়োজন হবে:
( আপডেট : 'convert.iconv.UTF-8/UTF-8'
সবকিছুকে ইউটিএফ -8 এ বাধ্য করবে, তবে আপনার এখনও এমন অক্ষরের জন্য অ্যাকাউন্ট করতে হবে যা আইকনভি লাইব্রেরি অনুবাদ করতে পারে না তা হয়ত বুঝতে পারে other অন্য কথায়, কোনও অক্ষর অনুবাদ করা যায় না, তখন আপনাকে কী পদক্ষেপ নিতে হবে তা আপনাকে কিছু সংজ্ঞা দিতে হবে : 1) একটি ডামি চরিত্র sertোকান, 2) ব্যর্থ / নিক্ষেপ এবং ব্যতিক্রম)।
আপনি HTTP Content-Encoding
শিরোনামের উপর একচেটিয়াভাবে নির্ভর করতে পারবেন না , কারণ এটি নিম্নলিখিত হিসাবে সংকোচনের মতো কিছু নির্দেশ করতে পারে। আইকনভের ক্ষেত্রে আপনি যে সিদ্ধান্ত নিতে চান তা এই নয়।
Content-Encoding: gzip
প্রথম খণ্ড: এইচটিটিপি অনুরোধ সম্পর্কিত
দ্বিতীয় খণ্ড: স্ট্রিম সম্পর্কিত তথ্য
তৃতীয় অংশ: ডেটা টাইপ সম্পর্কিত
(মনে রাখবেন, ডেটা এখনও একটি ইউআরএল এনকোডযুক্ত স্ট্রিং হতে পারে যা আপনাকে অবশ্যই বিশ্লেষণ এবং ইউআরএল ডিকোড করতে হবে)।
খণ্ড IV: ডেটা মান সম্পর্কিত
ফিল্টার ইনপুট ডেটা।
ইনপুট ডেটা বৈধ করুন।
$_POST
Superglobal হয়, ইনপুট সীমা জন্য php.ini সেটিংস সহ, সাধারণ লোক জন্য সহজ হয়। তবে, স্ট্রিমগুলি ব্যবহার করার সময় অক্ষর এনকোডিংয়ের সাথে কাজ করা অনেক বেশি স্বজ্ঞাত এবং দক্ষ because
সুতরাং আমি একটি ফাংশন লিখেছি যা পিএইচপি: // ইনপুট স্ট্রিম থেকে পোষ্ট ডেটা পাবে ।
সুতরাং এখানে চ্যালেঞ্জটি পুট, ডিলিট বা প্যাচ অনুরোধের পদ্ধতিতে স্যুইচ করা ছিল এবং এখনও সেই অনুরোধের সাথে প্রেরিত পোস্ট ডেটা প্রাপ্ত করে।
আমি সম্ভবত এটি একই চ্যালেঞ্জের কারও সাথে ভাগ করে নিচ্ছি। নীচের ফাংশনটি হ'ল আমি কী নিয়ে এসেছি এবং এটি কাজ করে। আমি আসা করি এটা সাহায্য করবে!
/**
* @method Post getPostData
* @return array
*
* Convert Content-Disposition to a post data
*/
function getPostData() : array
{
// @var string $input
$input = file_get_contents('php://input');
// continue if $_POST is empty
if (strlen($input) > 0 && count($_POST) == 0 || count($_POST) > 0) :
$postsize = "---".sha1(strlen($input))."---";
preg_match_all('/([-]{2,})([^\s]+)[\n|\s]{0,}/', $input, $match);
// update input
if (count($match) > 0) $input = preg_replace('/([-]{2,})([^\s]+)[\n|\s]{0,}/', '', $input);
// extract the content-disposition
preg_match_all("/(Content-Disposition: form-data; name=)+(.*)/m", $input, $matches);
// let's get the keys
if (count($matches) > 0 && count($matches[0]) > 0)
{
$keys = $matches[2];
foreach ($keys as $index => $key) :
$key = trim($key);
$key = preg_replace('/^["]/','',$key);
$key = preg_replace('/["]$/','',$key);
$key = preg_replace('/[\s]/','',$key);
$keys[$index] = $key;
endforeach;
$input = preg_replace("/(Content-Disposition: form-data; name=)+(.*)/m", $postsize, $input);
$input = preg_replace("/(Content-Length: )+([^\n]+)/im", '', $input);
// now let's get key value
$inputArr = explode($postsize, $input);
// @var array $values
$values = [];
foreach ($inputArr as $index => $val) :
$val = preg_replace('/[\n]/','',$val);
if (preg_match('/[\S]/', $val)) $values[$index] = trim($val);
endforeach;
// now combine the key to the values
$post = [];
// @var array $value
$value = [];
// update value
foreach ($values as $i => $val) $value[] = $val;
// push to post
foreach ($keys as $x => $key) $post[$key] = isset($value[$x]) ? $value[$x] : '';
if (is_array($post)) :
$newPost = [];
foreach ($post as $key => $val) :
if (preg_match('/[\[]/', $key)) :
$k = substr($key, 0, strpos($key, '['));
$child = substr($key, strpos($key, '['));
$child = preg_replace('/[\[|\]]/','', $child);
$newPost[$k][$child] = $val;
else:
$newPost[$key] = $val;
endif;
endforeach;
$_POST = count($newPost) > 0 ? $newPost : $post;
endif;
}
endif;
// return post array
return $_POST;
}
এটি কীভাবে ব্যবহার করা যায় তার সহজ উদাহরণ
<?php
if(!isset($_POST) || empty($_POST)) {
?>
<form name="form1" method="post" action="">
<input type="text" name="textfield"><br />
<input type="submit" name="Submit" value="submit">
</form>
<?php
} else {
$example = file_get_contents("php://input");
echo $example; }
?>