درس هفتم- کوکیها (Cookie) و ورود به سیستم (Login)
مقدمه
در
این درس به معرفی یک تکنیک تازه بنام کوکی میپردازیم. حتما در تارنماهای
بسیاری دیدهاید که سیستمها با ثبتنام و ورود، ابتدا شما را شناسایی
کرده و بعد قابلیتهایی را برای شما فراهم میکنند. بطور مثال سیستمهایی
مانند گوگل که به شما این قابلیت را میدهند که بعد از ثبت نام در آنها
وارد شده و از توانایی فرستادن و گرفتن رایانامه بهره ببرید. در اصل یکسری
از داده ها که مربوط به کاربر وارد شده به سیستم است توسط کوکیها در تمام
صفحههای تارنما قابل دسترسی میشوند و بعد با توجه به این دادهها سرویس
مورد نظر به کاربر وارد شده ارایه میگردد. اما این قابلیت بطور پیشفرض در
پروتکل اچتیتیپی وجود ندارد٬ پس هر سند اچتیتیپی یا صفحه تارنما که
مشاهده میکنید فاقد این توانایی است. برای ردیابی و شناختن کاربران
میباید از زبانهای دیگر مانند پیاچپی در قالب اچتیتیپی استفاده کرد.
پیاچپی این امکان را فراهم میکند تا شناسایی و ردیابی کاربران برای
سیستم قابل اجرا گردد. ابزارهای پیاچپی برای این کار کوکی و سشن (Session که در درس بعدی به آن میپردازیم) هستند٬ در این درس به یادگیری کوکی میپردازیم.
کوکی
کوکی ابزاری است که سیستم سرویس دهنده توسط زبان برنامه نویسی شده در آن٬
یکسری دادههای مربوط به کاربران را در رایانه هر کاربر بصورت یک فایل ثبت
میکند. از آن به بعد هر بار که کاربر به آن تارنما یا سیستمی که در آن ثبت
نام کرده مراجعه میکند٬ سیستم دادههای مربوط به آن کاربر را خوانده و از
آن برای ردیابی و ارائه سرویسهای ویژهی آن کاربر استفاده میکند. برای
اینکه کوکیهای ساخته شده در رایانه خود توسط هر سیستم را مشاهده کنید٬
کافیست که به آدرس آن در مرورگر خود بروید. بطور مثال به نشانیهای زیر در
مرورگر فایرفاکس مراجعه کنید٬ تا کوکیهای ثبت شده را ببینید:
Firefox: Tools / Options / Privacy / Show Cookies.
برای دیدن کوکی تارنمای ویژهای کافیست که نشانی آن تارنما را در قسمت جستجو (Search) بزنید٬ بطور مثال ما برای دیدن کوکی تارنمای خود که در مکان محلی یا همان Localhost است٬ این کلمه را وارد میکنیم و کوکی مورد نظر آورده میشود. بعد از دستیابی به کوکی٬ میبینید که شما قادر به پاک کردن آن هستید. اگر کوکی تارنمایی را پاک کنید٬ آن تارنما در زمان ورود دوباره شما به سیستم٬ دوباره کوکی تازهای میسازد.
برای استفاده از کوکی٬ قسمت ورود را به سیستم خود اضافه میکنیم. در طول این درس با اضافه کردن قسمت «ورود» کاربران قادر به ثبت نام (که در درسهای قبلی انجام دادیم) و ورود به سیستم میشوند.
تنظیم کوکی
تابع کوکی دو پارامتر اصلی دارد٬ یکی نام کوکی و دیگری مقدار آن٬ به همین
سادگی. البته پارامترهای دیگری مانند زمان کوکی٬ مسیر ثبت آن و غیره وجود
دارند٬ اما دو پارامتر ابتدایی برای کار کردن کوکی الزامی هستند.
بخش ورود به سیستم
برگهای بنام login.php در کنار دیگر برگهها بسازید و کدهای زیر را در آن قرار دهید:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
require_once ('db_connection.php'); // اتصال به پایگاه
$email = $_POST['email'];
$pass = $_POST['pass'];
if (empty($email)) {
$errors[] = ' رایانامه را وارد نکردهاید ';
} else {
$e = mysqli_real_escape_string($dbc, trim($email));
}
if (empty($pass)) {
$errors[] = ' رمز خود را وارد نکردهاید ';
} else {
$pass = mysqli_real_escape_string($dbc, trim($pass));
}
$p = md5(hash ('SHA512' , $pass));
if (empty($errors)) {
$q= "SELECT id, first_name FROM users WHERE email='$e' AND password='$p'";
$r = @mysqli_query ($dbc, $q);
if (mysqli_num_rows($r) == 1) {
$row = mysqli_fetch_array ($r, MYSQLI_ASSOC);
// Set the cookies:
setcookie ('user_id', $row['id'], time()+3600);
setcookie ('first_name', $row['first_name'], time()+3600);
// بروزرسانی مسیر
header("Location: index.php");
exit();
}else{
$errors[] = 'خطایی در ورود ایجاد شد';
}} else {
$errors[] = ' شناسه و رایانامه وارد شده درست نیستند '; }
mysqli_close($dbc); // بستن پایگاه
} // پایان ارسال فرم
$page_title = ' ورود ';
include ('includes/header.html');
// چاپ کردن اخطارها
if (isset($errors) && !empty($errors)) {
echo '<p class="error"> :این خطاها اتفاق افتاد<br />';
foreach ($errors as $msg) {
echo " $msg - <br /> "; }
echo '</p><p> دوباره امتحان کنید </p>'; }
// Display the form:
?><h1> ورود </h1>
<form action="login.php" method="post">
<label> رایانامه </label>
<input type="text" name="email" />
<label> رمز </label>
<input type="password" name="pass" />
<input type="submit" name="submit" value="ورود" class="submit"/>
</form>
<?php include ('includes/footer.html'); ?>
این برگه شامل یک فرم با دو کادر برای رایانامه و رمز است.
شرح کد
از آنجا که با بیشتر کدهای این برگه آشنا هستیم٬ ما به شرح قسمتهای تازه بسنده میکنیم.
توضیح کاری این برگه این است که: این برگه دو مقدار «نام کاربری» و «رمز کاربر» را توسط فرمی که در این برگه هست گرفته و در داخل دو متغییر قرار میدهد. بعد یک درخواست دادهها به پایگاه میزند و از این دو مقدار استفاده میکند تا ببینید آیا کارربری با این نام کاربری و رمز در پایگاه وجود دارد یا نه؟
$q= "SELECT id, first_name FROM users WHERE email='$e' AND password='$p'";
$r = @mysqli_query ($dbc, $q);
if (mysqli_num_rows($r) == 1)
اگر پاسخ درخواست برابر ۱ بود٬ یعنی کاربر وجود دارد٬ پس شماره کاربر و نام او را در داخل کوکی تنظیم میکند.
setcookie ( 'user_id', $row['id'], time()+3600);
setcookie ('first_name', $row['first_name'], time()+3600);
به کوکیها که توجه کنیم٬ میبینیم که شماره کاربری و نام آن را به مدت ۳۶۰۰ ثانیه یا یک ساعت تنظیم کرده است٬ یعنی این دو کوکی بعد از یک ساعت بی اعتبار خواهند شد٬ و کاربر باید دوباره به سیستم وارد شود تا کوکی تازه ساخته شود و که کاربر بتواند به قسمتهای ارائه شده دست یابی داشته باشد. برای دادن زمان اعتباری به کوکی از تابع time()استفاده شده است٬ که زمان حال را ثبت میکند. یعنی اعتبار کوکی ساخته شده از زمان ساخت آن به مدت یک ساعت است.
تابع سرآیند header
بعد از تنظیم کوکی٬ برنامه توسط تابه سرایند کاربر را به صفحه ابتدایی یا index.php راهنمایی میکند. شیوه استفاده از این تابع مانند زیر است. داخل کادر تابع کلمه Location دو نقطه و مقصد داده میشود.
header(" Location: index.php ");
exit();
تابعheader() به صورتی که مشاهده میکنید٬ کاربر را به نام و یا نشانی که در مقابل کلمه Location: نوشته شده باشد٬ هدایت میکند. بخاطر اینکه با این تابع از برگه کنونی خارج و به برگه دیگری وارد میشویم٬ باید تابع exit()را هم بعد از آن بکار بریم.
بقیه کدهای این برگه هم که تا بحال چندین بار شرح داده شده است. حال اجازه بدهید که به کاربرد کوکی بیشتر بپردازیم.
تا به اینجا٬ کاربر ما از طریق برگه «ورود» به سیستم وارد شده و کوکیهای لازم هم ساخته شده است. حال باید از این کوکیها برای ردیابی این کاربر در صفحههای سیستم استفاده کنیم. این عمل را با تغییر برگه سرایند انجام میدهیم.
تغییر برگه سرآیند header.html
برگه سرآیند که در پوشه includes قرار
دارد را باز کرده و کدهای زیر را با کدهای آن عوض کنید٬ البته تنها بخشی
از این برگه تغییر میکند٬ اما برای اینکه مشکلی پیش نیاید ما کل کدها را
قرار میدهیم.
<?php include('functions.php'); ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<title> <?php echo $page_title; ?> </title>
<link rel="stylesheet" href="includes/style.css" type="text/css" media="screen" />
</head>
<body>
<div id="wrap">
<div id="header">
<h1> درسنامه </h1>
<h3> <?php if(isset($_COOKIE['first_name']))echo ' درود ' .$_COOKIE['first_name']; ?> </h3>
<div id="navigation">
<ul>
<li><a href="index.php"> خانه</a></li>
<?php if(!isset($_COOKIE['first_name'])) {?>
<li><a href="register.php"> ثبت نام </a></li>
<?php } else { ?>
<li><a href="view.php"> کاربران </a></li>
<li><a href="password.php"> بروزرسانی رمز </a></li>
<?php } ?>
<li><a href="contactus.php"> تماس با ما </a></li>
<li>
<?php if ( (isset($_COOKIE['user_id'])) && (basename($_SERVER['PHP_SELF']) != 'logout.php') )
{ echo '<a href="logout.php"> خروج </a>';
} else { echo '<a href="login.php"> ورود </a>'; }
?>
</li>
</ul>
</div>
</div>
<div id="content">
در قسمت برگه «ورود» یا login٬ کوکیها را تنظیم کرده و گرفتیم٬ حال در این قسمت از آنها استفاده میکنیم تا کاربر مورد نظر با کوکی خود را شناسایی کنیم.
<h3>
<?php
if (isset($_COOKIE['first_name']))
echo ' درود ' .$_COOKIE['first_name'];
?>
</h3>
این شرطی٬ در صورت وجود مقدار در کوکی که نام کاربر را دارد٬ آن را چاپ میکند. با این حساب اگر کاربر وارد سیستم شود٬ در هنگام مرور همه برگهها نام خود را در بالای٬ قسمت سرایند مشاهده میکند.
استفاده خیلی مفیدتر از کوکی را در قسمت فهرست نشان میدهیم٬ لطفا به کدهای زیر توجه کنید:
<div id="navigation">
<ul> <li><a href="index.php"> خانه</a></li>
<?php if(!isset($_COOKIE['first_name'])) {?>
<li><a href="register.php"> ثبت نام </a></li>
<?php } else { ?>
<li><a href="view.php"> کاربران </a></li>
<li><a href="password.php"> بروزرسانی رمز </a></li>
<?php } ?>
<li><a href="contactus.php"> تماس با ما </a></li>
<li> <?php if ( (isset($_COOKIE['user_id'])) && (basename($_SERVER['PHP_SELF']) != 'logout.php') )
{ echo '<a href="logout.php"> خروج </a>';
} else { echo '<a href="login.php"> ورود </a>'; } ?>
</li></ul></div>
در این بخش کدها طوری نوشته شده که در حالتی که کاربر هنوز وارد سیستم نشده فقط عنوانهای بعضی از موارد فهرست را مشاهده کند.
همانطور که مشاهده میکنید٬ اثری از گزینههای «بروزرسانی رمز» و «کاربران» دیده نمیشود٬ چراکه تنها کاربران وارد شده باید بتوانند این گزینهها را ببینند.
<?php if(!isset($_COOKIE['first_name'])) {?>
<li><a href="register.php"> ثبت نام </a></li>
این شرطی میگوید که: اگر کوکی با نام کاربر تنظیم نشده گزینه «ثبت نام» را نشان بده.
<?php } else { ?>
<li><a href="view.php"> کاربران </a></li>
<li><a href="password.php"> بروزرسانی رمز </a></li>
<?php } ?>
در غیر اینصورت (یعنی اگر کوکی نام تنظیم شده بود) گزینههای «کاربران» و «بروزرسانی رمز» را نشان بده.
یکی دیگر از استفادههایی که ما از کوکی برای هر چه کارامد کردن سیستم داریم٬ نمایش یا عدم نمایش گزینههای «ورود» و «خروج» است.
<?php if ( (isset($_COOKIE['user_id'])) && (basename($_SERVER['PHP_SELF']) != 'logout.php') )
{ echo '<a href="logout.php"> خروج </a>';
} else { echo '<a href="login.php"> ورود </a>'; }
?>
این شرطی دو حالت را بررسی میکند٬ یکی اینکه کوکی تنظیم شده٬ دارای مقدار است و برگهی کنونی برگه خروج نیست (در ادامه برگه خروج را هم شرح میدهیم). به این معنی که کاربر وارد سیستم شده و نیاز به گزینه «خروج» برای خارج شدن دارد. پس اگر کوکی شماره کاربر مقدار دارد و برگه کنونی برگه خروج نیست٬ گزینه «خروج» را نمایش بده.
امکان دیگر برای زمانی است که کاربر وارد سیستم نشده٬ در این حالت گزینه «ورود» نمایش داده میشود.
basename($_SERVER['PHP_SELF'])
این تابع در هر برگهای که باشد٬ نام آن برگه را بر میگرداند.
basename($_SERVER['PHP_SELF']) != 'logout.php'
اگر نام برگه کنونی مخالف برگه logout.php است.
برگه خروجی یا logout.php
خب٬ وقتی کاربر وارد سیستم شد نیاز دارد تا گزینهای داشته باشد تا در
زمان لازم از سیستم خارج شود. کار این برگه خارج کردن کاربر از سیستم و عدم
ردیابی او است.
ساخت برگه خروجی
فایل دیگری با نام logout.php بسازید و در پوشه قرار دهید. داخل برگه خروجی کدهای زیر را وارد کنید:
<?php
//اگر کوکی نیست کاربر را به صفحه دیگری بفرست
if (!isset($_COOKIE['user_id'])) {
$url = 'index.php';
header("Location: $url");
exit(); // از کد خارج شو
} else { // کوکیها را پاک کن
setcookie ('user_id', '', time()-3600);
setcookie ('first_name', '', time()-3600);
}
$page_title = 'خروج!' ;
include ('includes/header.html');
echo "<p>شما در حال خارج شدن از سیستم هستید, {$_COOKIE['first_name']}</p>";
echo 'به امید دیدار';
$url = 'index.php';
header("Refresh: 2; URL= $url"); // نوع دیگر قرار دادن مقصد در سرایند
exit();
include ('includes/footer.html');
?>
header("Refresh: 2; URL= $url");
تابع سرایند با پارامتر Refresh: (time)و مقصد =URL به اندازه عددی که شما جای زمان مینویسید٬ یک توقف تولید میکند و بعد برگه را به سمت مقصد هدایت میکند.
شرح برگه خروج
این برگه با شرطی که عدم وجود کوکی را بررسی میکند آغاز میشود٬ یعنی می
گوید: اگر کوکی با شماره کاربری وجود نداشت٬ به برگه ایندکس برو و از این
برگه خارج شو.
if (!isset($_COOKIE['user_id'])) {
$url = 'index.php';
header("Location: $url");
exit(); // از کد خارج شو
این کد برای این نوشته شده است که اگر کوکی وجود نداشته باشد یعنی کاربر وارد نشده است٬ پس اصلا نباید به این برگه (برگه خروج) وارد شود. برگه خروج با گزینه «خروج» برای کاربرانی است که وارد شدهاند و حال میخواهند از سیستم خارج شوند.
} else { // کوکیها را پاک کن
setcookie ('user_id', '', time()-3600);
setcookie ('first_name', '', time()-3600);
}
در حالت دیگر٬ زمانی که کوکی وجود داشت. این برگه اقدام به پاک کردن کوکیها میکند٬ این کار را با تنظیم کوکی به زمانی قبلتر از اکنون انجام میدهد. با این کار کوکی اعتبار خود را از دست میدهد. البته نوع دیگر پاک کردن کوکی تنظیم کوکی فقط با نام است٬ بطور مثال:
setcookie ('user_id')
setcookie ('first_name')
این دو عبارت هم کوکیها را پاک میکنند٬ منتها اضافه کردن زمان منفی یا زمان گذشته یکم احتیاط را بالا میبرد.
در درس آینده با سشنها که راه دیگری برای ردیابی و شناسایی کاربران هستند آشنا میشویم.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.