PHP
रीडिंग रिक्वेस्ट डेटा
खोज…
टिप्पणियों
GET और POST के बीच चयन
GET अनुरोध, वे डेटा प्रदान करने के लिए सर्वोत्तम हैं जो पृष्ठ को रेंडर करने के लिए आवश्यक हैं और कई बार (खोज क्वेरी, डेटा फ़िल्टर ...) का उपयोग किया जा सकता है। वे URL का एक हिस्सा हैं, जिसका अर्थ है कि उन्हें बुकमार्क किया जा सकता है और अक्सर पुन: उपयोग किया जाता है।
दूसरी ओर, पोस्ट अनुरोध केवल एक बार सर्वर से डेटा जमा करने के लिए हैं (संपर्क फ़ॉर्म, लॉगिन फ़ॉर्म ...)। GET के विपरीत, जो केवल ASCII को स्वीकार करता है, POST अनुरोध भी बाइनरी डेटा को फाइल अपलोड सहित अनुमति देता है।
आप उनके मतभेदों का अधिक विस्तृत विवरण यहां पा सकते हैं।
डेटा कमजोरियों का अनुरोध करें
इसे भी देखें: GET और POST के प्रत्यक्ष उपयोग में क्या कमजोरियां हैं?
बिना किसी मान्यता के $ _GET और $ _POST सुपरग्लोबल्स से डेटा पुनर्प्राप्त करना बुरा व्यवहार माना जाता है, और उपयोगकर्ताओं के लिए कोड या एसक्यूएल इंजेक्शन के माध्यम से डेटा का संभावित रूप से उपयोग या समझौता करने के लिए तरीके खोलता है। इस तरह के हमलों को रोकने के लिए अमान्य डेटा की जाँच की जानी चाहिए और इसे अस्वीकार कर दिया जाना चाहिए।
यहां और यहां बताए अनुसार, कोड में किस तरह से इसका उपयोग किया जा रहा है, इसके आधार पर अनुरोध डेटा से बच जाना चाहिए। आम डेटा उपयोग के मामलों के लिए कुछ अलग भागने के कार्य इस उत्तर में पाए जा सकते हैं।
फ़ाइल अपलोड करने की त्रुटियों को हैंडल करना
$_FILES["FILE_NAME"]['error']
(जहां "FILE_NAME"
फ़ाइल इनपुट के नाम विशेषता का मूल्य है, आपके फॉर्म में मौजूद है) में निम्न में से कोई एक मान हो सकता है:
-
UPLOAD_ERR_OK
- कोई त्रुटि नहीं है, सफलता के साथ अपलोड की गई फ़ाइल। -
UPLOAD_ERR_INI_SIZE
- अपलोड की गई फ़ाइलphp.ini
में upload_max_filesize निर्देश से अधिक है। -
UPLOAD_ERR_PARTIAL
- अपलोड की गई फ़ाइल MAX_FILE_SIZE निर्देश से अधिक है जो HTML रूप में निर्दिष्ट की गई थी। -
UPLOAD_ERR_NO_FILE
- कोई फ़ाइल अपलोड नहीं की गई थी। -
UPLOAD_ERR_NO_TMP_DIR
- एक अस्थायी फ़ोल्डर गुम है। (PHP 5.0.3 से)। -
UPLOAD_ERR_CANT_WRITE
- डिस्क पर फ़ाइल लिखने में विफल। (PHP 5.1.0 से)। -
UPLOAD_ERR_EXTENSION
- एक PHP एक्सटेंशन ने फ़ाइल अपलोड को रोक दिया। (PHP 5.2.0 से)।
त्रुटियों के लिए जाँच करने का एक मूल तरीका इस प्रकार है:
<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
case UPLOAD_ERR_INI_SIZE:
// Exceeds max size in php.ini
break;
case UPLOAD_ERR_PARTIAL:
// Exceeds max size in html form
break;
case UPLOAD_ERR_NO_FILE:
// No file was uploaded
break;
case UPLOAD_ERR_NO_TMP_DIR:
// No /tmp dir to write to
break;
case UPLOAD_ERR_CANT_WRITE:
// Error writing to disk
break;
default:
// No error was faced! Phew!
break;
}
POST डेटा पढ़ना
POST अनुरोध का डेटा एक सहयोगी सरणी के रूप में सुपरगॉल्ड $_POST
में संग्रहीत किया जाता है।
ध्यान दें कि एक गैर-मौजूद सरणी आइटम तक पहुँचना एक सूचना उत्पन्न करता है, इसलिए अस्तित्व को हमेशा isset()
या empty()
फ़ंक्शन या अशक्त मोटे ऑपरेटर से जांचना चाहिए।
उदाहरण:
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";
echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";
echo "Message from $from: $message";
GET डेटा पढ़ना
GET अनुरोध का डेटा एक सहयोगी सरणी के रूप में सुपरगॉल्ड $_GET
में संग्रहीत किया जाता है।
ध्यान दें कि एक गैर-मौजूद सरणी आइटम तक पहुँचना एक सूचना उत्पन्न करता है, इसलिए अस्तित्व को हमेशा isset()
या empty()
फ़ंक्शन या अशक्त मोटे ऑपरेटर से जांचना चाहिए।
उदाहरण: (URL /topics.php?author=alice&topic=php
)
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";
echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";
echo "Showing posts from $author about $topic";
कच्चे POST डेटा पढ़ना
आमतौर पर POST अनुरोध में भेजे गए डेटा को MIME प्रकार के application/x-www-form-urlencoded
साथ संरचित कुंजी / मान जोड़े होते हैं। हालाँकि कई अनुप्रयोगों जैसे वेब सेवाओं के लिए कच्चे डेटा की आवश्यकता होती है, अक्सर XML या JSON प्रारूप में, इसके बजाय भेजा जाना चाहिए। दो तरीकों में से एक का उपयोग करके इस डेटा को पढ़ा जा सकता है।
php://input
एक स्ट्रीम है जो रॉ रिक्वेस्ट बॉडी को एक्सेस प्रदान करता है।
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
एक वैश्विक चर है जिसमें कच्चा POST डेटा होता है। यह तभी उपलब्ध होता है जब php.ini
में always_populate_raw_post_data
निर्देश सक्षम होता है।
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
यह चर PHP संस्करण 5.6 के बाद से हटा दिया गया है, और PHP 7.0 में हटा दिया गया था।
ध्यान दें कि सामग्री प्रकार multipart/form-data
सेट होने पर इनमें से कोई भी तरीका उपलब्ध नहीं है, जिसका उपयोग फ़ाइल अपलोड के लिए किया जाता है।
HTTP PUT के साथ फाइल अपलोड करना
PHP कुछ क्लाइंट द्वारा सर्वर पर फाइल स्टोर करने के लिए HTTP PUT मेथड के लिए सपोर्ट प्रदान करता है। PUT अनुरोध POST अनुरोधों का उपयोग करते हुए फ़ाइल अपलोड की तुलना में बहुत सरल हैं और वे कुछ इस तरह दिखते हैं:
PUT /path/filename.html HTTP/1.1
अपने PHP कोड में फिर आप कुछ इस तरह से करेंगे:
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("putfile.ext", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>
इसके अलावा यहाँ आप HTTP PUT के माध्यम से फ़ाइल प्राप्त करने के बारे में दिलचस्प SO प्रश्न / उत्तर पढ़ सकते हैं।
POST द्वारा पासिंग सरणियाँ
आमतौर पर, PHP में प्रस्तुत एक HTML फॉर्म एलिमेंट एक ही मूल्य में परिणाम देता है। उदाहरण के लिए:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
इसका परिणाम निम्न आउटपुट में होता है:
Array
(
[foo] => bar
)
हालाँकि, ऐसे मामले भी हो सकते हैं जहाँ आप एक मान देना चाहते हैं। यह HTML तत्वों के नाम में PHP जैसी प्रत्यय जोड़कर किया जा सकता है:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[]" value="bar"/>
<input type="hidden" name="foo[]" value="baz"/>
<button type="submit">Submit</button>
</form>
इसका परिणाम निम्न आउटपुट में होता है:
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
आप संख्या या स्ट्रिंग्स के रूप में सरणी सूचकांकों को भी निर्दिष्ट कर सकते हैं:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[42]" value="bar"/>
<input type="hidden" name="foo[foo]" value="baz"/>
<button type="submit">Submit</button>
</form>
जो इस आउटपुट को लौटाता है:
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
इस तकनीक का उपयोग $_POST
सरणी पर पोस्ट-प्रोसेसिंग लूप से बचने के लिए किया जा सकता है, जिससे आपका कोड दुबला और अधिक संक्षिप्त हो जाता है।