_P_পোস্ট বনাম $ _SERVER ['REQUEST_METHOD'] == 'পোস্ট'


130

কিছু লোক আমার স্নিপ্লার সাবমিশনের একটিকে "ক্রেপ" বলেছিল কারণ আমি if ($_SERVER['REQUEST_METHOD'] == 'POST')তার পরিবর্তে ব্যবহার করেছিif ($_POST)

অনুরোধের পদ্ধতিটি চেক করা আমার কাছে আরও সঠিক বলে মনে হচ্ছে কারণ এটি আমি সত্যই করতে চাই। দুটির মধ্যে কিছু অপারেশনাল পার্থক্য রয়েছে নাকি এটি কেবল একটি কোড স্পষ্টতার ইস্যু?


214
যে লোকটিকে সে চুষে বলে তাকে বলুন।
ভিঙ্কো ভার্সালোভিক

12
আপনি এখানে হিসাবে ===পরিবর্তে ব্যবহার করা উচিত । ==0 == 'POST'
dave1010

5
PH _SERVER ["REQUEST_METHOD"] কিছু পিএইচপি + অ্যাপাচি 2 ইনস্টলেশনে HTTP GET অনুরোধের জন্য "POST" থাকতে পারে। আমার মত. এবং এইভাবে আমি এখানে এসেছি।
টিবিরিউ-আয়নু স্টান

3
@ টিবেরিউ-আয়নুস্ট্যান যদি এটি সত্য হয় (যা আমি বিশ্বাস করি না) তবে এটি একটি মারাত্মক গুরুতর বাগ। আপনি কি পিএইচপি বা অ্যাপাচি বাগ রিপোর্টের লিঙ্ক সরবরাহ করতে পারেন? ধাপ পুনর্গঠন কর? যেমনটি হয়, আমি আপনাকে বিশ্বাস করি না।
মার্ক অ্যামেরি

1
@ dave1010 $_SERVER['REQUEST_METHOD']কখনও কেন নম্বর হবে 0? আমি যতদূর জানি, এটি অসম্ভব।
মার্ক অ্যামেরি

উত্তর:


169

ওয়েল, তারা একই জিনিস না, সত্যিই।

$_SERVER['REQUEST_METHOD'] অনুরোধ পদ্ধতি (আশ্চর্য) ধারণ করে।

$_POST যে কোনও পোস্ট ডেটা রয়েছে।

কোনও পোস্টের ডেটা না থাকার জন্য কোনও পোষ্ট অনুরোধের পক্ষে এটি সম্ভব।

আমি অনুরোধের পদ্ধতিটি যাচাই করি - $_POSTঅ্যারেটি পরীক্ষা করার বিষয়ে আমি কখনই ভাবি নি । যদিও আমি প্রয়োজনীয় পোস্ট ক্ষেত্রগুলি পরীক্ষা করি। সুতরাং একটি খালি পোস্ট অনুরোধ ব্যবহারকারীকে প্রচুর ত্রুটি বার্তা দেবে - যা আমার কাছে বোধগম্য।


তাত্ত্বিকভাবে, এটি সম্ভব হতে পারে, অনুরোধ পদ্ধতিটি 'পোস্ট' (নিম্ন- বা এমনকি মিশ্র ক্ষেত্রে)। পিএইচপি কি স্বয়ংক্রিয়ভাবে এটি জিইটি এবং পোস্টে স্যানিটাইজ করে?
বোল্ডউইন

একটি সংক্ষিপ্ত পরীক্ষার পরে, WinXP এ আমার পিএইচপি 5.2 স্পষ্টতই এটি করে না, তাই সম্ভবত অনুরোধ_মথলিকে কেবল বড়হাতে স্যানিটাইজ করা উচিত।
বোল্ডউইন

3
@ বোল্ডউইন না, এটি হয় না তবে ক্লায়েন্ট যদি কোনও পোস্টের অনুরোধ করার জন্য যদি কোনও পোস্টের অনুরোধ পদ্ধতি বা পোস্ট পোস্ট প্রেরণ করে তবে তারা এই অভিযোগের লঙ্ঘন করছে, যেহেতু এইচটিটিপি পদ্ধতিগুলি কেস-সংবেদনশীল অনুমান অনুসারে এবং স্পেকটি কেবলমাত্র POST পদ্ধতিটি সংজ্ঞায়িত করে, যেমন পোস্ট বা পোস্ট বা পিওএসটি পদ্ধতি নয়। আমি এখানে আমার উত্তরে এ সম্পর্কে আরও বিশদে যাচ্ছি: stackoverflow.com/a/21511879/1709587 । আপনি নির্দিষ্ট-লঙ্ঘনকারী ক্লায়েন্ট কোড হ্যান্ডেল করতে পদ্ধতিটি বড় আকারে চাপিয়ে দিতে চান কিনা তা আপনার পছন্দ।
মার্ক অ্যামেরি

