در جلسه قبل فرم ثبت نام و ورود خود را به کمک بوت استرپ ایجاد کردیم، سپس کدهای اعتبار سنجی سمت سرور را نیز روی آن پیاده سازی کردیم. در این قسمت قصد داریم قبل از ثبت نام کاربر ایمیل ورودی را چک کنیم تا قبلا کسی با این ایمیل ثبت نام نکرده باشد. این کار نیاز به ارتباط با پایگاه داده دارد.
فعلا هیچ کاربری در جدول users در پایگاه داده نداریم. بنابراین برای تست کردن باید به صورت دستی یک کاربر بسازیم. به آدرس localhost/phpmyadmin و سپس به جدول users بروید. در آنجا از سربرگ Insert کاربری را با اطلاعات زیر بسازید:
نکته: هیچ گاه نباید رمزهای عبور کاربران را به صورت متن خالی (مثلا 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 را دریافت می کنیم:
می توانید این مورد را خودتان امتحان کنید.
دانلود فایل های پروژه تا این جلسه
امیدوارم از این مقاله لذت برده باشید. در قسمت بعدی فرآیند ثبت نام را تکمیل می کنیم تا بتوانیم به صورت واقعی کاربران را ثبت نام و وارد پایگاه داده کنیم (در حال حاضر کاربری با فرم ثبت نام ایجاد نمی شود).
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.