آموزش کامل ساخت پروفایل کاربری با PHP
در دو قسمت قبلی این سری آموزشی ۳ قسمتی، ساخت فرم ثبت نام با PHP و همینطور ساخت فرم ورود با PHP را آموزش دادیم. در این قسمت میخواهیم دربارهی ساخت پروفایل کاربری با PHP صحبت کنیم و آنرا باهم بسازیم. در طی روند ساخت پروفایل کاربری با PHP نکات بسیار جذاب و کاربردیای را یاد خواهیم گرفت که در پروژههای دیگر بسیار برایمان کاربردی خواهد بود. پس با من در این آموزش همراه باشید.
ساخت پروفایل کاربری با PHP
دانلود این فیلم آموزشی با کیفیت بالا و حجم ۵۰ مگ
اگر قسمت های دیگر این مجموعهی ۳ قسمتی را ندیدهاید، میتوانید از لینک های زیر استفاده کنید:
در ادامه به سراغ قسمت سوم این مجموعه آموزش ۳ قسمتی میرویم و اقدام به ساخت پروفایل کاربری با PHP میکنیم.
رفع یک باگ (مشکل) امنیتی در کد
یکی از مشکلاتی که الان در کد ما وجود دارد این است که رمز های کاربران را بصورت عادی در دیتابیس ذخیره میکنیم که این اصلا کار خوبی نیست. زیرا هرکسی که به دیتابیس دسترسی دارد میتواند رمزهای کاربران را مشاهده کند و یا اگر کسی به هر روشی به دیتابیس ما دسترسی پیدا کند، میتواند از اطلاعات کاربران ما سو استفاده کند. راه حل این موضوع این است که ما اطلاعات حساس، مثل رمز عبور را بصورت رمزنگاری شده در دیتابیس ذخیره کنیم.
برای انجام اینکار راه ها و روش های گوناگونی است. یکی از این روش ها استفاده از یکی از توابع PHP به نام ()md5 است. این تابع هر آن چیزی که در بین پرانتزهای آن وجود داشته باشد را بصورت رمز نگاری شده در میآورد:
echo md5('13579');
برای مثال اگر عدد ۱۳۵۷۹ که فرض کنیم رمز یک کاربر است را درون این تابع قرار دهیم و آنرا چاپ کنیم، با عبارت e13dd027be0f2152ce387ac0ea83d863 مواجه میشویم. که این عبارت رمزنگاری شدهی همان عدد ۱۳۵۷۹ میباشد.
با استفاده از این روش، ما رمزهایی از کاربر که در صفحهی register.php از او دریافت کردیم را، با تابع md5 در دیتابیس ذخیره میکنیم. برای اینکار باید فایل do-register.php را مانند کدهای زیر تغییر دهیم:
<?php require_once 'db.php'; $display_name = $_POST["display-name"]; $email = $_POST['email']; $password = md5($_POST['password']); $password_conf = md5($_POST['password-conf']); if($password != $password_conf){ echo 'رمز شما و تکرار آن برابر نیستند.'; }else{ $register = mysqli_query($db, "INSERT INTO users (display_name, email, password) VALUES ('$display_name', '$email','$password')"); if($register){ echo "done"; }else{ echo 'error'; } } ?>
در خط ۶ و ۷ از این کد، مقداری که از کاربر به عنوان password گرفتهایم را در داخل تابع md5 قرار میدهیم و به این صورت رمزهای کاربران را بصورت رمزنگاری شده در دیتابیس ذخیره میکنیم. مانند عکس زیر:
اما بعد از انجام اینکار، باید فایل do-login.php را هم تغییر دهیم. به این دلیل که هنگام ورود کاربر، رمزی که از کاربر دریافت میکند را نیز به یک رمز md5 شده تبدیل کند و سپس آن رمز را با رمز درون دیتابیس مقایسه کند و اگر درست بود، به کاربر اجازهی ورود به سیستم بدهد. برای اینکار فایل do-login.php را به این صورت آپدیت میکنیم:
<?php require_once 'db.php'; $email = $_POST['email']; $password = md5($_POST['password']); $check = mysqli_query($db, "SELECT * FROM users WHERE email='$email' AND password='$password'"); if(mysqli_num_rows($check) > 0){ // این یک نقطه نیست و عدد صفر میباشد. echo "done"; }else{ echo 'you do not registered yet'; } ?>
در خط ۵ ورودی رمز کاربر را درون تابع md5 قرار دادیم و سپس وجود یا عدم وجود آن کاربر را در دیتابیس بررسی کردهایم.
برای اطلاعات بیشتر مطالعهی ۲ مقالهی دیتابیس چیست و MySQL چیست میتواند مفید باشد.
انتقال کاربر به صفحهی ورود بعد از ثبت نام
در ادامهی مسیر ساخت پروفایل کاربری با PHP میخواهیم کاری کنیم که کاربر بعد از ثبت نام، به صفحهی ورود هدایت شود. در حال حاضر وقتی که کاربر در سیستم ما ثبت نام میکند، صرفا یک پیام done به او نمایش داده میشود. اما با استفاده از کد زیر که در فایل do-register.php آنرا قرار میدهیم، میتوانیم کاری کنیم که وقتی که ثبت نام کاربر با موفقیت انجام شد، به صفحهی login.php هدایت شود:
<?php require_once 'db.php'; $display_name = $_POST["display-name"]; $email = $_POST['email']; $password = md5($_POST['password']); $password_conf = md5($_POST['password-conf']); if($password != $password_conf){ echo 'رمز شما و تکرار آن برابر نیستند.'; }else{ $register = mysqli_query($db, "INSERT INTO users (display_name, email, password) VALUES ('$display_name', '$email','$password')"); if($register){ header('Location: ../login.php'); }else{ echo 'error'; } } ?>
در خط ۱۴ با اسفتاده از تابع ()header تعریف کردهایم که اگر ثبت نام کاربر با موفقیت انجام شد، او را به صفحهی login.php هدایت یا اصطلاحا ریدایرکت بکند. اگر دربارهی این موضوع میخواهید بیشتر بدانید، آموزش انتقال کاربر به صفحه دیگر با PHP را مطالعه کنید.
ساخت پروفایل کاربری با PHP
در اینجا میخواهیم اقدام بهساخت پروفایل کاربری با PHP کنیم. برای انجام اینکار، در کنار فایل های login.php , register.php و… یک فایل با نام profile.php میسازیم (مراقب باشید که این کار را داخل فولدر engine انجام نمیدهیم). سپس در این فایل کدهای زیر را قرار میدهیم:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>پروفایل شما</title> </head> <body> <h2>خوش آمدید مهدی عزیز</h2> <a href="#">خروج از حساب کاربری</a> </body> </html>
کدهای بالا نیز نیاز به توضیح خاصی ندارند. فقط در اینده میخواهیم بجای «مهدی» نام کاربر را به او نشان دهیم.
چگونه میتوانیم کاربر را به خاطر بسپاریم؟
ما برای حرفهای تر کردن سیستمی که تا الان نوشتیم، نیاز به اضافه کردن چند امکان داریم:
- وقتی که کاربر وارد سیستم ما میشود، دیگر نیازی نیست که صفحهی login.php یا register.php را بتواند مشاهده کند. باید کاری کنیم که وقتی کاربر با موفقیت وارد سیستم ما شد، اگر خواست که وارد صفحات login.php یا register.php شود، او را به صفحهی پروفایل خود که فایل profile.php میباشد هدایت کنیم. زیرا منطقی نیست که کاربری که وارد سیستم ما شده است، بتواند که دوباره وارد شود، یا ثبت نام کند.
- همینطور نیاز داریم که در صفحهی پروفایل، در جای مناسب اسم کاربر را ذخیره کنیم.
- همینطور باید کاری کنیم که کاربر بتواند از پروفایل کاربری خود خارج شود و مثلا اقدام به ورود با یک اکانت دیگر کند و یا اکانت دیگری بسازد.
برای انجام تمام این کارها نیاز داریم تا به یک روشی متوجه شویم که آیا کاربر قبلا در سیستم ما وارد شده است یا خیر. برای انجام اینکار میتوانیم از Session ها استفاده کنیم.
Session چیست؟
اگر بخواهیم Session ها را تعریف کنیم، میتوانیم بگوییم:
Session اطلاعاتی هستند که روی مرورگر کاربر [به صورت موقتی] ذخیره میشوند و میتوانند چیزهایی را برای ما به خاطر بسپارند.
در اینجا ما میخواهیم با استفاده از Session ها، به مرورگرمان بفهمانیم که این کاربر قبلا در سیستم ما وارد شده است و نیازی نیست که به او فرم ورود یا ثبت نام را نشان دهی.
برای کار با Session ها ۲ کار باید انجام دهیم:
- در ابتدا تابع ()session_start را صدا بزنیم
- و سپس با استفاده از کد زیر، یک Session تعریف کنیم:
$_SESSION['test'] = 'This is test session';
برای مثال در کد بالا، ما یک Session با نام test و محتویات This is test session ساختهایم.
نکتهی بسیار مهم: مراقب باشید که قبل از کار با session ها، حتما تابع ()session_start را صدا بزنید. اگر اینکار را نکنید، Session های شما به درستی کار نمیکنند.
برای اینکه فراموش نکنیم که قبل از کار با Session ها، حتما تابع ()session_start را صدا بزنیم، این تابع را درون فایل db.php قرار میدهیم. و چون فایل db.php ما در بالای همهی فایل هایمان require_once شده است، این تابع را نیز در آن قرار میدهیم. پس فایل db.php ما بصورت زیر تغییر میکند:
<?php $db = mysqli_connect('localhost','yadify','12345','yadify_users'); session_start(); ?>
یک نکتهی تکمیلی دربارهی Session ها:
Session ها تا زمانی که مرورگر کاربر باز است، قابل دسترسی هستند. برای مثال اگر ما یک Session با نام test بسازیم، این Session تا زمان باز بودن مرورگر کاربر وجود دارد و میتوان از آن استفاده کرد. اما اگر کاربر مرورگر خودش را بصورت کامل ببندد، این Session نیز از بین میرود و دیگر اعتبار ندارد.
توجه کنید. که مرورگر باید بسته شود که Session ها از بین بروند، نه یک تب (tab) از مرورگر.
استفاده از Session ها برای تکمیل سیستم ورود
برای اینکه بتوانیم سیستم ورود خود را تکمیل کنیم، باید از Session ها استفاده کنیم. برای انجام اینکار، وقتی که ایمیل و رمز کاربر را در دیتابیس پیدا کردیم، یک Session را در مرورگر کاربر ذخیره میکنیم و مقدار این Session را برابر ایمیل کاربر قرار میدهیم. برای اینکار فایل do-login.php ما بصورت زیر تغییر پیدا میکند.
<?php require_once 'db.php'; $email = $_POST['email']; $password = md5($_POST['password']); $check = mysqli_query($db, "SELECT * FROM users WHERE email='$email' AND password='$password'"); if(mysqli_num_rows($check) > 0){ // این یک نقطه نیست و عدد صفر میباشد. $_SESSION["loggedin"] = $email; header("Location: ../profile.php"); }else{ echo 'you do not registered yet'; } ?>
در خط ۹ از این فایل، یک Session با نام loggedin و با محتویات ایمیل کاربر ساختهایم. در این به بعد، اگر شخصی اقدام به ورود به سیستم ما کند، یک Session با نام loggedin و با ایمیل خودش برای او ساخته میشود و در مرورگر او ذخیره میشود و سپس در خط ۱۰ به فایل profile.php هدایت میشود. زیرا میخواهیم که کاربر اگر ورود موفقیت آمیزی داشت، بتواند پروفایل خود را ببیند.
نشان ندادن پروفایل به کاربرانی که وارد سیستم نشدهاند
یک کار دست و اصولی این است که پروفایل کاربری یعنی همان فایل profile.php را به کاربرانی که در سیستم ما لاگین نکردهاند نشان ندهیم. برای اینکار از Session ها استفاده میکنیم.
همانطور که گفتیم هنگام ورود کاربر یک Session با نام loggedin برای کاربر ساخته میشود. پس اگر یک Session با نام loggedin وجود داشت، یعنی کاربر به سیستم ما وارد شده است، و اگر وجود نداشت، یعنی وارد نشده است.
ما با استفاده از تابع ()isset میتوانیم بررسی کنیم که یک Session تعریف شده است یا خیر. برای مثال به کد زیر دقت کنید:
if(isset($_SESSION['loggedin'])){ echo 'yes'; }
در کد بالا چک کردهایم که اگر یک Session با نام loggedin تعریف شده بود، برای ما عبارت yes را چاپ کند. حالا اگر بخواهیم بگوییم که اگر یک Session تعریف نشده بود چه کاری باید انجام دهیم؟ میتوانیم برای همین شرط if که در بالا نوشتهایم، یک بخش else نیز به این صورت بنویسیم:
if(isset($_SESSION['loggedin'])){ echo 'yes'; }else{ echo 'no'; }
اما برای چک کردن تعریف نشدن یک Session راه بهترین نیز وجود دارد. کد زیر را مشاهده کنید:
if(!isset($_SESSION['loggedin'])){ echo 'no'; }
در کد بالا ما قبل از تابع ()isset یک علامت تعجب (!) قرار دادیم. این علامت تعجب شرط if را به این صورت تغییر میدهد: اگر یک Session با نام loggedin تعریف نشده بود، عبارت no را چاپ کن.
حالا برای اینکه صفحهی profile.php را به کاربرانی که وارد سیستم نشدهاند نشان ندهیم، کافی است که کدهای زیر را در صفحهی profile.php بنویسیم:
<?php require_once 'engine/db.php'; if(!isset($_SESSION['loggedin'])){ header('Location: login.php'); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>پروفایل شما</title> </head> <body> <h2>خوش آمدید مهدی عزیز</h2> <a href="#">خروج از حساب کاربری</a> </body> </html>
در خط های ۳ تا ۵ گفتهایم که اگر یک Session با نام loggedin تعریف نشده بود، به این معنا است که کاربر وارد سیستم نشده است و به همین دلیل کاربر را با تابع ()header به فایل login.php هدایت میکنیم که ابتدا لاگین کند که بتواند صفحهی پروفایل خود را ببیند.
عدم نمایش صفحهی ورود و ثبت نام به کاربرانی که وارد شده اند
حالا میخواهیم برعکس کار بالا را انجام دهیم. یعنی به کاربرانی که وارد سیستم ما شدهاند و لاگین کردهاند، صفحات login.php و register.php را نشان ندهیم. و اگر درخواست ورود به این صفحات را داشتند، آنها را به صفحهی پروفایل خود هدایت کنیم، زیرا کسی که قبلا وارد سیستم شده است، دلیلی ندارد که بتواند صفحهی ورود و ثبت نام را ببیند.
برای انجام اینکار، کد زیر را به اول دو فایل login.php و reigster.php اضافه میکنیم:
if(isset($_SESSION['loggedin'])){ header('Location: profile.php'); }
در این کد چک کردهایم که اگر یک Session با نام loggedin تعریف شده بود، یعنی کاربر قبلا در سیستم وارد شده و او را به صفحهی profile.php هدایت میکنیم.
برنامه نویسی بخش خروج از پروفایل
حالا ممکن است یک کاربر بخواهد از سیستم خارج شود و یا یک اکانت دیگر بسازد و یا با اکانت دیگری وارد شود. برای اینکار فقط کافی است که Session ـی که در قبل ساخته بودیم را پاک کنیم. برای انجام اینکار، در صفحهی profile.php یک لینک داشتیم که آنرا به صفحهی logout.php لینک میدهیم و همینطور فایل logout.php را در کنار فایل های login.php و… میسازیم:
<a href="logout.php">خروج از حساب کاربری</a>
حالا وارد فایل logout.php میشویم و کدهای زیر را در آن مینویسیم:
<?php session_start(); unset($_SESSION['loggedin']); header('Location: login.php'); ?>
در خط ۲، تابع ()session_start را صدا میزنیم. چون دیگر در این فایل، اقدام به require_once کردن فایل db.php نکردهایم، زیرا کاری با دیتابیس نمیخواهیم انجام دهیم.
در خط ۳ با استفاده از تابع ()unset اقدام به پاک کردن Session که ساخته بودیم کردهایم و در خط ۴ نیز کاربر را به صفحهی login.php هدایت کردهایم.
حالا اگر کسی در صفحهی پروفایل خود روی دکمهی خروج کلیک کند، Session که با نام loggedin تعریف شده بود پاک میشود و هدایت میشود به صفحهی login.php. در ابتدای صفحهی login.php چک میشود که آیا Session با نام loggedin تعریف شده است یا نه، و چون این Session در فایل logout.php بصورت کامل پاک شده است، کاربر دوباره میتواند فایل login.php یا register.php را مشاهده کند و اقدام به ورود یا ساخت حساب کاربری جدید کند.
نمایش نام کاربر در صفحهی پروفایل
اخرین کاری که میخواهیم انجام دهیم، این است که نام کاربر را در صفحهی پروفایل به او نشان دهیم.
اگر یادتان باشد، در قسمت تعریف Session، ما مقدار Session را برابر ایمیل کاربر گذاشتیم.
الان تنها کاری که باید بکنیم این است که در دیتابیس، نامی که برای ایمیل کاربر ذخیره شده است را به او نشان دهیم.
برای اینکار، فایل profile.php ما به این صورت تغییر میکند:
<?php require_once 'engine/db.php'; if(!isset($_SESSION['loggedin'])){ header('Location: login.php'); } $user_email = $_SESSION['loggedin']; $sql = mysqli_query($db, "SELECT * FROM users WHERE email='$user_email'"); $fetch = mysqli_fetch_array($sql); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>پروفایل شما</title> </head> <body> <h2>خوش آمدید <?php echo $fetch['display_name']; ?> عزیز</h2> <a href="logout.php">خروج از حساب کاربری</a> </body> </html>
در خط ۶ ما مقدار Session که برابر ایمیل کاربر است را درون متغیر user_email قرار دادهایم.
در خط ۷، یک دستور sql نوشتیم با این مفهوم که «که هر چیزی که در جدول users با ایمیل کاربر پیدا کرد را برای ما در متغیر sql ذخیره کن»
در خط ۸، چیزهایی که از دیتابیس گرفتهایم با تابع ()mysqli_fetch_array به یک آرایه تبدیل کردهایم و در متغیر fetch ذخیره کردهایم.
و نهایتا در خط ۱۹، با اسفتاده از آرایه ها، اقدام به چاپ کردن نام کاربر کردهایم. display_name نام همان ستونی در دیتابیس است که نام کاربر را در آن ذخیره کردهایم.
در زیر میتوانید سورس کد کامل شدهی این پروژه به همراه فایل دیتابیس (SQL) را دانلود کنید:
دانلود سورس کد پروژه + فایل SQL
اما در استفاده از سورس کد مراقب باشید که درگیر کپی/پیست کردن کدها نشوید، زیرا با اینکار هیچ چیز یاد نمیگیرید. سعی کنید تا جایی که میتوانید کدها را خودتان بنویسید و اگر جایی حس کردید که نیاز به کمک دارید، یک نگاه روی کدها بیندازید و دوباره نوشتن کدها توسط خودتان را ادامه دهید. روش صحیح استفاده از سورس کد ها به این صورت است.
پایان کار
خب نهایتا موفق شدیم که یک سیستم ورود، ثبت نام و پروفایل کاربری را با PHP و MySQL بسازیم. خوشحالیم که شما را در کنار خودمان در این آموزش داشتیم.
لطفا اگر این آموزش برایتان مفید بود، آنرا با اشخاصی که فکر میکنید به آن نیاز دارند به اشتراک بگذارید و اجازه دهید محتوای آموزشی با کیفیت به دست همهی علاقمندان برسد و همه بتوانند به دانش و تخصص خود اضافه کنند.
برای مشاهدهی قسمت های دیگر این آموزش میتوانید از لینک های زیر استفاده کنید:
- قسمت اول: آموزش کامل ساخت سیستم ثبت نام با PHP
- قسمت دوم: آموزش کامل ساخت سیستم ورود با PHP
- قسمت سوم: آموزش کامل ساخت پرفایل کاربری با PHP (همین آموزش)
درباره مهدی خسروی
۸ سال پیش که یادگیری برنامه نویسی رو آغاز کردم، با یک مشکل بزرگ مواجه شدم: کمبود منابع آموزشی حرفهای و کاربردی به زبان فارسی. به همین دلیل، بعد از چندین سال فعالیت حرفهای در زمینهی برنامه نویسی، تصمیم گرفتم دانستهها و تجربیات خودم را با شما عزیزان به اشتراک بگذارم. پیشنهاد میکنم به آدرس yadify.com/gifts حتما سر بزنید :)
نوشته های بیشتر از مهدی خسرویمطالب زیر را حتما مطالعه کنید
14 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
دیدگاهتان را بنویسید لغو پاسخ
این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
مرسی هسی
سلام تشکر بابت کد
چطور میشه فیلد افزودن عکس رو اضافه کرد؟
سلام محمد عزیز
برای اینکار باید یاد بگیرید که چطور با فایل ها و اپلود اونها در php کار کنید. این مورد رو در آموزش ساخت فروشگاه اینترنتی با PHP-MySQL بصورت کامل آموزش دادیم.
عالی ترین سایت آموزشی
با سلام
لطفا آموزش همین سیستم را با pdo و کلاسهای php قرار دهید.
باتشکر
سلام علی عزیز. حتما. مرسی از شما
مطالبی که ارائه فرمودید کامل و با بیانی قابل فهم بود. آرزوی موفقیت برای جنابعالی
عالی بود
سلام تابع mysqli_num_rows() نمیدونم چرا تو کامپیوترم ندارمش یه چیز دیگ mysql_num_rows() چرا میگه منقضی شده؟
سلام محمد حسین عزیز
mysql_num_rows مربوط به نسخههای قدیمی PHP بوده و در نسخههای جدید منسوخ شده. متوجه بخش اول سوال شما هم نشدم. احتمالا مشکل از سمت wampp/xamp شما هست
آموزش عالی بود ممنون بابت آموزش خوب ومفید
خیلی عالی بود این اموزش
ممنون
ممنون از آموزش خیلی خوبتون!
عالی بود!!!