تکمیل فرم ثبت‌نام

Completing the Registration Form

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

تا این قسمت از پروژه اعتبارسنجی فرم را انجام داده ایم و ایمیل را نیز چک کرده ایم. حالا باید کدهای فرم ثبت نام را تکمیل کنیم تا بتوانیم کاربران را به صورت واقعی ثبت نام کنیم. از پوشه controllers وارد فایل Users.php شوید و قسمتی را پیدا کنید که به شکل زیر است:

// 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);
        }

از این قسمت پیام موفقیت آمیز بودن ('die ('SUCCESS را حذف کنید:

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

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

// Hash Password
          $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);

این کد را پایین تر از کد ('die ('SUCCESS (که الان حذف شده است) اضافه کنید. این تابع یک هش قوی برای ما تولید می کند. در واقع هش ها حالت رمز نگاری شده یک رشته هستند و دلیل استفاده از آن ها نیز حفاظت از اطلاعات شخصی کاربران از دو جهت است:

  • اول: شما مدیر سایت هستید اما صاحب اطلاعات کاربر نیستید بنابراین شما نیز نباید از رمز عبور کاربر خبر داشته باشید یا بتوانید آن را مشاهده کنید.
  • دوم: اگر زمانی وب سایت شما هک شود، هکر نباید به راحتی به رمز تمام کاربران دسترسی پیدا کند چرا که اکثر کاربران از یک یا دو رمز برای حساب های مختلف خود (متاسفانه حتی حساب های بانکی) استفاده می کنند بنابراین با هک شدن حسابشان در سایت شما ممکن است حساب بانکی شان نیز خالی شود.

شما هیچ وقت نباید مسئولیت اخلاقی خود را به عنوان یک توسعه دهنده و برنامه نویس از یاد ببرید. در واقع کاربران به شما اعتماد کرده اند و شما حافظ اطلاعات آن ها هستید و نباید با بهانه های واهی (مثل انجام عملیات بیشتر توسط سرور هنگام هش) این وظیفه را پشت گوش بیندازید.

مثال از یک رشته عادی:
Coding with Roxo.ir is really fun

مثال از همین رشته به صورت هش شده (بر اساس الگوریتم SHA256):
30d6e4625be4d1d84b892e01713453fece57ec04739a5fdee21e267a065c419c

پایین تر از این کد باید تابعی بسازیم که عملیات ثبت نام را انجام دهد. برای مطمئن شدن از صحت کارایی برنامه آن را در یک if قرار می دهیم:

// Register User
          if($this->userModel->register($data)){
           
          } else {
            die('Something went wrong');
          }

قرار است یک تابع به نام register بسازیم و تمام data (فیلدهای وارد شده توسط کاربر) را به آن می دهیم. در صورت بروز مشکل در عملیات پیامی به شکل Something went wrong نمایش داده می شود.

حالا وارد پوشه models و فایل User.php شوید. پایین تر از constructor تابع جدید خود را می نویسیم:

public function register($data){
      $this->db->query('INSERT INTO users (name, email, password) VALUES(:name, :email, :password)');
      // Bind values
      $this->db->bind(':name', $data['name']);
      $this->db->bind(':email', $data['email']);
      $this->db->bind(':password', $data['password']);

      // Execute
      if($this->db->execute()){
        return true;
      } else {
        return false;
      }
    }

توضیح کد:

این تابع یک پارامتر به نام data دارد که تمام فیلدهای ورودی کاربر است. دقت کنید که در data رمز عبور کاربر به صورت هش شده قرار خواهد داشت چرا که قبل تر آن را هش کردیم. سپس با استفاده از متد query که در کلاس پایگاه داده تعریف کرده بودیم، کوئری خود را اجرا می کنیم:

INSERT INTO users (name, email, password) VALUES(:name, :email, :password)

حالا باید مقادیر را bind کنیم، بنابراین از همان تابع bind استفاده کرده ایم. اگر یادتان باشد یک متد به نام execute در کلاس پایگاه داده ایجاد کرده بودیم. در نتیجه با استفاده از همان متد کوئری را اجرا می کنیم. برای اطمینان از صحت کارایی آن را در یک شرط if قرار می دهیم.

اکنون از پوشه controllers دوباره وارد فایل Users.php شوید. بالاتر یک تابع به نام register ساختیم که یا true برمی گرداند یا false و اگر false برگرداند با پیام Something went wrong مواجه می شویم اما اگر true برگردانده شد یعنی کاربر ثبت نام شده است. بنابراین تنها کاری که انجام می دهیم redirect کردن او به سمت صفحه login است. برای انجام redirect باید به شکل زیر عمل کنیم:

    header('location: ' . URLROOT . '/users/login');

اما هر بار که می خواهیم redirect انجام دهیم باید این کد تکراری را بنویسیم. بنابراین بهتر است یک تابع کمکی برای redirect ایجاد کنیم. پس وارد پوشه helpers می شویم و فایلی به نام url_helper.php می سازیم. این فایل را برای توابع کمکی می سازیم تا هر زمان که احساس کردیم برای کارهای جزئی به تابعی کمکی نیاز داریم آن را در این قسمت بنویسیم. فعلا برای تابع redirect این کار را انجام می دهیم:

<?php
  // Simple page redirect
  function redirect($page){
    header('location: ' . URLROOT . '/' . $page);
  }

در حالت عادی این فایل در فایل های اصلی ما بارگذاری نشده است بنابراین به فایل bootstrap.php بروید و آن را بارگذاری کنید:

// Load Helpers
  require_once 'helpers/url_helper.php';

پس می توانیم در فایل Users.php تابع را به این شکل بنویسیم:

// Register User
          if($this->userModel->register($data)){
            redirect('users/login');
          } else {
            die('Something went wrong');
          }

حالا به صفحه Register بروید و با اطلاعات دلخواه خود یک کاربر را ثبت کنید، سپس از PHPMyAdmin جدول users را بررسی کنید تا مطمئن شوید کاربر شما ثبت شده است.

شکل نهایی کدها برای قسمت ثبت نام بدین صورت است:

// Make sure errors are empty
        if(empty($data['email_err']) && empty($data['name_err']) && empty($data['password_err']) && empty($data['confirm_password_err'])){
          // Validated
          
          // Hash Password
          $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);

          // Register User
          if($this->userModel->register($data)){
            redirect('users/login');
          } else {
            die('Something went wrong');
          }

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

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

در قسمت بعدی به سراغ ایجاد یک تابع کمکی برای session ها و Flash message ها (پیام هایی که فقط یک بار نمایش داده می شوند) می رویم. امیدوارم از این مقاله لذت برده باشید.

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

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