اعتبارسنجی پایه‌ فرم‌ها

Basic Form Validation

25 بهمن 1399
پروژه ساخت شبکه ی اجتماعی: اعتبار سنجی پایه فرم ها

در جلسه قبل فرم های login و register را ایجاد کردیم و در این قسمت می خواهیم درخواست های ارسال شده از سمت فرم ثبت نام را مدیریت کنیم. به کد متد register نگاه کنید:

public function register(){
      // Check for POST
      if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // Process form
      } else {
        // Init data
        $data =[
          'name' => '',
          'email' => '',
          'password' => '',
          'confirm_password' => '',
          'name_err' => '',
          'email_err' => '',
          'password_err' => '',
          'confirm_password_err' => ''
        ];

        // Load view
        $this->view('users/register', $data);
      }
    }

در صورتی که درخواست از نوع POST نیز باشد باز هم نیاز داریم که data را بسازیم بنابراین قسمت data را از بلوک else کپی می کنیم. ما می خواهیم که فیلدهای name و email و password و confirm_password اجباری باشند و حتما پُر شوند اما فعلا قسمت خطاها (err) را خالی می گذاریم. بنابراین:

// Init data
        $data =[
          'name' => trim($_POST['name']),
          'email' => trim($_POST['email']),
          'password' => trim($_POST['password']),
          'confirm_password' => trim($_POST['confirm_password']),
          'name_err' => '',
          'email_err' => '',
          'password_err' => '',
          'confirm_password_err' => ''
        ];

دلیل استفاده از تابع ()trim این است که فضاهای خالی (مانند اسپیس و tab و...) را که اشتباها یا عمدا توسط کاربر اضافه شده اند، حذف کنیم.

حالا باید مطمئن شویم که محتوای POST_$ فقط رشته ای و امن است. در نتیجه می گوییم:

// Sanitize POST data
        $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

با این کار PHP داده های آرایه POST را امن می کند.

اکنون باید تک تک این فیلدها را چک کنیم تا خالی نباشند. برای email می گوییم:

// Validate Email
        if(empty($data['email'])){
          $data['email_err'] = 'Pleae enter email';
        }

البته بعدا برای ایمیل یک بلوک else هم خواهیم داشت تا چک کنیم که کسی قبلا با این ایمیل ثبت نام نکرده باشد، اما این کار نیاز به model و پایگاه داده دارد. بنابراین فعلا آن را کنار می گذاریم اما بعدا به آن برمی گردیم و کد را تکمیل می کنیم.

برای name می گوییم:

// Validate Name
        if(empty($data['name'])){
          $data['name_err'] = 'Pleae enter name';
        }

برای password دو چیز را چک می کنیم. اول اینکه فیلد مربوطه خالی نباشد و دوم اینکه رمز عبور کمتر از 6 کاراکتر نباشد بنابراین می گوییم:

// Validate Password
        if(empty($data['password'])){
          $data['password_err'] = 'Pleae enter password';
        } elseif(strlen($data['password']) < 6){
          $data['password_err'] = 'Password must be at least 6 characters';
        }

برای confirm_password که همان وارد کردن مجدد رمز عبور است میگوییم:

// Validate Confirm Password
        if(empty($data['confirm_password'])){
          $data['confirm_password_err'] = 'Pleae confirm password';
        } else {
          if($data['password'] != $data['confirm_password']){
            $data['confirm_password_err'] = 'Passwords do not match';
          }
        }

در بلوک اول کد چک می کنیم که رمز عبور وارد شده باشد (فیلد خالی نباشد) و در بلوک دوم چک می کنیم که رمز عبور در هر دو فیلد password و confirm_password یکی باشند.

تا اینجای کار برای هر خطا فقط یک پیام را در یک رشته گذاشتیم و در اصل کاری نکردیم. حالا باید چک کنیم و اگر خطایی وجود داشت از ثبت نام جلوگیری کنیم:

// Make sure errors are empty
        if(empty($data['email_err']) && empty($data['name_err']) && empty($data['password_err']) && empty($data['confirm_password_err'])){
          // Validated
          die('SUCCESS');
        } else {
          // Load view with errors
          $this->view('users/register', $data);
        }

در این کد می گوییم اگر خطاهای تمام فیلدهای مورد نظر خالی بودند پیام SUCCESS را نشان بده و در غیر این صورت view (فرم) را دوباره به همراه داده های وارد شده توسط کاربر بارگذاری کن.

