
یک سیستم ثبت نام و فرم لاگین کاربران برای سیستم های تحت وبی که با کاربران زیادی سر و کار دارند بسیار مفید و لازم است.
به کمک سیستم ثبت نام و ورود کاربران خواهیم توانست برخی اطلاعات مفید از کاربران را نگهداری کرد و یا فرآیندهای کنترل دسترسی به بعضی از بخش های سایت اعمال کرد.
- ممکن است در سایت های فروشگاهی نیاز به ذخیره سازی تاریخچه سفارشات و پرداخت های کاربران و امکان بررسی آنها توسط کاربر داشته باشیم.
- و یا در سایت های آموزشی، دسترسی دانشجویان هر دوره به محتوای دوره هایی که در آنها ثبت نام کرده را کنترل کنیم.
- همچنین برای بخش مدیریتی یک سایت داینامیک، نیاز به تایید هویت فرد جهت ارائه دسترسی مدیریتی خواهیم داشت.
همانطور که میبینید داشتن یک سیستم برای فرآیند ورود در سیستم های تحت وب تا حدود زیادی ضروری احساس میشود.
در این مقاله قصد داریم به صورت گام و به گام مراحل ساده ساخت فرم ورود به سایت برای ورود کاربران را طی کنیم.
فهرست محتوای آموزش
ساخت فرم ورود سایت
در ابتدا باید فرمی برای دریافت اطلاعات ورود کاربر که در اینجا شامل نام کاربری و رمز عبور است ایجاد کنیم.
کدهای HTML یک فرم ورود ساده به صورت زیر نوشته شده است. این کدها را در فایلی با نام login.php
قرار میدهم.
میتوانید استایل دهی فرم را به سلیقه خود و با استفاده از کدهای CSS انجام دهید.
<html> <header> <title>صفحه ورود</title> </header> <body> <form method="post" action="do-login.php"> <div class="form-element"> <label>نام کاربری</label> <input type="text" name="username" pattern="[a-zA-Z0-9|_]+" required /> </div> <div class="form-element"> <label>رمز عبور</label> <input type="password" name="password" required /> </div> <button type="submit" name="login" value="login">ورود</button> </form> </body> </html>
ارتباط با دیتابیس برای فرم ورود
فرض میکنیم اطلاعات کاربران در جدولی با نام users ذخیره شده است. برای هر کاربر یک نام کاربری یکتا و رمز عبور را نگهداری میکنیم.
این جدول میتواند اطلاعات دیگری را نیز ذخیره کند؛ به عنوان مثال، ایمیل، شماره تماس، آدرس، آخرین ورود و …
فایل تنظیمات ارتباط با دیتابیس
برای راحتی کار، اطلاعات مربوط به ارتباط با دیتابیس را درون یک فایل با نام config.php
قرار میدهیم. هر جایی که نیاز به ارتباط با پایگاه داده داشته باشیم، این فایل را در ابتدای فایل مورد نظر اضافه (include) خواهیم کرد. (بیشتر بدانید: آموزش فراخوانی فایل در PHP)
در غیر اینصورت می بایست در تمام فایل هایی که با دیتابیس سر و کار دارند اطلاعات ارتباطی را نوشت. در صورتی که اطلاعات پایگاه داده تغییر کند، تغییر دادن تک تک این اطلاعات کار مشکلی خواهد بود.
خب، حال سر وقت تعریف تنظیمات ارتباط با دیتابیس میرویم و یک کانکشن اولیه ایجاد میکنیم.
<?php define('DBUSER', 'root'); define('DBPASS', ''); define('DBHOST', 'localhost'); define('DBNAME', 'test'); try { $connection = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASS); } catch (PDOException $e) { exit("خطایی رخ داده (" . $e->getMessage() . ")"); } ?>
در آموزش این اسکریپت از ارتباط PDO
برای اتصال به دیتابیس استفاده کرده ایم. اگر با PDO آشنا نیستید، پیشنهاد میکنم آموزش PDO در PHP را ببنید. همچنین برای افزایش امنیت ارتباط با دیتابیس، میتوانید مقاله آموزش جلوگیری از حملات sql injection با PDO در PHP را مطالعه کنید.
پیاده سازی فرآیند ورود به سایت
حال ب قسمت اصلی ماجرا یعنی کدنویسی فایل do-login.php
میرسیم.
در این فایل نام کاربری و رمز عبور وارد شده توسط کاربر را گرفته و آنرا به اطلاعات موجود در دیتابیس مطابقت میدهیم.
در صورتی که یک نام کاربری و رمز عبور مشابه در ردیف های اطلاعاتی جدول users وجود داشت، کاربر با موفقیت وارد سیستم شده است، در غیر اینصورت خطایی به او نشان خواهیم داد.
<?php session_start(); include('config.php'); if (isset($_POST['login'])) { $username = $_POST['username']; $password = $_POST['password']; $query = $connection->prepare("SELECT * FROM users WHERE username=:username"); $query->bindParam("username", $username, PDO::PARAM_STR); $query->execute(); $result = $query->fetch(PDO::FETCH_ASSOC); if ( !$result ) { echo '<p class="error">نام کاربری یا رمزعبور وارد شده اشتباه است!</p>'; } else { if ( $password == $result["password"]) { $_SESSION["user"] = $result["email"]; echo '<p class="success">شما با موفقیت وارد سایت شدید!</p>'; } else { echo '<p class="error">نام کاربری یا رمزعبور وارد شده اشتباه است!</p>'; } } } ?>
همانطور که در کد بالا مشخص است، با یک دستور SQL اطلاعات کاربری با نام کاربری وارد شده را از جدول میگیریم.
اگر ردیفی با این نام کاربری وجود نداشت پیغام خطا نمایش میدهیم. (خط 17 و 18)
و اگر نام کاربری درست بود، رمز عبور وارد شده را با رمز عبور ثبت شده در دیتابیس مطابق میدهیم.
ورود موفقیت آمیز کاربر در فرم لاگین
در صورتی که ورود کاربر موفقیت آمیز بود، یک نشست یا سشن (session) با نامی دلخواه را برای ایجاد میکنیم.
مقدار این نشست هر چیزی میتواند باشد، اما پیشنهاد میکنیم اگر نیاز دارید بعداً اطلاعات کاربر را دوباره از دیتابیس واکشی کنید (مثلا شماره تماس کاربر و اسمش را به او نشان دهید) بهتر است مقداری مرتبط را در این سشن ذخیره کنید.
این مقدار میتواند نام کاربری، ایمیل و یا id منحصر به فرد او در جدول پایگاه داده باشد.
اگر میخواهید اطلاعات بیشتری در مورد نشست یا سشن کسب کنید، شما را به مطالعه مقاله سشن در PHP دعوت میکنیم.
کنترل دسترسی کاربر لاگین شده به صفحات سایت
بسیار خب، تا کنون توانستیم کاربر را شناسایی کنیم.
به این صورت که کاربر در فرم ورود اطلاعات خود را وارد کرده و در صورتی که این اطلاعات با اطلاعات دیتابیس مطابقت داشت، ورود تایید میشود.
بعضی صفحات در سیستم ما وجود دارند که نیازمند این است که کاربر در سیستم لاگین کرده باشد. (مثلاً نمایش پنل مدیریت)
ممکن است کاربری بدون لاگین کردن به سیستم، و از طریق وارد کردن مستقیم آدرس کنترل شده ما، قصد ورود به صفحه را داشته باشد.
ما باید در ابتدای صفحه مورد نظر، وضعیت ورود یا عدم ورود کاربر را بررسی کنیم و در صورتی که وارد نشده بود، او را به صفحه ورود هدایت کنیم.
برای این کار میتوانیم قطعه کد زیر را در فایل حفاظت شده قرار دهیم.
<?php session_start(); if( !isset($_SESSION["user"]) ){ header('Location: login.php'); exit; } else { // محتوای صفحه حفاظت شده } ?>
در این با بررسی تعریف بودن یا نبود سشن تنظیم شده در هنگام ورود، میتوان فهمید که کاربر ورود موفقیت آمیزی داشته یا خیر.
افزایش امنیت صفحه ورود و فرآیند ورود به سایت
کارهای زیادی برای افزایش امنیت فرآیند ورود کاربران میتوان انجام داد، یکی از این کارها، رمزنگاری رمزعبور کاربران سایت است.
اگر خدایی نکرده سایت شما مورد حمله قرار گرفته و مهاجم به پایگاه داده شما دست پیدا کند، رمز عبور تمام کاربران شما فاش شده و میتواند مشکلات بسیاری برایتان ایجاد کند.
برای جلوگیری از به وجود آمدن چنین مشکلی، میتوان رمزعبور کاربران را به صورت رمز شده (هش شده) در دیتابیس PHP نگهداری کرد. برای آشنایی و کار با Hashها آموزش هش در PHP را ببینید.
توجه داشته باشید که در اینصورت، قسمت بررسی رمز عبور در فایل do-login.php
مقداری متفاوت خواهد شد.
مقاله آموزش ساخت فرم ورود با PHP برای سایت نیز به پایان رسید. امیدواریم برایتان جامع و مفید بوده باشد.
اگر سوالی درباره ساخت این فرم داشتید، خوشحال میشویم بتوانیم به شما کمک کنیم. آنرا در قسمت دیدگاه ها با ما در میان بگذارید.
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام چرا من هرچی رمز عبور و نام کاربری می زنم می نوسه اشتباه است ؟
سلام
شرطی که نوشتید صحیحه؟
یه موردی رو هم تست کنید، اطلاعاتی که از دیتابیس گرفتید رو چاپ کنید ببینید همون چیزیه که انتظار دارید یا نه.
سلام خسته نباشید مثل همیشه عالی و به درد بخور ولی یک مشکلی دارم اونم اینه که وقتی وارد میشه بعد ریلود صفحه دوباره باید لاگین کنه یک کدی یا یک اموزشی بدین که طرف وقتی یک بار وارد میشه توی یک دیتابیس یا جایی ذخیره بشه و وقتی که دفعه بعد وارد شد چک کنه ببینه همون فرد هستش یعنی برای مثال با مک ادرس بتونه چک کنه که فرد قبلی هست و اگر قبلی بود دوباره وارد همون اکانت بشه و با هر ریلود دوباره از اول لاگین نکنه ممنون میشم کمک کنین
سلام
خوشحالم که برات مفید بوده 🙂
برای این کاری که گفتی میتونی از کوکیها استفاده کنی. یه کوکی داخل مرورگر کاربر ذخیره کن و در هر بار بارگذاری صفحه بررسیش کن. اگه ثبت شده بود میتونی یه session ایجاد کنی که این فرد به عنوان لاگینشده درنظر گرفته بشه.
البته این سادهترین راه حله. برای امنیت بیشتر میتونی مقدارش رو هش کنی، یا یک مقدار تصادفی (برای کوکی) ایجاد کنی و اون رو با مقادیری که توی دیتابیس نگه داشتی مقایسه کنی.
فقط باید بگم خدا همیشه یارتون باشه
بلخره بعد 3 روز گردش تو این سایت تونستم همشو اوکی کنم
دمتون گرم بابت کوکی رفتم گشتم و اوکی کردم
دمتون گرم انشالله هرچی از خدا میخواید بهتون بده
سلامت باشی علیرضای عزیز
ممنون بابت لطفت. خوشحالیم که تونستی کارت رو به نتیجه برسونی 🙂
سورسشو میزارید
کدهایی که استفاده کردیم دقیقاً همین مواردی هست که توی آموزشه. میتونید ازشون کپی کنید ولی باید تغییراتی بدید که با نیازتون سازگار بشه.
سلام
لینک CSS رو میگذارید؟
سلام علی جان
ما برای این آموزش css خاصی ننوشتیم وگرنه قرارش میدادیم توی آموزش.
با جستجوی html form css style به طراحیهای مختلفی توی سایتهای خارجی میرسید که میتونید ایدهبرداری کنید.
شرکت
سلاااااام
آقا من اواسط دوره php هستم اوایل کلی تو یوتیوب دنبال این رجیستریاو ست کردن ها بودم (چقدرباجزیییات نوشتی شما )
خداااییی دمت گرم عالیییییییییییییییییییی
نان پدر حلالت
خیلی خیلی خوشحالیم که این مجموعه آموزشها کمکتون کرده تا راحتتر وارد دنیای برنامه نویسی وب بشید.
مرسی برای انرژی خوبتون.
راستی، از ابتدای تیرماه دوره مکمل پروژه محور هم توی سایت قرار میگیره. اگه دوست داشت بهمون سر بزن، ضرر نمیکنی حسین جان 😉
سلام و خداقوووت
خداوند اجرتون بده بسیااار عالی و کاربری
کاشکی راجبع اینم حرف میزدید
برای جلوگیری از به وجود آمدن چنین مشکلی، میتوان رمزعبور کاربران را به صورت رمز شده (هش شده) در دیتابیس نگهداری کرد.
سلام
به کمک بعضی توابع هش میتونید یک رشته رو طوری کد کنید که قابل برگشت نباشه. اگر خدایی نکرده اطلاعات دیتابیس لو بره، رمز کاربران در امنیت میمونه. مثلا تابع
md5()
رو تست کنید.سعی میکنم طی دو هفته آینده یک آموزش در این باره آماده و منتشر کنم. لینک آموزش رو به ایمیلتون میفرستم حتما
عالی بود. دمتون گرم
خوشحالم که این آموزش براتون کاربردی بوده. موفق باشید.
مشکلی که پیش میاد این هست که به راحتی میشه یک برنامه نوشت که یک ربات برای یک یوزرنیم خاص پسورد هارو یکی یکی امتحان کنه و پسورد کاربر هک بشه…
نیاز به کد CAPCHA داره … چطور میشه این مشکل رو حل کرد؟
حرفتون کاملاً صحیحه! برای کد کپچا در فرم میتونید از کدها یا ابزارهای جانبی (مثل recapcha گوگل) استفاده کنید.
اگر مایلید خودتون ایجادش کنید، یک روش ساده این هست که یک رشته تصادفی در PHP بسازید، حالا اون رو (ترجیحاً به صورت کد شده) در سشن قرار بدید و از کاربر بخواید اون مقدار رو در فیلد شما وارد کنه.
برای نمایشش هم میتونید اون عبارت رو به عکس یا حتی صوت تبدیل کنید که قطعاً چالشهای خودش رو داره و خارج از این بحثه!
امیدوارم تونسته باشم سرنخی برای پیشرفتتون داده باشم. موفق باشید.
سلام چه کار کنم که اگه مشخصات درست بود با کلیک روی ورود به صفحه دیگری هدایت بشه
سلام
سوالتون یک مقدار کلی هست. اما به عنوان سررشتهای برای ادامه دادن، آموزش AJAX در PHP رو مطالعه کنید که یکی از بهترین روشها برای بررسی فرم بدون رفرش صفحه هست.
سلام استاد وقتتون بخیر
ببخشید من کدی میخوام ک کاربر برای صفحه ی ثبت نام ایمیل و کد پستی و نام خانوادگی رو وارد کنه
ممنون میشم کمکم کنید
سلام
برای هر کدوم از فیلدها میتونید مشابه همین آموزش عمل کنید.
به ترتیب برای فیلدهای نام، کدپستی و ایمیل میشه از فیلدهای زیر استفاده کرد.
اول هر خط یه کاراکتر
>
اضافه کنید.برای فیلد کدپستی، اندازه رو 10 تایی در نظر گرفتم که مطابق کدپستی ایران هست؛ میتونید تغییر بدید یا حذفش کنید.
موفق باشید.
لطف میکنید کد ثبت نام توی همین لوکیشن دیتابیس رو بنویسید؟
برای ثبت نام باید کوئری که نوشته شده رو متناسب با چیزی که میخواید تغییر بدید.
کوئری شما میتونه چیزی شبیه زیر باشه
و بعد هم متغیرها رو بهش پاس میدید و اجراش میکنید:
موفق باشید
سلام
یوزر پس باید چطور توی دیتابیس قرار بگیره که سورس بخونه یوزر پس رو؟
سلام
توی این مثال، داخل دیتابیس یه جدول به اسم
users
در نظر گرفتیم که سه مقدارusername
وpassword
وemail
دارهموقع اتصال به دیتابیس، به کمک یوزرنیم، کاربر رو پیدا میکنیم و بعد هم پسوردش رو بررسی میکنیم.
پسورد رو هم میشه عادی ذخیره کرد یا برای امنیت بیشتر، با یه الگوریتم رمزنگاری مثل
md5
یاsha1
کد کرد و کد شدهی اون رو ذخیره کرد.موفق باشید
username = “user”
password = “pass”
درسته؟
توی کدهای بالا، زمانی که کوئری روی دیتابیس اعمال میشه، تمام نتایج رو توی متغیر
result
میریزیم.حالا به تمام مقادیری که برای اون کاربر در دیتابیس ذخیره شده دسترسی داریم؛ برای مثال
$result["password"]
مشخصکننده پسورد کاربر خواهد بود.