معالجة النماذج في PHP

إذا كان لـ PHP ورقة رابحة، فهي معالجة النماذج. فالمهام التي تحتاج اللغات الأخرى إلى إطار عمل لإنجازها، تمكنت PHP من القيام بها منذ البداية. يعلّمك هذا الدرس المهارة الأكثر فائدةً على الإطلاق في مجال تطوير الويب.

1. مراجعة أساسيات نماذج HTML

HTML
<form method="POST" action="process.php">
    <!-- Form fields go here -->
    <button type="submit">Submit</button>
</form>
السمة القيمة الوصف
method GET أو POST GET = استرداد البيانات، POST = تعديل البيانات
action عنوان URL ("" = نفس الصفحة) المكان الذي تُرسَل إليه البيانات
name اسم الحقل مطلوب — تستخدم لغة PHP هذا الحقل للوصول إلى القيمة
🔥 خطأ شائع: يجب أن يحتوي كل حقل في النموذج على السمة name. إذا كان الحقل يفتقد السمة name، فلن يتلقى PHP قيمته أبدًا.


2. استقبال أنواع الحقول المختلفة

(1) حقول النص

PHP
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name     = $_POST['name'] ?? '';
    $email    = $_POST['email'] ?? '';
    $password = $_POST['password'] ?? '';
    $bio      = $_POST['bio'] ?? '';
}
?>

<form method="POST" action="">
    <input type="text" name="name" placeholder="Username"><br>
    <input type="email" name="email" placeholder="Email"><br>
    <input type="password" name="password" placeholder="Password"><br>
    <textarea name="bio" placeholder="About yourself"></textarea><br>
    <button type="submit">Register</button>
</form>

(2) حقول الاختيار (أزرار الاختيار، مربعات الاختيار، القوائم المنسدلة)

▶ مثال: التعامل مع حقول الاختيار

PHP
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $gender = $_POST['gender'] ?? '';
    $skills = $_POST['skills'] ?? [];   // Checkboxes come as an array
    $city   = $_POST['city'] ?? '';

    echo "Gender: {$gender}<br>";
    echo "Skills: " . implode(', ', $skills) . "<br>";
    echo "City: {$city}<br>";
}
?>

<form method="POST" action="">
    <label>Gender:</label>
    <input type="radio" name="gender" value="male"> Male
    <input type="radio" name="gender" value="female"> Female
    <br>

    <label>Skills:</label>
    <input type="checkbox" name="skills[]" value="php"> PHP
    <input type="checkbox" name="skills[]" value="mysql"> MySQL
    <input type="checkbox" name="skills[]" value="js"> JavaScript
    <br>

    <label>City:</label>
    <select name="city">
        <option value="">Choose...</option>
        <option value="beijing">Beijing</option>
        <option value="shanghai">Shanghai</option>
    </select>
    <br>

    <button type="submit">Submit</button>
</form>
▶ جرّب الكود
⚠️ تحذير: يجب أن تستخدم مجموعات خانات الاختيار name="skills[]" (مع الأقواس المربعة) حتى يقوم PHP بجمع جميع القيم المحددة في صفيف. وبدون الأقواس، لن تحصل إلا على آخر قيمة تم تحديدها.


3. إعادة ملء النموذج (مع الحفاظ على المدخلات التي أدخلها المستخدم)

أسوأ تجربة للمستخدم هي ملء نموذج، والضغط على زر «إرسال»، ثم ظهور رسالة خطأ، وفقدان كل ما كتبته. تجعل لغة PHP حل هذه المشكلة أمراً في غاية السهولة:

▶ مثال: نموذج مع معالجة الأخطاء وإعادة ملء الحقول

PHP
<?php
$errors = [];
$name = $email = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name  = trim($_POST['name'] ?? '');
    $email = trim($_POST['email'] ?? '');

    if ($name === '') {
        $errors[] = 'Username is required';
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = 'Invalid email format';
    }

    if (empty($errors)) {
        echo "<h3 style='color:green'>Registration successful! Welcome, {$name}!</h3>";
        $name = $email = '';  // Clear fields on success
    } else {
        echo "<ul style='color:red'>";
        foreach ($errors as $e) echo "<li>{$e}</li>";
        echo "</ul>";
    }
}
?>

<form method="POST" action="">
    <input type="text" name="name" placeholder="Username"
           value="<?= htmlspecialchars($name) ?>"><br>
    <input type="email" name="email" placeholder="Email"
           value="<?= htmlspecialchars($email) ?>"><br>
    <button type="submit">Register</button>
</form>
▶ جرّب الكود
💡 نصيحة: يعد htmlspecialchars() ضروريًا هنا — فهو يمنع الأحرف مثل " و< و> في مدخلات المستخدم من إتلاف كود HTML الخاص بك أو إدخال نصوص برمجية (هجمات XSS). سنتناول هذا الموضوع بالتفصيل في الدرس 18.