متد register در حال حاضر به این شکل در آمده است:

public function register(){
      // Check for POST
      if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // Process form
  
        // Sanitize POST data
        $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

        // Init data
        $data =[
          'name' => trim($_POST['name']),
          'email' => trim($_POST['email']),
          'password' => trim($_POST['password']),
          'confirm_password' => trim($_POST['confirm_password']),
          'name_err' => '',
          'email_err' => '',
          'password_err' => '',
          'confirm_password_err' => ''
        ];

        // Validate Email
        if(empty($data['email'])){
          $data['email_err'] = 'Pleae enter email';
        }

        // Validate Name
        if(empty($data['name'])){
          $data['name_err'] = 'Pleae enter name';
        }

        // Validate Password
        if(empty($data['password'])){
          $data['password_err'] = 'Pleae enter password';
        } elseif(strlen($data['password']) < 6){
          $data['password_err'] = 'Password must be at least 6 characters';
        }

        // Validate Confirm Password
        if(empty($data['confirm_password'])){
          $data['confirm_password_err'] = 'Pleae confirm password';
        } else {
          if($data['password'] != $data['confirm_password']){
            $data['confirm_password_err'] = 'Passwords do not match';
          }
        }

        // Make sure errors are empty
        if(empty($data['email_err']) && empty($data['name_err']) && empty($data['password_err']) && empty($data['confirm_password_err'])){
          // Validated
          die('SUCCESS');
        } else {
          // Load view with errors
          $this->view('users/register', $data);
        }

      } else {
        // Init data
        $data =[
          'name' => '',
          'email' => '',
          'password' => '',
          'confirm_password' => '',
          'name_err' => '',
          'email_err' => '',
          'password_err' => '',
          'confirm_password_err' => ''
        ];

        // Load view
        $this->view('users/register', $data);
      }
    }

اعتبارسنجی پایه فرم ورود (login)

حالا باید مشابه این کار را برای صفحه login نیز انجام دهید. ابتدا FILTER_INPUT_ARRAY و آرایه data را برای صفحه login نیز کپی کرده و در قسمت پردازش فرم کپی کنید. از آنجایی که از فیلدهای name و confirm_password و err (خطا) های آن ها استفاده نمی کنیم می توانیم این اعضا را از آرایه data$ پاک کنیم.

همچنین کدهای اعتبار سنجی ایمیل و رمز عبور را نیز پس از data$ کپی کنید:

// Validate Email
        if(empty($data['email'])){
          $data['email_err'] = 'Pleae enter email';
        }

        // Validate Password
        if(empty($data['password'])){
          $data['password_err'] = 'Please enter password';
        }

سپس کد مربوط به چک کردن err ها را نیز کپی می کنیم:

// Make sure errors are empty
        if(empty($data['email_err']) && empty($data['password_err'])){
          // Validated
          die('SUCCESS');
        } else {
          // Load view with errors
          $this->view('users/login', $data);
        }

اما فیلدهای name و confirm_password را حذف می کنیم.

بنابراین متد لاگین به این شکل خواهد بود:

public function login(){
      // Check for POST
      if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // Process form
        // Sanitize POST data
        $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
        
        // Init data
        $data =[
          'email' => trim($_POST['email']),
          'password' => trim($_POST['password']),
          'email_err' => '',
          'password_err' => '',      
        ];

        // Validate Email
        if(empty($data['email'])){
          $data['email_err'] = 'Pleae enter email';
        }

        // Validate Password
        if(empty($data['password'])){
          $data['password_err'] = 'Please enter password';
        }

        // Make sure errors are empty
        if(empty($data['email_err']) && empty($data['password_err'])){
          // Validated
          die('SUCCESS');
        } else {
          // Load view with errors
          $this->view('users/login', $data);
        }


      } else {
        // Init data
        $data =[    
          'email' => '',
          'password' => '',
          'email_err' => '',
          'password_err' => '',        
        ];

        // Load view
        $this->view('users/login', $data);
      }
    }

قطعا این کد ها نیاز به تکمیل و تصحیح دارند و فعلا شکل کلی آن ها را نوشته ایم بنابراین در جلسات بعد آن ها را تکمیل خواهیم کرد.

دانلود فایل های پروژه تا این قسمت

امیدوارم از این قسمت لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش ساخت شبکه اجتماعی توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.