এবং যেহেতু তারা একই জিনিস নয়, তাই এটি বোঝা যায় যে আমরা এগুলি বিভিন্ন জিনিসগুলির জন্য ব্যবহার করতে পারি - টাইপ করুন এবং পেইলডের অনুরোধ করুন। আমি ভাবছি যে এটি যদি কাউকে বাধা দেয়: আমি কী করছি তা নির্ধারণ করার জন্য আমি $ _SERVER ['REQUEST_METHOD'] ব্যবহার করি এবং আমি বেতনের অ্যাক্সেসের জন্য $ _REQQST ব্যবহার করি যা ধারণার মধ্যে কিছুটা স্বাধীনতা বজায় রাখে (অন্য কথায়, আমি খুব কমই বিশেষত _P _POST বা $ _GET ব্যবহার করুন)।
অনুদান

@grantwparks এটিকে খারাপ চুক্তির মতো মনে হচ্ছে। যেখানে ডেটা স্থানান্তরিত হয়েছিল তার সাথে G _GET এবং $ _POST এর আরও কাজ করতে হবে। বিবেচনা করুন: "কার্ল-কে-এল-এক্স পোস্ট-এইচ 'বিষয়বস্তুর ধরণ: পাঠ্য / সিএসভি' --ডাটা-বাইনারি sample @ નમૂના.csv 'পরীক্ষা-স্ক্রিপ্ট.পিপি? পরীক্ষা = 12345'" মান "পরীক্ষা" জনপ্রিয় P _ জিড করুন যদিও পদ্ধতিটি পোস্ট হয়েছে।
txyoji

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') সঠিক উপায়, আপনি কোনও পোস্ট ডেটা ছাড়াই একটি পোস্ট অনুরোধ পাঠাতে পারেন।


17

$_POSTবৃহত্তর POST ডেটা এবং আপলোড করা ফাইলগুলি নিয়ে কোনও সমস্যায় না পড়ার আগে পর্যন্ত আমি যাচাই করতাম। কনফিগারেশনের নির্দেশাবলী রয়েছে post_max_sizeএবং upload_max_filesize- এর মধ্যে যদি কোনওর বেশি হয়ে যায়, $_POSTঅ্যারেটি পপুলেটেড হয় না।

সুতরাং "নিরাপদ উপায়" চেক করা হয় $_SERVER['REQUEST_METHOD']। আপনাকে এখনও isset()প্রতিটি $_POSTভেরিয়েবলে ব্যবহার করতে হবে এবং আপনি যাচাই করেন বা না পরীক্ষা করেন তা বিবেচ্য নয় $_SERVER['REQUEST_METHOD']


9

আপনার অ্যাপ্লিকেশনটি যদি টাইপ পোস্টের অনুরোধে প্রতিক্রিয়া জানাতে প্রয়োজন হয় তবে এটি ব্যবহার করুন:

if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') { // if form submitted with post method
    // validate request, 
    // manage post request differently, 
    // log or don't log request,
    // redirect to avoid resubmition on F5 etc
}

যদি আপনার অ্যাপ্লিকেশনটিকে পোস্ট অনুরোধের মাধ্যমে প্রাপ্ত কোনও ডেটা নিয়ে প্রতিক্রিয়া জানাতে প্রয়োজন হয় তবে এটি ব্যবহার করুন:

if(!empty($_POST)) {  // if received any post data
   // process $_POST values, 
   // save data to DB,
   // ... 
}

if(!empty($_FILES)) { // if received any "post" files
   // validate uploaded FILES
   // move to uploaded dir
   // ...
}

এটি বাস্তবায়নের জন্য নির্দিষ্ট, তবে আপনি উভয়ই ব্যবহার করতে চলেছেন, + $ _ ফাইলগুলি সুপারগ্লোবাল।


3

তারা উভয়ই সঠিক। ব্যক্তিগতভাবে আমি আপনার দৃষ্টিভঙ্গিটির অক্ষরটির জন্য আরও ভাল পছন্দ করি তবে এটি ব্যক্তিগত পছন্দকেই কমিয়ে দেয়।

