Kodokon kodokon.com

फ़ॉर्म: डेटा प्राप्त करना और सत्यापित करना

फ़ॉर्म को एक पेशेवर की तरह संभालें: सही HTTP मेथड, इनपुट का कड़ाई से सत्यापन, और सुरक्षित पुनः प्रदर्शन।

9 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

एक फ़ॉर्म आपके उपयोगकर्ताओं और आपके PHP कोड के बीच संपर्क का पहला बिंदु है। get मेथड डेटा को URL में रखता है (?q=pizza): किसी खोज या फ़िल्टर के लिए बिल्कुल उपयुक्त, क्योंकि पेज को बुकमार्क किया जा सकता है और साझा किया जा सकता है। post मेथड डेटा को रिक्वेस्ट के बॉडी में ले जाता है: यह वह अनिवार्य मेथड है जब भी रिक्वेस्ट कुछ बदलती है (खाता बनाना, ऑर्डर, हटाना) या संवेदनशील डेटा ले जाती है। PHP प्राप्त वैल्यू को $_GET और $_POST सुपरग्लोबल में संग्रहीत करता है।

HTML
<form action="search.php" method="get">
  <label for="q">Search</label>
  <input id="q" name="q" type="text">
  <button type="submit">Search</button>
</form>
<?php
$query = trim($_GET['q'] ?? '');

if ($query !== '') {
    echo "<p>You are searching for: " .
        htmlspecialchars($query, ENT_QUOTES) . "</p>";
}
?>
search.php: फ़ॉर्म और उसका प्रबंधन एक ही पेज पर।

पेशेवर नियम नंबर एक: आने वाले डेटा पर कभी भरोसा न करें। एक उपयोगकर्ता कुछ भी भेज सकता है, जिसमें आपके फ़ॉर्म के बाहर गढ़ी गई नकली वैल्यू भी शामिल हैं। filter_input() फ़ंक्शन किसी वैल्यू को एक ही चरण में पढ़ता और सत्यापित करता है: यह सत्यापित वैल्यू लौटाता है, यदि वह अमान्य हो तो false, और यदि फ़ील्ड गायब हो तो null - आपके त्रुटि संदेशों में इन तीन स्थितियों को अलग-अलग पहचानना होगा।

PHP
<?php

declare(strict_types=1);

$errors = [];

$email = filter_input(
    INPUT_POST,
    'email',
    FILTER_VALIDATE_EMAIL
);

$age = filter_input(
    INPUT_POST,
    'age',
    FILTER_VALIDATE_INT,
    ['options' => ['min_range' => 18, 'max_range' => 120]]
);

$name = trim((string) ($_POST['name'] ?? ''));

if ($name === '' || mb_strlen($name) > 50) {
    $errors[] = "Name required (50 characters max).";
}

if (!is_string($email)) {
    $errors[] = "Invalid email address.";
}

if (!is_int($age)) {
    $errors[] = "Invalid age (between 18 and 120).";
}

if ($errors === []) {
    echo "Registration valid.";
}
filter_input() से किसी पंजीकरण का सत्यापन।

जब सत्यापन विफल हो, तो खाली फ़ॉर्म वापस न भेजें: उपयोगकर्ता द्वारा टाइप की गई वैल्यू (एक "स्टिकी" फ़ॉर्म) और संबंधित फ़ील्ड के बगल में त्रुटि संदेश फिर से प्रदर्शित करें। हर पुनः प्रदर्शित वैल्यू को htmlspecialchars() से गुज़रना चाहिए: यही वह है जो टैग को निष्क्रिय करता है और स्क्रिप्ट इंजेक्शन को रोकता है।

HTML
<?php
$name = trim($_POST['name'] ?? '');
$hasError = isset($_POST['name']) && $name === '';
$safeName = htmlspecialchars($name, ENT_QUOTES);
?>
<form method="post" action="">
  <label for="name">Your name</label>
  <input id="name" name="name"
    value="<?= $safeName ?>">
  <?php if ($hasError): ?>
    <p>Name is required.</p>
  <?php endif; ?>
  <button type="submit">Submit</button>
</form>
स्टिकी फ़ॉर्म: इनपुट त्रुटि के बाद भी बना रहता है।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. किसी उपयोगकर्ता खाता बनाने वाले फ़ॉर्म के लिए कौन सा HTTP मेथड उपयुक्त है?
    • GET, ताकि डेटा URL में दृश्यमान बना रहे
    • POST, क्योंकि रिक्वेस्ट सर्वर की स्थिति बदलती है और डेटा URL में नहीं दिखना चाहिए
    • दोनों में से कोई भी चलेगा, यह शैली की बात है
  2. यदि फ़ील्ड बिल्कुल भी नहीं भेजा गया, तो filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL) क्या लौटाता है?
    • false
    • एक खाली स्ट्रिंग
    • null
    • यह एक अपवाद फेंकता है
  3. किसी वैल्यू को पेज में फिर से प्रदर्शित करने से पहले उसे htmlspecialchars() से क्यों गुज़ारें?
    • HTML टैग को निष्क्रिय करने और स्क्रिप्ट इंजेक्शन (XSS भेद्यता) को रोकने के लिए
    • टाइपिंग की गलतियों को स्वतः ठीक करने के लिए
    • वैल्यू को संपीड़ित करने और प्रदर्शन तेज़ करने के लिए