دسته بندی
دسترسی سریع
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
سشن (Session) یا نشست چیست و چه کاربردی دارد؟
ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعات
ایجاد فولدری با نام php-mysql-signin
تنظیم اطلاعات اتصال به دیتابیس در فایل config.php
فرم HTML جهت ورود و خروج در فایل index.php
بررسی وضعیت ورود کاربر با فایل login.php
برقراری نشست (Session) در پنل کاربری با فایل panel.php
پایان نشست و خروج از سایت با فایل logout.php
دانلود نمونه فایل های آموزش
سشن (Session) یا نشست چیست و چه کاربردی دارد؟
ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعات
ایجاد فولدری با نام php-mysql-signin
تنظیم اطلاعات اتصال به دیتابیس در فایل config.php
فرم HTML جهت ورود و خروج در فایل index.php
بررسی وضعیت ورود کاربر با فایل login.php
برقراری نشست (Session) در پنل کاربری با فایل panel.php
پایان نشست و خروج از سایت با فایل logout.php
دانلود نمونه فایل های آموزش
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL

در مطلب قبل از بخش آموزش کاربردی PHP و MySQL با نحوه برنامه نویسی سیستم ساده عضویت کاربران در سایت آشنا شدیم، فرم HTML جهت ورود اطلاعات کاربران را نیز با چند فیلد شامل نام کاربری و کلمه عبور جهت نمونه ساختیم و در سمت سرور با کدنویسی PHP داده ها را کنترل و در نهایت در دیتابیس ذخیره کردیم، اکنون در این آموزش می خواهیم کار را با ساخت فرم ورود و خروج تکمیل کنیم تا کاربران پس از ثبت نام در سایت بتوانند به محیط مدیریت وارد شده و از امکانات پنل کاربری شخصی خود استفاده کنند، در این مطلب خواهیم دید که مبحث مربوط به نشست ها (سشن یا Session) برای ایجاد فرم ورود و خروج تا چه میزان اهمیت دارد و با نحوه اعمال تنظیمات سفارشی مربوط به آن بیشتر آشنا خواهیم شد.
سشن (Session) یا نشست چیست و چه کاربردی دارد؟
قبل از اینکه به کدنویسی کار بپردازیم لازم است نگاهی داشته باشیم به اینکه چرا باید در فرآیند ورود و خروج از سشن (Session) یا نشست استفاده کنیم، اصلا این اصطلاح به چه معنی است و چه کاربردی دارد؟
برای درک صحیح مطلب اجازه دهید با یک مثال موضوع را شرح دهیم، فرض کنیم می خواهیم وارد یک نمایشگاه بزرگ کتاب با غرفه های متعدد شویم و برای این کار از قبل در سیستم نمایشگاه اطلاعاتمان را وارد و ثبت نام کرده ایم، در قسمت ورودی نمایشگاه پس از ارائه مدارک شناسایی و در صورت انطباق صحیح نام کاربری و کلمه عبور با اطلاعات موجود در دیتابیس افراد ثبت نام شده، برگه ای با شماره کد اختصاصی و تاریخ انقضاء مشخص به ما تعلق می گیرد که برای ورود به غرفه های گوناگون باید آن را ارائه کنیم (برگه را سشن، کد اختصاصی را همان مقدار سشن و غرفه ها را صفحات یک سایت فرض می کنیم)، در هر ورود به غرفه ها نیز صحت سشن و مدت اعتبار آن بررسی و در صورت تائید با مدت اعتبار جدید به روزرسانی می شود، بر همین روال و با توجه به سیاست های مدیریت ممکن است بعد از خروج از نمایشگاه دیگر نتوانیم با آن برگه وارد شویم (اعتبار برگه منقضی شود) و یا بعد از گذشت چند دقیقه یا چند ساعت اگر وارد هیچ غرفه ای نشده باشیم این اتفاق رخ دهد و مجبور به گرفتن برگه جدید از قسمت ورودی نمایشگاه شویم، حال اگر این برگه که روی آن کد اعتباری ما در مراجعه فعلی به نمایشگاه درج شده است به هر دلیل دریافت نشود یا از بین برود غرفه ها نمی توانند هویت ما را شناسایی کنند و لذا ممکن است اجازه دسترسی به خدماتشان را ندهند.
مشابه همین حالت به نوعی در سایت های وب در مورد بحث نشست یا سشن (Session) اتفاق می افتد، با اجرای هر درخواست ورود و در صورت تائید اطلاعات (معمولا شامل نام کاربری و کلمه عبور) برنامه فایلی با مقدار متنی اختصاصی برای هر کاربر در سرور و همچنین در مرورگر او ایجاد می کند (به فایلی که در سرور ایجاد می شود فایل سشن و به فایلی که در مرورگر ایجاد می شود کوکی گفته می شود) تا در هر بار درخواست صفحات سایت مرورگر مقدار کوکی را ارسال کرده و برنامه با تطبیق اطلاعات ارسالی با مقدار سشن بررسی کند که آیا کاربر مورد نظر دارای اعتبار لازم برای استفاده از صفحه درخواستی می باشد یا خیر، گفتیم این اعتبار در صورتی به کاربر تعلق می گیرد که او نام کاربری و کلمه عبور را به طور صحیح وارد کرده باشد و متغیرهای سشن مربوط به آن نام کاربری در سمت سرور از قبل تنظیم شده و دارای اعتبار باشند (به فرض نشست منقضی نشده یا کاربر از سیستم خارج نشده باشد).
هر نشست در PHP به صورت پیش فرض تا 24 دقیقه اعتبار دارد و اگر در این مدت کاربر هیچ صفحه ای را فراخوانی نکند باید مجددا وارد سایت شود، با فراخوانی هر صفحه مدت اعتبار نشست برای 24 دقیقه دیگر تمدید خواهد شد، این حالت را می توانیم تغییر دهیم که در این خصوص در آموزش بعد مفصل توضیح خواهیم داد.
ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعات
کاربران برای ورود به پنل مدیریت ابتدا باید در سایت ثبت نام کرده باشند که در آموزش قبل در این خصوص به صورت اختصاصی صحبت کردیم، لذا در این مطلب جهت جلوگیری از تکرار مباحث گذشته از توضیح دوباره بخش ثبت نام خودداری می کنیم، در صورتی که آموزش قبل را مطالعه نکرده اید لطفا ابتدا با پیروی از مطالب آموزش مندرج در آدرس زیر، دیتابیس، جدول و ستون ها را ساخته و نمونه اطلاعات اولیه را در آن وارد نمائید:
آموزش ساخت فرم عضویت در سایت با PHP و MySQL
پس از ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعات اولیه، ساز و کار لازم برای ایجاد مرحله ورود اعضاء به پنل مدیریت فراهم می شود.
ایجاد فولدری با نام php-mysql-signin
برای تجمیع و مدیریت ساده تر فایل های سیستم پنل ورود و خروج سایت بهتر است یک دایرکتوری مجزا در نظر بگیریم، در این آموزش فولدری با نام دلخواه php-mysql-signin ساخته ایم که در مجموع چند فایل و فولدر زیر را شامل می شود:
- فایل config.php، حاوی اطاعات اتصال به دیتابیس.
- فایل index.php، فرم HTML ورود به پنل مدیریت و ترکیب آن با دستورات PHP.
- فایل login.php، بررسی معتبر بودن اطلاعات ارسالی کاربران و انتقال به پنل مدیریت.
- فایل panel.php، پنل مدیریت کاربران سایت.
- فایل logout.php، انقضای کامل نشست و خروج از پنل مدیریت.
- فولدر lib، شامل فایلی با نام password_compat.php جهت استفاده از قابلیت های توابع جدید کلمه عبور در نسخه 5.5 و قدیمی تر PHP.
در ادامه با جزئیات این فایل ها را بررسی می کنیم.
تنظیم اطلاعات اتصال به دیتابیس در فایل config.php
برای اتصال به دیتابیس نیاز به تنظیم چند پارامتر در تابع mysqli_connect است که شامل نام سرور، نام کاربری دیتابیس، کلمه عبور دیتابیس و در نهایت عنوان دیتابیس است، برای تجمیع این موارد و استفاده چندباره از تنظیمات پیکربندی در صفحات مختلف معمولا از فایل Configuration استفاده می شود که در این آموزش نیز بر همین اساس اطلاعات را در فایلی با نام دلخواه config.php به صورت نمونه زیر قرار داده ایم:
<?php
//تنظیمات اتصال به دیتابیس
$config = array(
'host' => 'localhost',
'db_user' => 'نام کاربری دیتابیس',
'db_pass' => 'کلمه عبور دیتابیس',
'db_name' => 'نام دیتابیس'
);
?>
این فایل جهت نمونه است و باید مطابق با اطلاعات دیتابیسمان تکمیل شود.فرم HTML جهت ورود و خروج در فایل index.php
مشابه آنچه در آموزش مربوط به ساخت فرم عضویت در سایت با PHP و MySQL دیدیم برای ورود به پنل مدیریت هم به فرم HTML جهت دریافت نام کاربری و کلمه عبور اعضاء نیازمندیم، البته اگرچه این فرم به صورت HTML است اما بهتر است پسوند فایل را به صورت php ذخیره کنیم چون به دلیل کار با سشن و دریافت اطلاعات از کاربر و به فرض نمایش پیام در حالت ورود و خروج از پنل سایت به کدنویسی PHP نیاز خواهیم داشت، به هر صورت ابتدا فرم زیر را در فایلی با پسوند php و نام دلخواه index.php ایجاد می کنیم:
<?php
if(!isset($check)){
$text = null;
$username = null;
}
?>
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | فرم HTML ورود کاربر به پنل مدیریت سایت</title>
<!-- Webgoo.ir -->
<style>
body{
font-family:Tahoma, Geneva, sans-serif;
direction:rtl;
font-size:12px;
line-height: 22px;
}
.error{
height: 30px;
width: 100%;
color: #dd000a;
}
</style>
</head>
<body>
<?php echo $text; ?>
<form action="login.php" method="post">
<label for="user">نام کاربری:</label>
<input name="username" id="user" type="text" value="<?php echo $username; ?>" maxlength="255" dir="ltr">
<label for="pass">کلمه عبور:</label>
<input name="password" id="pass" type="password" maxlength="255" dir="ltr">
<input name="check" type="hidden" value="1">
<input type="submit" value="ورود به پنل">
</form>
<hr>
- قبل از ورود کاربر به پنل مدیریت سایت ابتدا باید اطلاعات اتصال به دیتابیس را در فایل config.php در آرایه config تعریف کرده باشیم، نام کاربری در لوکال هاست معمولا root و بدون کلمه عبور است.<br>
- اجرای صحیح این کد مستلزم ساخت دیتابیس، جدول، ستون ها و درج نمونه اطلاعاتی است که در آموزش نحوه ساخت فرم عضویت سایت توضیح داده ایم (در صورتی که این آموزش را مطالعه نکرده اید لطفا به بخش آموزش های کاربردی MySQL مراجعه کنید).<br>
- دقت کنیم برای رمزنگاری کلمه عبور در مرحله عضویت کاربر از تابع password_hash استفاده کرده ایم، این تابع از نسخه PHP 5.5 در دسترس است، برای سازگاری نسخه های قدیمی تر کتابخه password_compat به کدها اضافه شده است.<br>
</body>
</html>
توضیح:- دو فیلد اصلی در فرم ورود با نام های username و password مشخص شده اند، فیلد مربوط به کلمه عبور از نوع password است تا کلمه عبور کاربر به شکل حفاظت شده و مخفی وارد شود.
- اطلاعات این فرم به فایلی با نام دلخواه login.php و با متد POST ارسال می شود، با توجه به آدرس دهی قسمت action فرم این فایل باید در کنار فایل index.php قرار داشته باشد.
- فیلد مخفی با نام فرضی check جهت اطمینان از ارسال فرم ورود توسط کاربر است.
- تکه کدهای PHP استفاده شده در این فایل هماهنگ با سایر فایل هایی هستند که در ادامه بررسی خواهیم کرد.
بررسی وضعیت ورود کاربر با فایل login.php
پس از اینکه کاربر اطلاعات خود را در فرم ورود وارد کرده و بر روی دکمه ارسال کلیک می کند، داده ها شامل نام کاربری و کلمه عبور در سرور و کدهای PHP دریافت می شوند، در این مرحله برای اینکه کاربر دسترسی مجاز به پنل کاربری داشته باشد مقادیر ارسالی باید با آنچه که در دیتابیس سرور وجود دارد تطبیق داده شوند، به طور معمول این تطبیق با برنامه نویسی PHP و MySQL انجام می شود که این کار در نمونه کد زیر هماهنگ با فرم عضویتی که در آموزش قبل ساختیم انجام شده است:
<?php
//شروع نشست
session_name('panel');
session_start();
//پیش فرض
$_SESSION['access'] = false;
$_SESSION['user'] = null;
$error = 0;
$text = null;
//فایل تنظیمات اتصال به دیتابیس
include_once('config.php');
//تعریف توابع کلمه عبور در نسخه های پائین تر از PHP 5.5
if(!function_exists('password_hash')) {
include_once('lib/password_compat.php');
}
//دریافت و تعریف متغیرها
@$username = $_POST['username'];
@$password = $_POST['password'];
@$check = $_POST['check'];
/* بررسی معتبر بودن اطلاعات ارسالی کاربر در صورت ارسال فرم */
if($check == 1) {
//نام کاربری
if(!isset($username) || empty($username)) {
$error = 1;
$text = "نام کاربری خود را وارد کنید!";
} //کلمه عبور
elseif(!isset($password) || empty($password)) {
$error = 1;
$text = "کلمه عبور خود را وارد کنید!";
}
//بررسی خطا
if($error === 0) {
//اتصال به دیتابیس
$conn = mysqli_connect($config['host'], $config['db_user'], $config['db_pass'], $config['db_name']);
if(!$conn) {
echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else {
//ایمن سازی پارامترها
$username = mysqli_real_escape_string($conn, $username);
//نام جدول
$tbl_name = "users";
//اانتخاب اطلاعات از جدول و ستون
$sql = "SELECT `password` FROM $tbl_name WHERE `username` = '$username' LIMIT 1";
$query = mysqli_query($conn, $sql);
if(!$query) {
echo "Selecting From Table $tbl_name: Error! " . mysqli_error($conn) . '<br>';
} else {
//تعداد ردیف های انتخاب شده
$count = mysqli_num_rows($query);
if($count === 0) {
$error = 1;
$text = "نام کاربری یا کلمه عبور اشتباه است!";
} else {
while($row = mysqli_fetch_array($query)) {
$db_hashed_password = $row['password'];
//تطبیق کلمه عبور
if(password_verify($password, $db_hashed_password)) {
$_SESSION['access'] = true;
$_SESSION['user'] = $username;
header("Location: panel.php");
exit;
} else {
$error = 1;
$text = "نام کاربری یا کلمه عبور اشتباه است!";
}
}
}
}
}
//پایان اتصال
mysqli_close($conn);
}
}
//بارگذاری مجدد فرم ورود در صورت بروز خطا یا فراخوانی مجدد
if($check != 1 || $error == 1) {
if($error == 1) {
$text = '<div class="error">' . $text . '</div>';
}
include_once('index.php');
}
?>
دقت کنیم این آموزش هماهنگ با ساختار ایجاد شده در آموزش قبلی است.توضیح:
- اگر بخواهیم نام سشن و کوکی به صورت سفارشی و دلخواه تنظیم شود می توانیم با تابع session_name این کار را انجام دهیم، در غیر اینصورت مفسر PHP به صورت پیش فرض از نام PHPSESSID برای سشن و کوکی استفاده خواهد کرد.
- در گام دوم با تابع session_start یک نشست یا سشن را برای ورود فعلی تعریف می کنیم، دقت کنیم که این تابع باید قبل از ارسال هر نوع خروجی به مرورگر تنظیم شود در غیر اینصورت خطای
Warning: Cannot modify header information - headers already sent...
دریافت خواهیم کرد.- در مرحله بعد متغیرهای پیش فرض برنامه را با مقادیر اولیه تعریف می کنیم.
- با توجه به اینکه توابع مربوط به رمزنگاری و تطبیق کلمه عبور (password_hash و password_verify) در نسخه های قدیمی PHP در دسترس نیستند، از کتابخانه جایگزین password_compat بدین منظور استفاده کرده ایم تا برنامه با این نسخه ها نیز سازگار باشد.
- مقادیر ارسالی کاربر از فرم را در متغیرهایی دریافت می کنیم تا در ادامه کدها از این اطلاعات استفاده کنیم، در اینجا توجه به پارامتر نام (name) فیلدهای input اهمیت زیادی دارد، چرا که متغیرها و مقادیر آنها بر اساس نام فیلد و متد POST مقداردهی می شوند.
- قسمت مربوط به متغیر check برای اطمینان از ارسال فرم توسط کاربر درنظر گرفته شده است، نوع input به صورت hidden یا مخفی است و جلوه ظاهری ندارد اما با ارسال فرم مقدار 1 به سرور ارسال می شود که با این شیوه می توانیم بین دو حالت ارسال و عدم ارسال فرم در کدهای PHP تفاوت قائل شویم.
- برای اعتبارسنجی مقادیر ارسال شده از فرم ورود از دستورات شرطی if و elseif و توابع isset (بررسی وجود یک متغیر) و empty (بررسی خالی نبودن مقدار متغیر) استفاده کرده ایم.
- سپس اتصال به پایگاه داده را با توجه به اطلاعات موجود در فایل config.php برقرار می کنیم، برای سرور مجازی یا لوکال هاست معمولا از نام کاربری root و بدون پسورد استفاده می شود، نام پایگاه داده نیز بستگی به خودمان و دیتابیسی دارد که پیشتر ساخته ایم (در آموزش های مقدماتی MySQL دیدیم که دیتابیس را هم می توانیم با کدهای PHP و هم به صورت دستی در برنامه phpMyAdmin بسازیم).
- بعد از برقراری اتصال به پایگاه داده باید متغیر نام کاربری را با تابع mysqli_real_escape_string ایمن سازی کنیم تا از برنامه در مقابل نفوذ احتمالی به پایگاه داده حفاظت کرده باشیم، البته یادآور می شویم تابع عنوان شده صرفا جهت نمونه و برای کاربردهای متداول است، در صورت لزوم می توانیم از روش های پیشرفته تری مانند Prepared Statement و Bind Param نیز برای افزایش ضریب امنیت استفاده کنیم.
- با دستور SELECT بررسی می کنیم تا ببینیم آیا کاربری با این مشخصات در دیتابیس برنامه وجود دارد یا خیر، اگر تعداد فیلدهای انتخاب شده برابر با 0 باشد (mysqli_num_rows تعداد ردیف های نتایج یک پرس و جو را برمی گرداند)، پس چنین کاربری وجود ندارد و پیغام خطا نمایش داده می شود، در غیر اینصورت اگر مقادیر 1 برگردانده شود این نام کاربری وجود دارد و وارد مرحله تطبیق کلمه عبور می شویم.
- اگر کاربر مشخصات را صحیح وارد کرده و تطبیق با تابع password_verify صحیح (true) باشد دو متغیر از نوع SESSION تنظیم می کنیم، مقادیر access جهت تعیین وضعیت دسترسی مجاز یا غیرمجاز و مقادیر user نام کاربری را در خود نگهداری می کند (در تابع password_verify آرگیومنت اول مقدار خام کلمه عبور دریافتی از فرم ورود و آرگیومنت دوم کلمه عبور رمزی شده ای است که قبلا در مرحله ثبت نام در دیتابیس درج کرده ایم).
- متغیرهای نوع SESSION به صورت سراسری (Superglobal) هستند و بین صفحات مختلف در هر قسمت از برنامه می توانیم به مقدار آنها دسترسی داشته باشیم.
- در صورت تطبیق اطلاعات و پس از تنظیم متغیرهای سشن، کاربر به صورت خودکار به پنل مدیریت هدایت می شود و در صورت عدم تطبیق پیغام خطا نمایش داده خواهد شد.
- در نهایت نیز اتصال به پایگاه داده را با تابع mysqli_close خاتمه می دهیم.
- در صورتی که کاربر فرم را ارسال نکرده یا فرم با خطا مواجه شود، فایل index.php را در انتهای کدهای فایل login.php وارد می کنیم تا فرم ورود نمایش داده شود، این ساز و کار به عنوان نمونه است و جنبه آموزشی دارد، قاعدتا با درک نحوه کار سشن و کوکی می توانیم ساختار سفارشی و مد نظر خودمان را داشته باشیم.
برقراری نشست (Session) در پنل کاربری با فایل panel.php
زمانی که کاربر با موفقیت وارد محیط کاربری برنامه (فایل panel.php) شد برای برقراری پیوسته نشست در هر صفحه از سایتمان که به صورت مستقل فراخوانی می شود باید از توابع session_name و session_start استفاده کنیم، همچنین در صفحاتی که نیاز به دسترسی مجاز به محتوا دارند باید بررسی کنیم و ببینیم که متغیر سشن access تنظیم شده و برابر مقدار true باشد که این کار را با شرط if و تابع isset انجام داده ایم.
فایل محیط کاربری را که در واقع فایل اصلی پنل کاربری برنامه است با نامی انتخابی و صرفا جهت نمونه به صورت panel.php نامگذاری کرده و نمونه کدهای زیر را در آن درج می کنیم:
<?php
//شروع نشست
session_name('panel');
session_start();
//بررسی متغیرهای نشست
if(isset($_SESSION['access']) && $_SESSION['access'] === true) {
echo 'Welcome To Control Panel!<br>User Name: ' . $_SESSION['user'];
echo ' [<a href="logout.php" title="Logout">Logout</a>]';
} else {
header("HTTP/1.1 403 Forbidden");
echo 'HTTP 403 Forbidden – Access Denied!';
exit;
}
?>
این نمونه کد ساختار کلی و اولیه پنل کاربری را نشان می دهد که شامل سه قسمت زیر است:- نام سشن، کوکی و شروع نشست با توابع session_name و session_start، این توابع باید قبل از ارسال هر نوع خروجی به مرورگر اجرا شوند، این خروجی حتی می تواند شامل کاراکترهای نامرئی BOM (مخفف Byte Order Mark) هم باشد که برای اطمینان بهتر است فایل ها با برنامه ++Notepade اجرا و از قسمت Encoding گزینه Encoding in UTF-8 without BOM را انتخاب و مجددا فایل را ذخیره کنیم.
- قسمت مربوط به بررسی وضعیت مجاز بودن دسترسی کاربر که با استفاده از تنظیم متغیر SESSION با نام access و مقدار true (دسترسی مجاز) و یا false (دسترسی غیرمجاز) تعیین می شود، این نوع متغیرها در صورت برقراری نشست در صفحات مختلف در دسترس هستند و می توانیم اطلاعات را از صفحه ای به صفحه دیگر به اشتراک بگذاریم، برای نمونه در اینجا متغیر SESSION با نام usre مقدار نام کاربری را در خود نگهداری می کند و می توانیم با دستور echo از آن خروجی بگیریم.
- در قسمت سوم در صورت عدم برقراری شرط if بخش else اجرا خواهد شد و با تنظیم کد خطای HTTP 403 با استفاده از تابع header دسترسی کاربر به مرورگر غیرمجاز اعلام می شود.
نکته 1: هر نشست در PHP به صورت پیش فرض تا 24 دقیقه اعتبار دارد و اگر کاربر در این فاصله صفحه را رفرش نکرده یا صفحه دیگری را فراخوانی نکند نشست جاری به صورت خودکار منقضی می شود، این تنظیمات از طریق فایل php.ini و همچنین ذخیره و به روزرسانی اطلاعات سشن در دیتابیس قابل تغییر است که در آموزش بعدی در این خصوص بیشتر خواهیم گفت.
نکته 2: این نمونه کد فقط یک ساختار ساده محیط کاربری است و جنبه آموزشی دارد، قاعدتا برنامه های کاربردی نیاز به کدنویسی بیشتر و تعریف امکانات متفاوتی دارند که هر کدام باید در جای خود آموزش داده شوند.
پایان نشست و خروج از سایت با فایل logout.php
اغلب کاربران در مرحله ای از کار نیاز به خاتمه نشست و خروج امن از پنل مدیریت سایت دارند که باید با ساز و کاری این امکان را فراهم کنیم، بدین منظور دو تابع session_unset (حذف متغیرهای نشست) و session_destroy (حذف کامل اطلاعات نشست از سرور) کاربرد دارند که در نمونه کد زیر در فایل logout.php استفاده شده اند:
<?php
//شروع نشست
session_name('panel');
session_start();
//منقضی کردن و حذف اطلاعات نشست
session_unset();
session_destroy();
//انتقال به صفحه ورود
header("Location: login.php");
exit;
?>
توضیح:- از تابع session_unset برای منقضی کردن متغیرهای سشن استفاده می کنیم، متغیرهای نشست در این ساختار شامل access و user هستند که با SESSION و به صورت آرایه تعریف شده اند، در واقع استفاده از این تابع مساوی با حالت زیر است:
$_SESSION = array();
- با تابع session_destroy فایل حاوی اطلاعات نشست از سرور حذف می شود و برای ورود مجدد، نیاز به ارسال نام کاربری و کلمه عبور است.فایل logout.php را هم از طریق لینک و هم با استفاده از فرم HTML و دکمه button یا input می توانیم فراخوانی کنیم:
<a href="logout.php" title="Logout">خروج</a>
<form action="logout.php" method="post">
<input type="submit" value="خروج">
</form>
توضیح:- این فرم صرفا فایل logout.php را فراخوانی می کند و با فراخوانی این فایل سشن به طور کامل منقضی می شود.
- با کمی آشنایی بیشتر با مبحث نشست ها در PHP می توانیم ایده های جالبی تعریف کنیم، به طور مثال پیام خوش آمد گویی و خروج به کاربر نمایش دهیم یا به فرض از مقادیری که در متغیر سشن user وجود دارد برای نمایش نام کاربری استفاده کنیم.
نکته: در نگاه اول مبحث مربوط به سشن ها ممکن است کمی پیچیده به نظر برسد به همین جهت در این مطلب به همین حد اکتفا می کنیم و در آموزش بعدی خواهیم دید که چگونه می توانیم امکانات جانبی بیشتری به فرم ورود و خروج سایت اضافه کنیم.
دانلود نمونه فایل های آموزش
برای جمع بندی کار می توانیم فایل هایی که در این آموزش بررسی کردیم را از لینک زیر دریافت کنیم:
دانلود نمونه فایل های آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
دسته بندی: آموزش کاربردی » MySQL

آموزش ساخت فرم عضویت در سایت با PHP و MySQL
صفحه بندی مطالب و محتوا با PHP و MySQL
ایجاد لینک دانلود مدت دار با PHP و MySQL
نحوه رسم چارت و نمودار آماری با PHP و MySQL
آموزش ساخت فرم تماس با PHP و MySQL
دیدگاه


۱۳:۲۹ ۱۳۹۳/۰۵/۳۰
سلام من میخوام یه پنل بسازم به نظر شما میتونم اگه میشه راهنمایم کنید من همیشه تبلیغ سایت شما را کرده ام ممنون میشم کمکم کنید
سوالتان خیلی مشخص نیست!
قاعدتا برای نوشتن یک پنل کاربردی باید سطوحی از برنامه نویسی وب را پشت سر گذاشته باشید و قبلا چند برنامه کوچکتر از این را کدنویسی کرده باشید، در این شرایط یک گام به جلو نهادن و نوشتن پنل دور از دسترس نیست، اما اگر بخواهید بدون داشتن علم و تجربه کار کنید، قاعدتا روند کار و نتیجه خیلی جالب نخواهد بود و در حین کار با سوالات و مشکلات مختلف روبرو شده که برای حل هر قسمت باید از این و آن سوال بپرسید!
پیشنهاد ما این است اگر فرصت و علاقه کافی دارید از ابتدا برنامه نویسی وب را فرا بگیرید.
قاعدتا برای نوشتن یک پنل کاربردی باید سطوحی از برنامه نویسی وب را پشت سر گذاشته باشید و قبلا چند برنامه کوچکتر از این را کدنویسی کرده باشید، در این شرایط یک گام به جلو نهادن و نوشتن پنل دور از دسترس نیست، اما اگر بخواهید بدون داشتن علم و تجربه کار کنید، قاعدتا روند کار و نتیجه خیلی جالب نخواهد بود و در حین کار با سوالات و مشکلات مختلف روبرو شده که برای حل هر قسمت باید از این و آن سوال بپرسید!
پیشنهاد ما این است اگر فرصت و علاقه کافی دارید از ابتدا برنامه نویسی وب را فرا بگیرید.
حامد
۱۷:۰۴ ۱۳۹۳/۰۵/۲۹
سلام ، تو فایل login.php چرا از @ استفاده شده و کلا این کاراکتر برای چی هست ؟
این علامت برای مواردی استفاده می شود که بخواهیم آگاهانه خطاهای یک متغیر (که معمولا از نوع Notice یا توجه بیشتر هستند) نادیده گرفته شده و در خروجی نمایش داده نشود، در اینجا اگر از @ استفاده نکنیم زمانی که فرم هنوز ارسال نشده، پیام عدم وجود مقدار برای متغیرها داده می شود.
Ali Zeus
۲۰:۵۴ ۱۳۹۳/۰۵/۲۸
با سلام
بله من echo میگیرم و خروجی همراه با اسلش echo میشه
// برای امنیت بیشتر...
با توجه به اسکریپت ای تی چت که نام رو بصورت
بسیار ممنون
بله من echo میگیرم و خروجی همراه با اسلش echo میشه
// برای امنیت بیشتر...
با توجه به اسکریپت ای تی چت که نام رو بصورت
$username = htmlspecialchars(str_replace("\\","/", preg_replace('/[\x00-\x1F]/', '', trim($username))), ENT_QUOTES, "UTF-8");
که حذف برخی کاراکتر های مخرب و اینکد HTML کردن برخی کاراکتر هایی مثل ' " وارد دیتابیس میکنه تا خطری نداشته باشه، من هم با همین روش نام ها رو از کاربر میگیرم و با انچه در دیتابیس موجود هست تطبیق میدم و برای محکم کاری در اخر از فانکشنی که ارائه دادین استفاده میکنمبسیار ممنون
Ali Zeus
۱۱:۳۳ ۱۳۹۳/۰۵/۲۸
سلام و خسته نباشید
ببخشید وقتی اطلاعات رو از کاربر میگیرم و از این فانکشن عبور میدم و در دیتابیس اینسرت میکنم یا اطلاعات کاربر رو اپدیت میکنم، کاراکتر مثلا " که تبدیل به \" میشه در دیتابیس بصورت " و بدون اسلش هست
ایا این عادیه و دیتابیس اون اسلش ها رو مخفی میکنه یا نتونستم بصورت صحیح از فانکشن استفاده کنم؟
ببخشید وقتی اطلاعات رو از کاربر میگیرم و از این فانکشن عبور میدم و در دیتابیس اینسرت میکنم یا اطلاعات کاربر رو اپدیت میکنم، کاراکتر مثلا " که تبدیل به \" میشه در دیتابیس بصورت " و بدون اسلش هست
ایا این عادیه و دیتابیس اون اسلش ها رو مخفی میکنه یا نتونستم بصورت صحیح از فانکشن استفاده کنم؟
escape($usernme)
واقعا ممنون و معذرت که زیاد سوال میپرسم و وقتتون رو میگیرمسوال خوبی است!
MySQL در نسخه های جدید به صورت هوشمندانه موارد ایمن شده را به حالت طبیعی برمی گرداند!
با این حال می توانید قبل از ثبت مقادیر در دیتابیس، با یک دستور echo ساده از ایمن شدن آنها اطمینان حاصل کنید.
MySQL در نسخه های جدید به صورت هوشمندانه موارد ایمن شده را به حالت طبیعی برمی گرداند!
با این حال می توانید قبل از ثبت مقادیر در دیتابیس، با یک دستور echo ساده از ایمن شدن آنها اطمینان حاصل کنید.
Ali Zeus
۰۲:۱۱ ۱۳۹۳/۰۵/۲۸
با سلام
واقعا ممنون
واقعا تنها سایتی هستید که دقیق، کامل و به بهترین شکل اموزش میدین و مشکلات مبتدیانی مثل بنده رو حل میکنید
بازم ممنون
واقعا ممنون
واقعا تنها سایتی هستید که دقیق، کامل و به بهترین شکل اموزش میدین و مشکلات مبتدیانی مثل بنده رو حل میکنید
بازم ممنون
Ali Zeus
۱۹:۲۶ ۱۳۹۳/۰۵/۲۷
با سلام
ببخشید باز هم مزاحم شدم
نام کاربری بعد از عبور از mysql_real_escape_string در دیتابیس شناسایی نمیشه. البته کد واسه چترومه
در ضمن نام کاربردی با فرم GET از کاربر گرفته میشه
بجای mysql_real_escape_string من از این چهار خط استفاده میکنم.... ایا برای امنیت دیتابیس همین هم کافیه؟
واقعا ممنون
ببخشید باز هم مزاحم شدم
نام کاربری بعد از عبور از mysql_real_escape_string در دیتابیس شناسایی نمیشه. البته کد واسه چترومه
"select * from db1_etchat_user where etchat_username = '".mysql_real_escape_string($username)."'")
مشکل از چیه؟در ضمن نام کاربردی با فرم GET از کاربر گرفته میشه
بجای mysql_real_escape_string من از این چهار خط استفاده میکنم.... ایا برای امنیت دیتابیس همین هم کافیه؟
$username=str_replace("'","",$username);
$username=str_replace("\"","",$username);
$username=str_replace("\\","",$username);
$username=str_replace(",","",$username);
اینا کار میکنن اما mysql_real_escape_string نام رو شناسایی نمیکنهواقعا ممنون
حل مشکل تابع نیاز به بررسی آنلاین دارد!
برای استفاده از یک تابع جایگزین می توانید از تابع زیر استفاده کنید:
برای استفاده از یک تابع جایگزین می توانید از تابع زیر استفاده کنید:
<?php
function escape($str){
$search = array("\\","\0","\n","\r","\x1a","'",'"');
$replace = array("\\\\","\\0","\\n","\\r","\Z","\'",'\"');
return str_replace($search, $replace, $str);
}
?>
نکته: اکستنشن MySQL قدیمی و منسوخ شده است، برای پروژه های جدید از اکستنشن MySQLi یا PDO استفاده کنید.H.Clean
۱۱:۱۳ ۱۳۹۳/۰۵/۲۶
سلام
من تمام کارایی که گفتید را کردم تمام مراحل هم بدون هیچ اروری پیش میره اما وقتی جدول را در دیتابیس چک می کنم هیچی وارد نشده و خالیه یعنی به بازدید کننده می گه ثبت نام شدید اما در حقیقت هیچی وارد دیتابیس نشده!!!
چیکار باید بکنم؟!
من تمام کارایی که گفتید را کردم تمام مراحل هم بدون هیچ اروری پیش میره اما وقتی جدول را در دیتابیس چک می کنم هیچی وارد نشده و خالیه یعنی به بازدید کننده می گه ثبت نام شدید اما در حقیقت هیچی وارد دیتابیس نشده!!!
چیکار باید بکنم؟!
قاعدتا در بخشی از کدهای شما اشتباهی وجود دارد! در صورت تمایل فایل خود را به ایمیل ما (موجود در بخش تماس) ارسال کنید تا بررسی گردد.
حامد
۰۳:۴۶ ۱۳۹۳/۰۵/۲۵
سلام و عرض ادب..
نحوه نوشتن متن در کنار آدرس بار (در كنار همين favicon) در php رو بهم ميگيد؟
مثلا اكنون در نوار آدرس بصورت پيشفرض اسم لاتين سايتم هست ، من ميخوام اسم سايتم رو جايگزين كنم؟
ممنونم از راهنماييتون
موفق باشيد
نحوه نوشتن متن در کنار آدرس بار (در كنار همين favicon) در php رو بهم ميگيد؟
مثلا اكنون در نوار آدرس بصورت پيشفرض اسم لاتين سايتم هست ، من ميخوام اسم سايتم رو جايگزين كنم؟
ممنونم از راهنماييتون
موفق باشيد
باید ببینید متن موجود در تگ title به چه ترتیبی خروجی داده می شود، در اکثر سیستم های مدیریت محتوای سایت، این متن از بخش تنظیمات به صورت "عنوان سایت" قابل تغییر است، اگر هم به سورس HTML سایت دسترسی دارید تگ title را ویرایش کنید.
الهام
۰۷:۵۲ ۱۳۹۳/۰۵/۱۲
سلام خیلی ممنون . موفق و پیروز باشید
ماه بیگم
۰۷:۵۰ ۱۳۹۳/۰۵/۱۲
سلام
ممنونم از این سرعتی که تو پاسخ دهی دارین. یعنی بخدا من از شما ممنونم.
میدونید من سه نوع کاربر دارم. ادمین. کارفرما و کارجو
صفحه ثبت نام کارفرما و کارجو متفاوته و از هم جداست. و خب مشخصات هم توی دو تا جدول جداست. ولی صفحه ی لاگین اینا یکیه. خب من چطوری نقش اینا رو از چند تا جدول بخونم؟
بعد این پروژه کاردانیه. فقط میخوام جمع شه که تحویل بدم.
php هم کار نکردم. بهترین راه حل به نظر شما برای حل این مشکل و مشکلی که در کامنت قبلی مطرح کردم ، چیه از نظر شما؟ ممنونم :)
ممنونم از این سرعتی که تو پاسخ دهی دارین. یعنی بخدا من از شما ممنونم.
میدونید من سه نوع کاربر دارم. ادمین. کارفرما و کارجو
صفحه ثبت نام کارفرما و کارجو متفاوته و از هم جداست. و خب مشخصات هم توی دو تا جدول جداست. ولی صفحه ی لاگین اینا یکیه. خب من چطوری نقش اینا رو از چند تا جدول بخونم؟
بعد این پروژه کاردانیه. فقط میخوام جمع شه که تحویل بدم.
php هم کار نکردم. بهترین راه حل به نظر شما برای حل این مشکل و مشکلی که در کامنت قبلی مطرح کردم ، چیه از نظر شما؟ ممنونم :)
متاسفانه بدون آشنایی با مباحث مقدماتی امکان پاسخگویی میسر نیست!
صرفا به عنوان یک راهنمایی می توانید در هنگام چک کردن وجود نام کاربری با دیتابیس از JOIN استفاده کرده و هر دو جدول را بررسی کنید، سپس با توجه به ستونی که نوع کاربر را تعیین می کند، یک دستور شرطی بنویسید که اگر به فرض کاربر سطح کارفرما بود، در Location تابع header آدرس مربوط به کارفرما قرار گیرد و اگر کارجو بود، در Location تابع header آدرس صفحه کارجو قرار گیرد.
صرفا به عنوان یک راهنمایی می توانید در هنگام چک کردن وجود نام کاربری با دیتابیس از JOIN استفاده کرده و هر دو جدول را بررسی کنید، سپس با توجه به ستونی که نوع کاربر را تعیین می کند، یک دستور شرطی بنویسید که اگر به فرض کاربر سطح کارفرما بود، در Location تابع header آدرس مربوط به کارفرما قرار گیرد و اگر کارجو بود، در Location تابع header آدرس صفحه کارجو قرار گیرد.
ماه بیگم
۲۲:۵۵ ۱۳۹۳/۰۵/۱۱
سلام حالتون چطوره
جسارتا من میخوام طرف لاگین میکنه با توجه به نقشی که داره به یک صفحه ی خاص خودش هدایت بشه.
الان چیکار کنم؟ کجای این کد باید این رو اعمال کنم و چطوری؟
از شما نهایت سپاسگزاری رو دارم.
سپاس
جسارتا من میخوام طرف لاگین میکنه با توجه به نقشی که داره به یک صفحه ی خاص خودش هدایت بشه.
الان چیکار کنم؟ کجای این کد باید این رو اعمال کنم و چطوری؟
از شما نهایت سپاسگزاری رو دارم.
سپاس
این سوال ارتباط مستقیمی به آموزش حاضر ندارد و باید از قبل با PHP کار کرده باشید، صرفا به عنوان یک راهنمایی باید با توجه به نقش کاربر (که می تواند به شیوه های مختلف تعریف شود)، در هنگامی که اطلاعات صحیح است، به فرض دستور switch case داشته باشید و برای هر نقش در دستور header location یک آدرس یا پارامتر خاص را تنظیم کنید.
شایان
۱۲:۲۳ ۱۳۹۳/۰۵/۱۱
اگر بخواهیم با بستن صفحه مرورگر از سایت خارج شود (logout) کجا باید کدش رو بنویسیم؟
امکان خروج با بستن صفحه مرورگر وجود ندارد، چون به این ترتیب معمولا نشست کاربر منقضی نمی شود، تنها با عدم تعیین زمان انقضاء برای سشن کوکی و بستن کامل برنامه مرورگر نشست منقضی می شود، البته ممکن است این رفتار در مرورگرهای مختلف متفاوت باشد؛ در هر صورت بحث سشن خیلی حساس است، صرف قرار دادن کد بدون درک مفهوم آن کفایت نمی کند و باید اطلاعات کافی در مورد آن داشته باشید.
sara
۲۲:۴۷ ۱۳۹۳/۰۴/۲۲
سلام
چرا در login هر چی کد رو می زنم تمام همه چی هم ست کردم ولی می زنه اطلاعات وارد شده صحیح نیست تو رو خدا کمکم کنین
چرا در login هر چی کد رو می زنم تمام همه چی هم ست کردم ولی می زنه اطلاعات وارد شده صحیح نیست تو رو خدا کمکم کنین
دقت کنید که مقدار کلمه عبور ذخیره شده در دیتابیس با md5 رمزی شده باشد، هنگام تطبیق نیز باید ابتدا با md5 رمزی شود، اگر این مشکل کار نبود، کدهایتان را به آدرس ایمیل (موجود در بخش تماس) ارسال کنید تا بررسی گردد.
نکته: آموزش و کدها به روزرسانی شدند (99/10/1).
نکته: آموزش و کدها به روزرسانی شدند (99/10/1).
محمد
۰۹:۳۴ ۱۳۹۳/۰۴/۲۲
یه سوال دیگه
این کد
و سوال دیگه اینکه تابع md5 چه فرقی با تابع mysql_real_escape_string داره؟ چرا یوزر را با mysql_real_escape_string و پسورد را با md5 هش کردید ؟
این کد
<script>
window.location = 'page.php' ;
</script>
با این کد header("location:page.php");
چه فرقی میکنه؟و سوال دیگه اینکه تابع md5 چه فرقی با تابع mysql_real_escape_string داره؟ چرا یوزر را با mysql_real_escape_string و پسورد را با md5 هش کردید ؟
- دو دستور بالا هیچ تفاوتی در نتیجه ندارند (هر دو کاربر را به صفحه دیگر منتقل می کنند) منتها اولی مربوط به جاوا اسکریپت و سمت کاربر و دومی مربوط به PHP و سمت سرور است.
- تابع mysqli_real_escape_string برای جلوگیری از نفوذ به دیتابیس است و اینکه رشته های متنی از کاراکترهای خطرناک برای دیتابیس (کاراکترهایی که می توانند نقش یک دستور مخرب را بازی کنند) ایمن سازی شوند، در این تابع مقدار ناخوانا یا رمزی نمی شود و صرفا ایمن سازی می شود، اما با md5 مقدار رمزی و ناخوانا می شود و این برای حفظ امنیت پسورد و جلوگیری از مشخص شدن آن برای دیگران (که به فرض احیانا به دیتابیس دسترسی داشته باشند) نیاز است.
- تابع mysqli_real_escape_string برای جلوگیری از نفوذ به دیتابیس است و اینکه رشته های متنی از کاراکترهای خطرناک برای دیتابیس (کاراکترهایی که می توانند نقش یک دستور مخرب را بازی کنند) ایمن سازی شوند، در این تابع مقدار ناخوانا یا رمزی نمی شود و صرفا ایمن سازی می شود، اما با md5 مقدار رمزی و ناخوانا می شود و این برای حفظ امنیت پسورد و جلوگیری از مشخص شدن آن برای دیگران (که به فرض احیانا به دیتابیس دسترسی داشته باشند) نیاز است.
محمد
۰۹:۲۴ ۱۳۹۳/۰۴/۲۲
سلام
من این سیستم رو خلاصه کردم داخل یک صفحه یعنی دیگه صفحه لاگین درست نکردم ، داخل همون صفحه اول کدهای مربوط به اتصال به سرور و اعتبار سنجی رو انجام دادم به این گونه
دو صفحه ای نوشتن مزیتی داره ؟
من این سیستم رو خلاصه کردم داخل یک صفحه یعنی دیگه صفحه لاگین درست نکردم ، داخل همون صفحه اول کدهای مربوط به اتصال به سرور و اعتبار سنجی رو انجام دادم به این گونه
<?php
session_start();
define('assdfdgh', true);
if (isset($_POST['check']) and $_POST['check'] == 'sended')
{
کدهای مربوط به اتصال به بانک $count = mysql_num_rows($matlab_query);
if($count > 0)
{
$_SESSION['username'] = $_POST['user'];
$_SESSION['password'] = $_POST['pass'];
echo "شما به سایت وارد شده اید!<br />";
}else{ header("location:index.php");
$_SESSION['error']=1;
}
}else
{
echo"
<form action='' method='post'>
<input type='text' name='user'><br>
<input type='password' name='pass'><br>
<input type='hidden' name='check' value='sended'>
<input type='submit' name='sub'>
</form>";
if(isset($_SESSION['error']) and $_SESSION['error']==1){echo "اطلاعات وارد شده صحیح نیست!<br />"; }
}
?>
آیا این کار اشکالی داره ؟ (مثلا از لحاظ امنیتی یا چیز دیگه )دو صفحه ای نوشتن مزیتی داره ؟
به خودی خود هیچ مشکلی در استفاده از کدها در یک صفحه نیست، البته باید بر دستورات مسلط باشید و بدانید که چه می کنید!
مزیت اصلی استفاده از چندین فایل مدیریت راحت تر ساختار برنامه و توسعه آن است.
مزیت اصلی استفاده از چندین فایل مدیریت راحت تر ساختار برنامه و توسعه آن است.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.