অফ হ্যান্ড, যদি ($ _ পোষ্ট) কোনও ত্রুটি না ছুঁড়ে দৌড়াতে পারে - অনুরোধটি POST শিরোলেখ দিয়ে প্রেরণ করা থাকলে less _POST অ্যারে উপস্থিত রয়েছে। বুলিয়ান চেকটিতে একটি খালি অ্যারে মিথ্যা করা হয়েছে


হতে পারে ২০০৯ সালে, তবে একটি ফাঁকা অ্যারে! = মিথ্যা
ক্লকওয়াউইলক

1
আপনি "কাস্ট" শব্দটি মিস করেছেন। "যদি" কাঠামোর অভ্যন্তরের বিবৃতিটি একটি বুলিয়ানকে ফেলে দেওয়া হয়, এবং একটি খালি অ্যারে এভাবে বুলিয়ান মিথ্যাতে ফেলে দেওয়া হয়। এমনকি 2020
ইরান গাল্পেরিন

হ্যাঁ, ঠিক আছে। +1
ঘড়িঘড়ি

3

আপনি বেশিরভাগ ব্রাউজারে এন্টার কী (অর্থাত্ জমা দেওয়ার বোতামটি ক্লিক না করে) টিপুন দিয়ে একটি ফর্ম জমা দিতে পারেন তবে এটি অগত্যা ভেরিয়েবল হিসাবে সাবমিট প্রেরণ করে না - সুতরাং খালি ফর্মটি জমা দেওয়া সম্ভব $_POSTতবে খালি থাকবে তবে ফর্মটি এখনও থাকবে পিএইচপি পৃষ্ঠায় একটি পোস্ট পোস্টের অনুরোধ তৈরি করেছে। এই ক্ষেত্রে if ($_SERVER['REQUEST_METHOD'] == 'POST')ভাল।


1
সেক্ষেত্রে, $_POSTখালি রাখা যাবে হবে: এটা খালি মান একটি অ্যারের হবে।
ট্রিগ

0
$this->method = $_SERVER['REQUEST_METHOD'];
if ($this->method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) {
    if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') {
        $this->method = 'DELETE';
    } else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') {
        $this->method = 'PUT';
    } else {
        throw new Exception("Unexpected Header");
    }
}

4
যদিও আপনার উত্তরটি সঠিক হতে পারে, এটি ব্যাখ্যা ব্যতীত সহায়ক নয়! কিভাবে উত্তর দিতে দয়া করে দেখুন ! ধন্যবাদ!
jkalden

0

যতক্ষণ আমার একাধিক পদ্ধতির সাহায্যে আমার পিএইচপি স্ক্রিপ্টগুলি অ্যাক্সেস করার প্রয়োজন হতে পারে, আমি আসলে যা করছি তা হ'ল:

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}

-1

এটি পোষ্টের মাধ্যমে পোস্ট করা হয়েছে কিনা তা পরীক্ষা করে (জিইটি, হেডের বিপরীতে)। আপনি যখন মেনু বারে একটি URL টাইপ করেন, পৃষ্ঠাকে জিইটি-র মাধ্যমে কল করা হয়। যাইহোক, আপনি যখন পদ্ধতি = "পোস্ট" দিয়ে একটি ফর্ম জমা দেন তখন ক্রিয়াকলাপটি POST সহ কল ​​করা হয়।


-3

এটি সত্যিই একজনের একটি 6, অন্যান্য পরিস্থিতির অর্ধ ডজন।

আপনার পদ্ধতির বিপরীতে কেবলমাত্র সম্ভাব্য যুক্তি হ'ল _S _SSERVER ['REQUEST_METHOD'] == 'পোস্ট' নির্দিষ্ট ওয়েব-সার্ভার / কনফিগারেশনে পপুলেট করা যায় না, তবে whereas _POST অ্যারে সর্বদা পিএইচপি 4 / পিএইচপি 5 এ উপস্থিত থাকে (এবং যদি তা না হয় তবে) কোন অস্তিত্ব নেই, আপনার বড় সমস্যা রয়েছে (- :)


-17

তারা উভয় একইভাবে কাজ করে তবে $_POSTএটি পরিষ্কার হিসাবে ব্যবহার করা উচিত। isset()এটি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে আপনি এটিতে যুক্ত করতে পারেন ।


6
$_POSTসর্বদা উপস্থিত থাকবে, যদিও এটি শূন্য হতে পারে (যা বুলিয়ানকে দেওয়া হয় false)। এবং "ক্লিনার" বলতে কী বোঝ?
ট্রিগ

2
সম্ভবত তিনি বোঝাতে চেয়েছিলেন যে কীবোর্ড = পি
জুলিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.