بررسی ایمیل قبل از ثبت‌نام

Checking Email Before Registering

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

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

فعلا هیچ کاربری در جدول users در پایگاه داده نداریم. بنابراین برای تست کردن باید به صورت دستی یک کاربر بسازیم. به آدرس localhost/phpmyadmin و سپس به جدول users بروید. در آنجا از سربرگ Insert کاربری را با اطلاعات زیر بسازید:

  • ستون name برابر با John Doe
  • ستون email برابر با JDoe@gmail.com
  • ستون password برابر با 1234

نکته: هیچ گاه نباید رمزهای عبور کاربران را به صورت متن خالی (مثلا 1234 یا BHG654 و...) ذخیره کنید بلکه تمامی پسوردها باید هش شوند. کاربری که ما در این قسمت ساخته ایم واقعی نبوده و فقط جهت تست کارایی برنامه است، بنابراین نیازی به هش کردن ندارد.

از پوشه controllers وارد فایل Users.php شوید. برای کار با پایگاه داده نیاز به model داریم؛ اگر یادتان باشد کاری کردیم که هنگام نیاز به model می توانستیم آن را از constructor بارگذاری کنیم بنابراین به constructor فایل Users.php بروید و model را مانند کد زیر بارگذاری کنید:

public function __construct(){
      $this->userModel = $this->model('User');
    }

این کد می گوید به پوشه models برو و به دنبال فایلی به نام User.php بگرد بنابراین باید این فایل را ایجاد کنیم!

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

private $db;

    public function __construct(){
      $this->db = new Database;
    }

در ابتدا یک خصوصیت private به نام db ساخته ایم سپس constructor این کلاس را ایجاد کرده ایم. اگر یادتان باشد کلاس PDO که ساختیم کلاسی به نام Database بود بنابراین درون constructor نیز یک شیء از این کلاس ساخته ایم تا به پایگاه داده متصل شویم.

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

// Find user by email
    public function findUserByEmail($email){
      $this->db->query('SELECT * FROM users WHERE email = :email');
      $this->db->bind(':email', $email);

      $row = $this->db->single();

      // Check row
      if($this->db->rowCount() > 0){
        return true;
      } else {
        return false;
      }
    }

توضیح کد:

تابعی/متدی به نام findUserByEmail ایجاد کرده ایم که یک پارامتر به نام email$ می گیرد. سپس با استفاده از دستور this->db->query کوئری خود را ایجاد کرده ایم. این دستور (query) یک متد است که در فایل Database.php (در پوشه libraries) تعریف کرده ایم:

// Prepare statement with query
    public function query($sql){
      $this->stmt = $this->dbh->prepare($sql);
    }

سپس باید از متد bind در همین فایل Database.php استفاده کنیم که مقادیر را به کوئری بچسبانیم و در آخر از آنجا که یک نتیجه بیشتر نداریم باید از متد single (تعریف شده در Database.php) استفاده کنیم.

کوئری که در این کد استفاده کرده ایم کوئری زیر است:

SELECT * FROM users WHERE email = :email

این کوئری می گوید در ستون email به دنبال هر چیزی باش (علامت *) که برابر با email: باشد. دو نقطه قبل از ایمیل به این خاطر است که از نوع named parameter در prepared statement ها استفاده می کنیم (ر.ک به جلسات قبل). سپس با متد bind مقدار email را به email: متصل کرده ایم و نتیجه را در متغیر row قرار داده ایم.

ما نیازی به برگرداندن نتیجه نداریم بلکه فقط یک true یا false می خواهیم تا بدانیم چنین ایمیلی از قبل وجود دارد یا خیر. بنابراین گفته ایم اگر تعداد نتیجه های برگشتی بیشتر از 0 باشد (یعنی یک ایمیل یا بیشتر پیدا شده) یعنی چنین ایمیلی از قبل وجود دارد و مقدار true برمی گردد، در غیر این صورت false برگردانده می شود.

حالا باید وارد پوشه controllers و سپس فایل Users.php بشویم. قسمتی را برای اعتبارسنجی ایمیل در نظر گرفته بودیم (validate email) بنابراین کد آن را تکمیل می کنیم:

// Validate Email
        if(empty($data['email'])){
          $data['email_err'] = 'Pleae enter email';
        } else {
          // Check email
          if($this->userModel->findUserByEmail($data['email'])){
            $data['email_err'] = 'Email is already taken';
          }
        }

قسمت else قسمتی است که الان اضافه کردیم. در این قسمت گفته ایم اگر کاربر مقداری را برای ایمیل وارد کرده بود به مدل User نگاه کند و ببیند ['data['email (یعنی ایمیلی که کاربر وارد کرده) توسط متد findUserByEmail پیدا می شود یا خیر. اگر true باشد یعنی پیدا شده که باید یک خطا نشان دهیم و بگوییم ایمیل قبلا وجود داشته است در غیر این صورت ثبت نام مشکلی نخواهد داشت.

حالا اگر (مراجعه به آدرس localhost/shareposts/users/register) فرد دیگری را با مشخصات زیر ثبت نام کنید خطای email is already taken را دریافت می کنیم:

  • فیلد name هر چه می خواهد باشد (مثلا John Doe یا John Smith یا Roxo یا هر چیز دیگری) چرا که در قسمت نام محدودیتی اعمال نکردیم. افراد مختلف ممکن است نام یکسان داشته باشند.
  • فیلد email را همان ایمیلی قرار دهید که برای کاربر فرضی در PHPMyAdmin به صورت دستی ثبت کردیم: jdoe@gmail.com. چرا؟ به این دلیل که می خواهیم برنامه را تست کنیم تا ببینیم قدرت شناسایی ایمیل تکراری را دارد یا خیر بنابراین حتما باید از ایمیل تکراری استفاده کنیم.
  • فیلدهای password و confirm password را هم هر چیزی که دوست دارید وارد کنید. حتی می توانید آن ها را خالی بگذارید و دکمه register را بزنید.

می توانید این مورد را خودتان امتحان کنید.

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

امیدوارم از این مقاله لذت برده باشید. در قسمت بعدی فرآیند ثبت نام را تکمیل می کنیم تا بتوانیم به صورت واقعی کاربران را ثبت نام و وارد پایگاه داده کنیم (در حال حاضر کاربری با فرم ثبت نام ایجاد نمی شود).

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

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