سطح A: نگهبان ورودی (جلوگیری از فرم خالی)

اولین و ساده‌ترین بررسی ما، چک کردن این است که آیا کاربر اصلاً چیزی ارسال کرده است؟ نمایش پیام "سلام، !" به کاربری که نامش را وارد نکرده، بسیار غیرحرفه‌ای است. ما باید جلوی ورودی‌های خالی را بگیریم.

محتوای آموزشی

۱. تابع trim()

یک مشکل رایج: کاربر به جای نام، چند بار کلید «فاصله» (Space) را می‌زند و دکمه ارسال را کلیک می‌کند. از نظر PHP، این ورودی «خالی» نیست، چون حاوی کاراکتر فاصله است، اما از نظر ما خالی محسوب می‌شود.

تابع trim() تمام فاصله‌های خالی (Whitespace) و کاراکترهای نامرئی (مثل tab یا خط جدید) را از **ابتدا و انتهای** یک رشته حذف می‌کند.

$username = "   Ali   ";
$clean_username = trim($username); // $clean_username حالا برابر است با "Ali"

$username_empty = "     ";
$clean_empty = trim($username_empty); // $clean_empty حالا برابر است با "" (رشته خالی)

۲. تابع empty()

این تابع بررسی می‌کند که آیا یک متغیر «خالی» در نظر گرفته می‌شود یا خیر. empty() در موارد زیر true برمی‌گرداند:

استفاده از empty() روی $_POST بسیار رایج است، چون اگر کلید مورد نظر اصلاً ارسال نشده باشد، empty() خطا نمی‌دهد (برخلاف دسترسی مستقیم).


کارگاه عملی: ارتقای فرم خوش‌آمدگویی

بیایید فرم خودپردازش گام ۴ را ارتقا دهیم. می‌خواهیم قبل از نمایش پیام خوش‌آمدگویی، چک کنیم که نام کاربر «واقعاً» پر شده باشد.

<?php
$message = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
    // ۱. داده را از فرم دریافت می‌کنیم
    $name_from_form = $_POST['user_name'];
    
    // ۲. ابتدا آن را trim می‌کنیم تا فاصله‌های اضافی حذف شوند
    $clean_name = trim($name_from_form);
    
    // ۳. حالا نسخه تمیز شده را با empty() چک می‌کنیم
    if (empty($clean_name)) {
        // اگر خالی بود، پیام خطا تنظیم می‌کنیم
        $message = "<div class='alert alert-danger'>لطفاً نام خود را وارد کنید.</div>";
    } else {
        // اگر خالی نبود، پیام خوش‌آمدگویی را تنظیم می‌کنیم
        // (توجه: این کد هنوز در برابر XSS امن نیست! در سطح B آن را امن می‌کنیم)
        $message = "<div class='alert alert-success'>سلام، " . $clean_name . "! خوش آمدی.</div>";
    }
}
?>
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<!-- ... بخش head ... -->
<body>
    <div class="container">
        <h2>فرم خودپردازش امن (سطح A)</h2>
        
        <?php echo $message; ?>

        <form action="code-process.php" method="POST">
            <label for="fname">نام شما:</label>
            <input type="text" id="fname" name="user_name">
            <input type="submit" value="ارسال">
        </form>
    </div>
</body>
</html>

خروجی و تحلیل:

حالا اگر فرم را خالی ارسال کنید یا فقط چند فاصله تایپ کنید، به جای "سلام، !"، پیام خطای «لطفاً نام خود را وارد کنید.» را خواهید دید. ما اولین خط دفاعی را ساختیم.


تمرین شما

صورت تمرین: جلوگیری از ارسال فرم خالی

فرم «ثبت‌نام» (register.php) خودپردازشی بسازید که دو فیلد دارد: «نام کاربری» (username) و «ایمیل» (email).

منطق PHP شما باید با استفاده از trim() و empty() بررسی کند که **هر دو فیلد** پر شده باشند. (راهنمایی: از عملگر منطقی || (OR) در گام ۲ استفاده کنید).

  • اگر username **یا** email خالی بود: پیام خطا "هر دو فیلد نام کاربری و ایمیل اجباری هستند." را نشان دهید.
  • اگر هر دو پر شده بودند: پیام موفقیت "ثبت‌نام شما با موفقیت انجام شد." را نشان دهید.

باشگاه ذهن: isset() در مقابل empty()

چالش شما: ما از empty() استفاده کردیم. اما شاید تابع isset() را هم دیده باشید. isset() چک می‌کند که آیا یک متغیر «اصلاً وجود دارد» (set شده) و null نیست. در حالی که empty() چک می‌کند که آیا متغیر «خالی» (falsy) تلقی می‌شود یا نه.

این تفاوت ظریف، گیج‌کننده است. مخصوصاً وقتی بدانیم که empty() روی متغیری که isset نشده هم کار می‌کند و خطا نمی‌دهد!

وظیفه: یک پرامپت برای هوش مصنوعی بنویسید و از او بخواهید:

  1. تفاوت دقیق isset($var) و !empty($var) (نقیض empty) را در قالب یک جدول مقایسه توضیح دهد.
  2. این جدول باید نشان دهد که هر کدام از این دو تابع برای مقادیر زیر چه خروجی (true/false) دارند:
    • متغیر تعریف‌نشده (unset variable)
    • null
    • false
    • 0 (عدد صفر)
    • "0" (رشته صفر)
    • "" (رشته خالی)
    • "ali" (رشته پر)
  3. در نهایت، از او بپرسید چرا برای اعتبارسنجی فرم‌های $_POST، استفاده از !empty() معمولاً «کافی‌تر» و «راحت‌تر» از isset() است؟