4. إعادة تعبئة أزرار الاختيار ومربعات الاختيار

PHP
<?php
$gender = $_POST['gender'] ?? 'male';
$skills = $_POST['skills'] ?? [];
?>

<!-- Radio buttons: use the checked attribute -->
<input type="radio" name="gender" value="male"
       <?= $gender === 'male' ? 'checked' : '' ?>> Male

<!-- Checkboxes: check with in_array -->
<input type="checkbox" name="skills[]" value="php"
       <?= in_array('php', $skills) ? 'checked' : '' ?>> PHP

<!-- Dropdown: use the selected attribute -->
<select name="city">
    <option value="beijing" <?= $city === 'beijing' ? 'selected' : '' ?>>Beijing</option>
</select>

5. الكشف عن عمليات إرسال النماذج

PHP
<?php
// Method 1: Check the request method (recommended)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Process the form
}

// Method 2: Check for the submit button
if (isset($_POST['submit'])) {
    // Process the form
}

// Method 3: Check if any POST data arrived
if (!empty($_POST)) {
    // Process the form
}
?>

6. نمط PRG (Post-Redirect-Get)

هل سبق لك أن أرسلت نموذجًا، ثم ضغطت على زر «تحديث»، فرأيت مربع الحوار المزعج «تأكيد إعادة إرسال النموذج»؟ نمط PRG يحل هذه المشكلة نهائيًا:

PHP
<?php
// prg.php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Process the data
    $name = trim($_POST['name'] ?? '');
    
    // Store a flash message in the session
    $_SESSION['flash_message'] = "Welcome, {$name}!";
    
    // Redirect to the same page with a GET request
    header("Location: " . $_SERVER['PHP_SELF']);
    exit;
}

// Display any flash message
if (isset($_SESSION['flash_message'])) {
    echo "<div style='color:green'>{$_SESSION['flash_message']}</div>";
    unset($_SESSION['flash_message']);
}
?>

<form method="POST" action="">
    <input type="text" name="name" placeholder="Username">
    <button type="submit">Register</button>
</form>
💡 نصيحة: header("Location: ...") تقوم بإعادة التوجيه؛ exit توقف البرنامج النصي على الفور. مسار PRG: POST → معالجة البيانات → إعادة التوجيه إلى GET → يقوم المستخدم بتحديث صفحة GET بأمان، دون إرسال مكرر.

❓ أسئلة شائعة

س لماذا لا تظهر مربعات الاختيار الخاصة بي في PHP؟
ج تحقق مما إذا كانت السمة name تتضمن [] (على سبيل المثال، skills[]). فبدون الأقواس، يتم إرسال القيمة المحددة الأخيرة فقط. أما مع name[]، فإن PHP تجمعها جميعًا في مصفوفة.
س هل ستظل نماذجي تعمل إذا قام المستخدم بتعطيل JavaScript؟
ج بالتأكيد. تتم معالجة نماذج PHP بالكامل على الخادم — وهي لا تعتمد على JavaScript على الإطلاق. لا يقتصر دور JavaScript على تحسين تجربة المستخدم (التحقق من صحة البيانات من جانب العميل، وإرسال البيانات عبر AJAX)، لكن الوظائف الأساسية تعمل بدونه.
س header("Location: ...") يُحدث خطأً. ما المشكلة؟
ج السبب الأكثر شيوعًا هو وجود إخراج قبل header(). أي شيء — سواء كان echo، أو HTML خام، أو حتى سطر فارغ أو BOM قبل علامة <?php — يُعتبر إخراجًا. تأكد من تشغيل header() قبل أي إخراج، واحفظ ملفك بتنسيق UTF-8 بدون BOM.

📖 ملخص

📝 تمارين

  1. قم بإنشاء نموذج تسجيل كامل يتضمن: اسم المستخدم، والبريد الإلكتروني، وكلمة المرور، والجنس (مفتاح اختيار)، والاهتمامات (مربعات اختيار)، والمدينة (قائمة منسدلة). استخدم var_dump() لفحص جميع البيانات المستلمة عند الإرسال.
  2. أضف ميزات التحقق من صحة البيانات وإعادة ملء الحقول إلى النموذج: يجب ألا يكون حقل «اسم المستخدم» فارغًا، ويجب أن يكون عنوان البريد الإلكتروني صالحًا، ويجب تحديد الجنس. احتفظ بجميع البيانات التي أدخلها المستخدم في حالة فشل عملية التحقق من صحة البيانات.
  3. تطبيق نمط PRG: بعد نجاح عملية التسجيل، إعادة التوجيه إلى نفس الصفحة وعرض رسالة خضراء تفيد بأن «التسجيل قد تم بنجاح».
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%