سفارش تبلیغ
صبا ویژن
 
آموشهای تخصصی کامپیوتر و طراحی سایت
درباره وبلاگ


لینک های ویژه
طول ناحیه در قالب بزرگتر از حد مجاز
آمار وبلاگ
  • بازدید امروز: 0
  • بازدید دیروز: 2
  • کل بازدیدها: 411230



چهارشنبه 92 خرداد 22 :: 3:34 عصر ::  نویسنده : smfatemi

آموزش ایجاد یک آمارگیر ساده برای سایت با php

آبان 16, 1390 | نویسنده: admin | ارسال در: آموزش php

در این مطب ما قصد داریم که یک شمارنده آمارگیر ساده که فقط تعداد دفعات بازدید صفحات را نشان می دهد را طراحی و ایجاد کنیم.

مقدمه
برای شروع شما نیاز دارید تا کمی در مورد php بدانید. البته ما سعی می کنیم تمام اسکریپت ها و توابع را به صورت خلاصه توضیح دهیم. این اسکریپتی که ما ایجاد می کنیم قرار است تا هر بار که یک بازدید کننده از سایت دیدن کرد و یا حتی صفحه Refresh شد یکی به تعداد بازدید ها افزوده شود.
در ضمن در این آموزش ما دو فایل یکی با نام های counter ولی با فرمت های txt و php می سازیم و لازم است که وب سرور شما از زبان php پشتیبانی کند. همین طور برای اجرای این اسکریپت بر روی رایانه شخصی خودتان می توانید از لوکال هاست (هاست محلی) استفاده کنید، برای این کار استفاده از WAMP Server و یا XAMPP Server را به شما پیشنهاد می کنیم.

 

ایجاد فایل های لازم
ابتدا لازم است که دو فایل اصلی را ایجاد کینم، ابتدا یک فایل txt با نام counter ایجاد می کنیم و فقط در داخل آن عدد 1 را می گزاریم.
سپس یک فایل php با نام counter نیز ایجاد می کنیم و لازم است تا کد هایی را در این فایل بنویسیم.

مرحله اول پیاده سازی دستورات
ابتدا کدهای زیر را در یک ویرایشگر مثل notepad یا dreamweaver را در فایل counter.php می نویسیم.

<?php
$file_name = “counter.txt”;
$file = fopen($file_name, “r”);

$count= fread($file,filesize($file_name));
echo($count);
?>

حال صفحه را با مرورگر مشاهده می کنیم، مطمئنا چیزی که می بینیم عدد 1 است، در واقع ما محتویات فایل counter.txt را در نمایش داده ایم. حال صفحه را Refresh کنید، همچنان عدد 1 نمایش داده می شود. اما برای این که بفهمیم که چرا 1 تبدیل به 2 نشد ابتدا لازم است در مورد کد های بالا نکات و توضیحات مختصری را توضیح دهیم.
1- هر دستور php با توجه به الگوی زیر به کار برده می شود:

2- برای ایجاد و استفاده از یک متغیر باید نام متغیر را با علامت $ به کار برد. در واقع ما در خط دوم یک متغیر با نام file_name ایجاد کرده ایم و مقدار آن را counter.txt قرار داده ایم. (آدرس فایلی که قرار است مورد استفاده قرار گیرد – توجه شود که دو فایل باید در یک پوشه باشند، در غیر این صورت آدرس فایل را باید تغییر دهید.)

3- fopen یک تابع است که یک فایل را باز می کند تا یا محتویات آن را بخواند و یا آن را تغییر دهد و یا هر دوی این کار ها را با هم انجام دهد، و دو آرگومنت(پارامتر) می پذیرد، در پارامتر اول آدرس فایل و در پارامتر دوم مدل باز شدن مشخص می گردد. با توجه به خط سوم کدهای بالا، ما با تابع fopen یک فایل (counter.txt) را باز کرده ایم و مدل آن را بر روی r قرار داده ایم، یعنی این که فایل فقط قابلییت خواندنی (read) دارد و خروجی تابع fopen را به متغیر file نسبت داده ایم.
4- تابع fread محتویات فایل باز شده را می خواند و با توجه به خط چهارم از کدهای بالا، ما آن را به متغیر count نسبت داده ایم. این تابع نیز دو پارامتر می پذیرد، اولین پارامتر همان فایلی است که باز شده است (در این جا جریان ایجاد شده به متغیر file نسبت داده شده است). در واقع وقتی از تابع fopen استفاده می کنیم، این تابع یک خروجی دارد که با زبانی ساده باعث ایجاد یک جریان ارتباطی با فایل مورد نظر می شود، حال ما از این جریان برقرار شده استفاده می کنیم و محتویات فایل مورد نظر را می خوانیم. پارامتر دوم هم سایز کاراکترهایی که باید خوانده شود را مشخص می کند و تابع file_size هم حداکثر سایز محتویات فایل مورد نظر را مشخص می کند. به این ترتیب مقدار متغیر count برابر با 1 می شود.
5- echo هم محتویات count را روی صفحه مرورگر نمایش می دهد.
6- تابع fclose هم فایل مورد نظر را می بندد (این کار لازم است، زیرا به هنگام باز کردن مجدد آن به مشکل برنخوریم.)

مرحله دوم پیاده سازی دستورات
حال موقع است که اسکریپت شمارنده را تکمیل کنیم، برای این کار دستوراتی را به کدهای قبلی اضافه می کنیم، پس داریم:

<?php
$file_name = “counter.txt”;
$file = fopen($file_name, “r”);

$count= fread($file, filesize($file_name));
echo($count);

fclose($file);
//code haye ezafe shodeh…
$file = fopen($file_name, “w”);
$count = $count + 1;
fwrite($file , $count);
fclose($file);
?>

نکاتی که در کدهای اضافه شده قابل ذکر است به ترتیب:
1- دوباره فایل counter.txt را باز می کنیم.
2- ما فایل را به صورت w، یعنی این که امکان تغییر در محتویات را داریم (write) اعلان کرده ایم.
3- مقدار count یعنی 1 را به اندازه یک واحد افزایش می دهیم و آن را دوباره در count ذخیره می کنیم.
4- مقدار count جدید را به جای محتویات قبلی فایل باز شده بروز می کنیم، این کار را با استفاده از تابع fwrite انجام می دهیم، همان طور که مشخص است، این تابع دو پارامتر می پذیرد که اولی همان اشاره گر به جریان ایجاد شده و دومی هم مقدار جدیدی است که برای فایل در نظر گرفته ایم، می باشد.
5- فایل را می بندیم.

حال مجددا صفحه مورد نظر را با مرورگر باز کنید، همان طور که می بینید با هر بار Refresh کردن صفحه یک واحد به شمارنده افزوده می شود. این همان چیزی است که ما می خواستیم.

موفق باشید.




موضوع مطلب :
پنج شنبه 92 فروردین 29 :: 10:40 صبح ::  نویسنده : smfatemi

آموزش ساخت فرم تماس با php و mysql

فرم تماس از جمله امکاناتی است که تقریبا هر سایتی برای داشتن یک ارتباط دوسویه با مخاطبان خود، به آن نیاز دارد و بدین منظور معمولا برنامه نویسان وب و مدیران سایت ها از دو شیوه ی ارسال پیام به ایمیل یا ارسال پیام به سرور و ذخیره کردن آن در دیتابیس  یا حتی ترکیبی از این دو روش استفاده می کنند، از طرفی محافظت بخش تماس از ارسال اسپم و هرزنامه نیز مبحثی است که در این مورد باید به آن توجه جدی نمود، چرا که عدم استفاده یا ضعف این سیستم می تواند باعث هجوم خزنده های ارسال هرزنامه به بخش تماس سایتتان شود؛ از این رو در این آموزش قصد داریم تا شما را با نحوه ساخت یک فرم تماس نسبتا پیشرفته با php و mysql آشنا کنیم.
ساخت فرم تماس به صورت html

طبق معمول آموزش های قبلی، نخستین گامی که برای رسیدن به هدفمان به آن نیاز داریم، ساختن یک فرم تماس در قالب کدهای html است تا اطلاعات آن پس از ارسال، به سرور منتقل و در آنجا (در دیتابیس) ذخیره شده یا توسط سیستم ایمیل (که در آموزش های کاربردی php و در مطلب ارسال ایمیل با php و کلاس phpmailer راجب آن صحبت کرده ایم)، به آدرس مدیر سایت ارسال گردد، البته در اینجا هدف ما صرفا ذخیره یادداشت کاربر در دیتابیس است و مجددا به بحث ایمیل نمی پردازیم؛ لذا بدین منظور ابتدا فرم زیر را نوشته و آن را در یک فایل با نام فرضی index.php ذخیره می کنیم (البته این فرم در ادامه تکمیل خواهد شد و نمونه زیر تنها به عنوان مقدمه کار است).

 

----------------------------------------------------------------------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | فرم تماس با ما</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
label{
    display:inline-block;
    width:100px;
    height:25px;
    vertical-align:top;
}
.code{
    width:50px;
    margin-top:2px;
}
</style>
</head>
<body>
<form action="contact.php" method="post">
<label for="name">نام:</label>
<input name="name" id="name" type="text" maxlength="255" /><br />
<label for="mail">ایمیل:</label>
<input name="mail" id="mail" type="text" maxlength="255" dir="ltr" /><br />
<label for="message">یادداشت:</label>
<textarea name="message" id="message" cols="35" rows="8">
</textarea><br />
<label for="code">کد امنیتی:</label>
<input name="code" id="code" type="text" class="code" /><br />
<input type="hidden" name="check" value="1" />
<input type="submit" value="ارسال" />
</form>
</body>
</html>

 

----------------------------------------------------------------------

 

توضیح:
- همان طور که ملاحظه می کنید، اطلاعات این فرم جهت پردازش به فایل فرضی contact.php ارسال می شوند.
- فرم تماس در نمونه بالا دارای سه فیلد از نوع text جهت درج نام، ایمیل و کد امنیتی، یک فیلد از نوع textarea برای درج یادداشت کاربر و یک فیلد hidden یا مخفی برای بررسی و اطمینان از ارسال فرم در سرور است.
- برای تنظیمات ظاهری فرم تماس، می توانید از css یا از خاصیت های استاندارد html استفاده کنید.
نکته: این فایل را باید با پسوند php ذخیره کنید، چون در ادامه به دستورات و کدهای php درون آن نیاز خواهیم داشت.
پردازش و ذخیره اطلاعات در سرور با php و mysql

بعد از ارسال فرم، نوبت به مرحله پردازش، اعتبار سنجی و سپس ذخیره اطلاعات است، البته قبل از ارسال فرم هم به روش های متفاوت (با جاوا اسکریپت یا آژاکس) می توان از معتبر بودن اطلاعات پیش از ارسال، اطمینان حاصل کرد که در مطالب قبلی به آن پرداخته ایم و در اینجا از تکرار مباحث خودداری می کنیم، اما برای مواردی که اشاره شد، یعنی پردازش و ذخیره اطلاعات، ابتدا لازم است که یک دیتابیس، جدول و چند ستون بسازیم و سپس با کدهای php، اطلاعات را در آن ذخیره کنیم.
ساخت دیتابیس، جدول و ستون برای فرم تماس

برای ساختن دیتابیس، در لوکال هاست یا در سرور از برنامه phpMyAdmin استفاده کرده و یک دیتابیس به صورت دستی با نام فرضی contact بسازید (دقت کنید که یونیکد یا collation پیش فرض دیتابیس بر روی utf8_general_ci باشد)؛ سپس در یک فایل php با نام فرضی install، کد زیر را ذخیره و اجرا کنید تا جدول و ستون ها در دیتابیس contact ایجاد شوند:

 

----------------------------------------------------------------------

 

<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact")
or die(mysql_error());
//پرس و جوی ساخت جدول
mysql_query("CREATE TABLE form(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(255),
mail VARCHAR(255),
message TEXT,
code VARCHAR(255),
date VARCHAR(255),
time VARCHAR(255),
userip VARCHAR(255),
useragent VARCHAR(255),
status VARCHAR(255)) ENGINE=MyISAM ")
or die(mysql_error());
echo "CREATE TABLE form = ok<br />";
//سازگاری با زبان فارسی
mysql_query("ALTER TABLE form
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;")
or die(mysql_error());
echo "ALTER TABLE form = ok<br />";
//پایان ارتباط   
mysql_close($con);
?>

 

----------------------------------------------------------------------

 

اکنون دیتابیس برای ذخیره اطلاعات آماده است، ضمن اینکه با استفاده از دستور ALTER TABLE و تنظیم یونیکد utf8 برای ستون ها، برای کار با حروف و زبان فارسی نیز مشکلی نخواهیم داشت.
نکته: برای ستون message از data type یا نوع TEXT به جای VARCHAR استفاده کرده ایم؛ این کار به دلیل محدودیت VARCHAR نسبت به TEXT در حداکثر میزان ظرفیت کلمات و کاراکترها است (حداکثر تعداد بایت کاراکتر در نوع VARCHAR در نسخه های ماقبل 5.0.3 از 0 تا 255 و از نسخه های مابعد آن 0 تا 65,535 است، اما برای نوع TEXT در تمام نسخه ها 65,535 بایت معادل 64kb کاراکتر است، البته از مقادیر دیگر مثلTINYTEXT با حداکثر 256 بایت کاراکتر، MEDIUMTEXT با حداکثر 16,777,215 بایت کاراکتر (16MB) و LONGTEXT با حداکثر 4,294,967,295 بایت کاراکتر (4GB) هم می توانید بسته به هدفتان استفاده کنید).
کد php برای پردازش اطلاعات فرم تماس

همان طور که در بالا و در قسمت کد html گفتیم، اطلاعات ارسال شده از فایل index.php به یک فایل دیگر به نام contact.php فرستاده می شود (البته می توانید برنامه خود را طوری بنویسید که اطلاعات به همان فایل ارسال شوند و نیازی به یک فایل دیگر نباشد)، در این فایل کدهای زیر را قرار می دهیم.

 

----------------------------------------------------------------------

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | فرم تماس با ما</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
.error{
    display:block;
    padding:10px;
    background-color:#C00;
    border:4px #EAEAEA solid;
    color:#FFF;
}
.sent{
    display:block;
    padding:10px;
    background-color:#090;
    border:4px #EAEAEA solid;
    color:#FFF;
}
</style>
</head>
<body>
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact")
or die(mysql_error());
//تابعی برای ایمن سازی مقادیر
function clean($str) {
    $str = trim($str);
    if (get_magic_quotes_gpc()){
        $str = stripslashes($str);
    }   
    $str = htmlspecialchars($str);
return mysql_real_escape_string($str);
}
//دریافت و ایمن سازی متغیرها
$check = $_POST["check"];
$name = clean($_POST["name"]);
$mail = clean($_POST["mail"]);
$message = clean($_POST["message"]);
$code = clean($_POST["code"]);
//تنظیم تاریخ ، زمان و اختلاف زمانی سرور
$time_zone = 12600;
$date = date("Y-m-d", time()+$time_zone);
$time = date("H:i:s", time()+$time_zone);
//دریافت آی پی کاربر
$ip = $_SERVER["REMOTE_ADDR"];
//دریافت مشخصات مرورگر و سیستم
if (isset($_SERVER["HTTP_USER_AGENT"])){
    $agent = $_SERVER["HTTP_USER_AGENT"];
}
else{
    $agent = "unknown";
}
//مقادیر پیش فرض برای خطا
$error = 0;
//بررسی معتبر بودن اطلاعات
if ($check == 1 && $name == ""){
    echo "<div class=\"error\">لطفا نام خود را وارد کنید!</div>";
    $error = 1;
}
elseif ($check == 1 && $message == ""){
    echo "<div class=\"error\">لطفا پیام خود را وارد کنید!</div>";
    $error = 1;   
}
elseif ($check == 1 && $code == ""){
    echo "<div class=\"error\">لطفا کد امنیتی را وارد کنید!</div>";
    $error = 1;   
}
//بررسی و ذخیره اطلاعات در دیتابیس
if ($check == 1 && $error != 1){
    //بررسی کد امنیتی
    $result = mysql_query("SELECT * FROM form WHERE userip = "$ip" AND code = "$code" AND status = "temp" LIMIT 1")
    or die(mysql_error());
    $code_exist = mysql_num_rows($result);
    if ($code_exist > 0){
        //ذخیره اطلاعات در دیتابیس
        mysql_query("INSERT INTO form (name,mail,message,code,date,time,userip,useragent,status) VALUES ("$name","$mail","$message","$code","$date","$time","$ip","$agent","sent")")
        or die(mysql_error());
        echo "<div class=\"sent\">پیام شما با موفقیت ارسال شد!</div>";       
    }
    else{
        echo "<div class=\"error\">کد امنیتی اشتباه است! [<a href=\"javascript: history.go(-1)\">بازگشت</a>]</div>";
    }
}
//پایان ارتباط   
mysql_close($con);
?>
</body>
</html>

 

----------------------------------------------------------------------

 

اکنون باید دو فایل با نام های index.php که فرم تماس را در آن نوشته ایم و فایلی دیگر با نام contact.php برای پردازش و ذخیره اطلاعات داشته باشیم، اما توضیح موارد مورد نیاز.
توضیح:
- در ابتدا یک اتصال با دیتابیس برقرا می کنیم، چرا که در ادامه کد، اطلاعاتی را از دیتابیس فراخوانی یا در آن ذخیره خواهیم کرد؛ دقت کنید که در این قسمت باید از نام کاربری و کلمه عبور دیتابیس خود استفاده کنید (در حالت پیش فرض این کار برای لوکال هاست انجام شده است).
- سپس متغیرهایی را که برای بررسی و کارکرد صحیح برنامه به آنها نیاز خواهیم داشت، تعریف می کنیم، همان طور که ملاحظه می کنید، از تابعی با نام clean برای جلوگیری از نفوذ به دیتابیس یا همان mysql injection استفاده کرده ایم، این تابع در واقع در درون خود چند کار را انجام می دهد، ابتدا فضای خالی احتمالی ابتدا و انتهای مقدار ارسال شده با trim حذف می شود، سپس وضعیت فعال بودن get_magic_quotes_gpc در سرور بررسی می شود، اگر این قابلیت در سرور فعال باشد (به طور پیش فرض معمولا این امکان غیر فعال است، ولی در برخی نسخه های قدیمی php ممکن است این طور نباشد)، مفسر php به صورت خودکار بک اسلش هایی (\) به مقادیر ارسال شده اضافه می کند (هر جا که علامت " یا " باشد)، برای جلوگیری از ایجاد این بک اسلش های تکراری و ناخواسته، از stripslashes استفاده می کنیم؛ در قسمت بعدی تابع، htmlspecialchars کاراکترهای مربوط به تگ های html را غیر فعال می کند، این کار باعث می شود تگ ها به صورت متن دریافت شوند نه به صورت کدهای html، در نهایت نیز mysql_real_escape_string مقادیر را به جهت جلوگیری از نفوذ به دیتابیس ایمن سازی می کند و متغیر نهایی با return از تابع برگردانده می شود.
- تاریخ و زمان ارسال پیام را با تابع date در php بدست می آوریم، در اینجا علاوه بر این کار، اختلاف زمانی سرور از وقت محلی (ایران) را هم حساب می کنیم، برای سرورهایی که بر روی GMT تنظیم شده اند، اختلاف 3:30 معادل 12600 ثانیه و 4:30 معادل 16200 ثانیه خواهد بود؛ لذا این مقادیر را به زمان فعلی سرور اضافه می کنیم (دقت کنید که برخی سرور ها بر روی زمان دیگری ممکن است تنظیم شده باشند).
- برای اینکه سیستم کد امنیتی به طور صحیح کار کند، ما نیاز به شناسایی کاربران متفاوت از هم داریم، بدین منظور تقریبا دو راه وجود دارد؛ استفاده از سشن (session) و مقادیر id آن، یا استفاده از IP کاربر، به جهت جلوگیری از پیچیده شدن مبحث، در اینجا تنها از IP استفاده کرده و بحث سشن ها و کدهای امنیتی را به مطلب دیگری موکول می کنیم.
- برای بدست آوردن IP کاربر، ساده ترین راه استفاده از دستور SERVER و REMOTE_ADDR است که در کد بالا ملاحظه می کنید.
- علاوه بر این، اگر تمایل دارید اطلاعاتی در مورد مرورگر و سیستم عامل کاربر داشته باشید، می توانید از HTTP_USER_AGENT نیز استفاده کنید، در مثال بالا این کار انجام شده است.
- مرحله بعدی، مرحله اعتبار سنجی و اطمینان از خالی نبودن فیلد های مورد نیاز است (روش و نوع اعتبار سنجی به خودتان و هدفی که دارید، بستگی دارد و از این لحاظ محدودیتی نیست).
- و در گام نهایی نیز، پس از ارسال صحیح مقادیر از فرم تماس، ابتدا بررسی می شود که کد ذخیره شده برای IP کاربر در دیتابیس با آنچه که کاربر در فیلد مربوط به کد امنیتی وارد کرده است، یکی باشد، اگر این کدها مطابق هم بودند (در این صورت mysql_num_rows مقادیر 1 را برمی گرداند)، اطلاعات او در پایگاه داده ذخیره می شود و در غیر این صورت قسمت else اجرا شده و پیغام خطا نشان داده می شود.
اما اگر دقت کرده باشید، گفتیم IP و کد امنیتی با آنچه در دیتابیس ذخیره شده مقایسه می شود، لذا باید از قبل و در فرم تماس، IP و کد را علاوه بر ذخیره کردن، به کاربر نیز نشان دهیم (تا او مقادیر کد امنیتی را در فیلد مربوط وارد کند)؛ لذا در فایل index.php مقادیر زیر را برای سیستم کد امنیتی یا captcha اضافه می کنیم.
ساخت سیستم کد امنیتی یا captcha

همان طور که می دانیم، کد امنیتی یا captcha، به سیستمی برای شناسایی کاربران حقیقی (انسان ها) از کاربران ماشینی (ربات های خزنده، برنامه های مخرب و...) گفته می شود، اینکه چگونه این قابلیت را به فرم خود اضافه کنیم، تا حدود زیادی بستگی به خودتان دارد، برنامه هایی نیز بدین منظور نوشته شده و در وب وجود دارد که هر کدام دارای معایب و مزایایی هستند، اما اگر می خواهید خودتان این کار را انجام دهید، یک روش ساده را در زیر توضیح می دهیم و توسعه آن را به عهده شما می گذاریم.
گام اول برای ساخت سیستم کد امنیتی، ذخیره اطلاعات منحصر به فرد هر کاربر در دیتابیس است، برای این کار معمولا برنامه نویسان وب از دو روش IP یا روش سشن (session) استفاده می کنند، این دو روش در عمل یک کارکرد دارند ولی از نظر جزئیات کمی با هم فرق می کنند؛ گام بعدی ما ایجاد یک کد امنیتی (با استفاده از توابع و روش های مختلف در php) است، این کد همراه با اطلاعات کاربر علاوه بر اینکه در دیتابیس ذخیره شده، در یک بلاک مشخص به صورت یک معادله ساده، به کاربر نشان داده می شود (تا او بتواند مقادیر را وارد فیلد مورد نظر کند)؛ حال بعد از ارسال فرم، مقادیر موجود در دیتابیس با کد ارسال شده کاربر تطبیق داده می شود، اگر اطلاعات همسان و درست بود، پیام کاربر ذخیره می شود و در غیر این صورت، پیغام خطای کد امنیتی نشان داده می شود.
توجه داشته باشید، برنامه نویسانی که ربات های خزنده و اسپمرها را طراحی می کنند، هم زمان با به کارگیری روش های نوین ساخت کد امنیتی، برنامه های مخرب خود را نیز هوشمندتر می کنند، به طور مثال حتی برخی ربات ها قادر به تجزیه تحلیل و خواندن اعداد و حروف داخل تصاویر captcha هستند، پس مهم است از روشی استفاده نمائید که قابل شناسایی برای ربات نباشد و تا می توانید آن را پیچیده کنید، یکی از این روش ها که بازدهی بالاتری نسبت به موارد مشابه دارد، ترکیب اعداد به صورت حاصل جمع، ضرب و... است، معمولا این برنامه ها آنقدر هم هوشمند نیستند که منظور حقیقی شما را تشخیص دهند و احتمالا هر آنچه را در فرم می بینند در فیلد وارد می کنند! (سعی کنید از علامت های دیگر مانند فاصله، ()، [] و ... نیز در زمان نمایش کد امنیتی استفاده کنید)؛ در مثال زیر ما از حاصل جمع دو عدد استفاده کرده ایم.
فایل index.php که پیش از این ساختیم را ویرایش کرده و به صورت زیر تغییر دهید.

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | فرم تماس با ما</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
label{
    display:inline-block;
    width:100px;
    height:25px;
    vertical-align:top;
}
.code{
    width:50px;
    margin-top:2px;
}
.code-box{
    display:inline-block;
    font-weight:bold;
}
</style>
</head>
<body>
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact")
or die(mysql_error());
//ساخت کد امنیتی
$code_1 = rand(1,9);
$code_2 = rand(1,9);
$code = $code_1 + $code_2;
//دریافت آی پی کاربر
$ip = $_SERVER["REMOTE_ADDR"];
//بررسی وضعیت کاربر در سرور
$result = mysql_query("SELECT * FROM form WHERE userip = "$ip" AND status = "temp" LIMIT 1")
or die(mysql_error());
$user_exist = mysql_num_rows($result);
if ($user_exist > 0){
    //به روز رسانی کد برای آی پی کاربر در دیتابیس
    mysql_query("UPDATE form SET code="$code" WHERE userip = "$ip" AND status = "temp"" )
    or die(mysql_error());   
}
else{
    //ذخیره کد و آی پی کاربر در دیتابیس
    mysql_query("INSERT INTO form (code,userip,status) VALUES ("$code","$ip","temp")")
    or die(mysql_error());
}
?>
<form action="contact.php" method="post">
<label for="name">نام:</label>
<input name="name" id="name" type="text" maxlength="255" /><br />
<label for="mail">ایمیل:</label>
<input name="mail" id="mail" type="text" maxlength="255" dir="ltr" /><br />
<label for="message">یادداشت:</label>
<textarea name="message" id="message" cols="35" rows="8">
</textarea><br />
<label for="code">کد امنیتی:</label>
<input name="code" id="code" type="text" class="code" />
<div class="code-box"><?php echo $code_1." + ".$code_2 ?></div><br />
<input type="hidden" name="check" value="1" />
<input type="submit" value="ارسال" />
</form>
</body>
</html>

----------------------------------------------------------------------

توضیح:
- از آنجایی که به حاصل جمع دو عدد تصادفی نیاز داریم، برای ساخت کد امنیتی از تابع rand در php استفاده کرده ایم، کد نهایی ما، در واقع حاصل جمع دو مقدار اتفاقی بین اعدا 1 تا 9 خواهد بود (روش تولید کدهای اتفاقی به این شیوه محدود نمی شود و می توان توابع پیشرفته تری برای آن به کار برد).
- برای تفکیک کاربرانی که نظر آنها ارسال و در دیتابیس ذخیره شده با آنهایی که هنوز نظری ارسال نکرده اند، از یک ستون با نام status یا وضعیت استفاده کرده ایم (نامی دلخواه است)، بدین ترتیب کاربرانی که نظر آنها ارسال نشده است یا قصد ندارند نظری ارسال کنند، تنها به عنوان temp یا موقتی در دیتابیس ذخیره می شوند و مقادیر این ستون برای آنهایی که پیامی ارسال می کنند، sent در نظر گرفته می شود (در فایل contact.php این مقادیر بعد از بررسی صحیح بودن کد امنیتی، در ستون status ذخیره می شود).
- همان طور که ملاحظه می کنید، ابتدا بررسی می کنیم که آیا چنین کاربری (IP) در دیتابیس از قبل موجود است (ممکن است کاربر صفحات سایت را قبلا دیده باشد)، اگر این طور بود، مقادیر مربوط به ستون کد امنیتی را با مقدار جدید به روز رسانی می کنیم (و با این کار از ایجاد یک ردیف جدید تکراری برای کاربر در دیتابیس، جلوگیری می کنیم).
- اما اگر کاربری با این IP در دیتابیس از قبل وجود نداشت، یعنی او اولین بار است که از صفحات سایت دیدن می کند، برای او یک ردیف جدید ایجاد کرده و به این صورت به نحوی تقریبا هوشمندانه وضعیت کاربر را شناسایی می کنیم، علاوه بر این شما می توانید با درک نحوه کارکرد این شیوه، روش های منحصر به فرد و هوشمندانه تری نیز ابداع کنید، به طور مثال در حالت فعلی حتی اگر کاربر نظری ارسال نکند، یک ردیف در دیتابیس برای IP او در نظر گرفته می شود و واضح است که پس از مدتی ممکن است تعداد این ردیف های temp زیاد شوند، البته این اتفاق به طور کلی مشکل خاصی ایجاد نمی کند، ولی می توان از ایجاد ردیف های اضافه در mysql با تعریف یک سیستم هوشمندتر جلوگیری کرد، به فرض ردیف های temp را پس از چند روز به حالت غیر فعال درآورد (به فرض در ستون status برای ردیف هایی که تاریخ آنها مربوط به چند روز پیش است، مقادیر فرضی trash را در نظر گرفت!) و برنامه را طوری تنظیم کرد که ابتدا از ردیف های غیر فعال استفاده کند و اگر دیگر ردیف غیر فعالی باقی نبود، ردیف های جدید برای کاربران temp بسازد (چیزی شبیه به یک سیستم بازیافت!)، به هر صورت انجام این موضوع تا حدود زیادی به میزان آشنایی شما با برنامه نویسی و به طور خاص برنامه نویسی وب برمی گردد.
- برای نمایش کد امنیتی از یک بلاک با کلاس css فرضی code-box استفاده کرده ایم، با دقت در نحوه عملکرد کد، به راحتی می توانید تغییرات سفارشی و دلخواه خود را در آن ایجاد کنید.
نمایش پیام های ذخیره شده در دیتابیس

پس از ذخیره اطلاعات در دیتابیس، نوبت به فراخوانی و نمایش آنها است، برای این کار نیز به راحتی می توانید از دستور SELECT * FROM در mysql استفاده کنید، به طور مثال:

 

----------------------------------------------------------------------

 

<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact")
or die(mysql_error());
//نمایش پیام ها
$result = mysql_query("SELECT * FROM form WHERE status != "temp" LIMIT 15")
or die(mysql_error());
$message_exist = mysql_num_rows($result);
if ($message_exist > 0){
    $loop = 1;
    while ($row = mysql_fetch_array($result)){
        $name = $row["name"];
        $mail = $row["mail"];
        $message = nl2br($row["message"]);
        $date = $row["date"];
        $time = $row["time"];
        $ip = $row["userip"];
        $agent = $row["useragent"];
        echo "شماره: $loop - نام: $name - ایمیل: $mail <br /> پیام: $message <br /> تاریخ: $date - زمان: $time آی پی: $ip - سیستم: $agent  <hr />";
        $loop++;
    }
}
else{
    echo "<div class=\"error\">هنوز هیچ پیامی ارسال نشده است!</div>";
}
//پایان ارتباط   
mysql_close($con);
?>

 

----------------------------------------------------------------------

توضیح:
- در کد بالا، ابتدا بررسی می کنیم تا ببینیم آیا پیام ارسال شده ای در دیتابیس موجود است یا خیر، اگر پیامی موجود باشد mysql_num_rows عددی بزرگتر از صفر خواهد بود و با mysql_fetch_array و حلقه while اطلاعات ردیف ها را استخراج کرده و نمایش می دهیم.
- برای جلوگیری از مشکل نمایش خطوط جدید در پیام به صورت یک خطی(یا همان مشکل حذف خطوط  جدید یا line break پیام در textarea)، از تابع nl2br استفاده می کنیم، این کار به این دلیل است که در php برای خطوط و سطرهای جدید، به جای تگ <br> از n\r\ استفاده می شود و لذا هنگام نمایش پیام در صفحات html باید از تابع nl2br استفاده کنیم تا خطوط php به خطوط html تبدیل شوند، در غیر این صورت پیام شما در یک سطر نشان داده می شود و فاصله بین خطوط حذف می شود!
در پایان این مطلب، یک بار دیگر یادآوری می کنیم که این فرم صرفا یک نمونه و الگو است، با آشنایی و تسلط نسبی بر php و mysql، به راحتی می توانید مواردی پیشرفته تر و به صورت سفارشی تعریف نمائید؛




موضوع مطلب :
پنج شنبه 92 فروردین 29 :: 10:36 صبح ::  نویسنده : smfatemi
article

هوشمند سازی پنل ورود و خروج سایت

در مطالب قبلی از بخش آموزش کاربردی کار با php و mysql، به طور مفصل به مبحث ساخت فرم عضویت و ورود و خروج کاربران پرداختیم، بحث نشست ها یا سشن (session) را با هم مرور کرده و با نحوه رمزنگاری کلمه عبور و همچنین ذخیره و بازیابی اطلاعات اعضاء سایت آشنا شدیم، این بار در تکمیل آموزش های قبلی، می خواهیم کمی بخش مدیریت سایتمان را توسعه داده و آن را به اصطلاح هوشمندتر کنیم، در این مطلب خواهیم دید که چگونه می توان امکاناتی مانند "مرا به خاطر بسپار" و  خروج خودکار بعد از چند دقیقه غیر فعال بودن را در پنل سایت خود افزود.
ایجاد امکان "مرا به خاطر داشته باش" در پنل سایت

حتما سایت های زیادی را دیده اید که در هنگام ورود اطلاعات نام کاربری و کلمه عبور، معمولا به صورت یک چک باکس، امکانی تحت عنوان "مرا به خاطر داشته باش" یا عباراتی از این دست دارند، این امکان در واقع به این معنی است که سیستم تا مدت زمان معینی از شما در مراجعات بعدی نام کاربری و کلمه عبور نخواهد خواست و به صورت هوشمندانه ای شما را به یاد خواهد داشت، اما این امکان چگونه ایجاد می شود؟
این امکان به این صورت کار می کند: هنگامی که گزینه مورد نظر را انتخاب می کنید، برنامه یک کوکی (ckookie) در مرورگر شما ایجاد کرده و متناسب با آن کوکی، در سرور، متغیرهای سشن را برای مدت زمانی که برنامه نویس تعیین کرده است (به فرض یک ماه) نگهداری می کند، تا زمانی که سشن های مورد نظر در سرور وجود دارند و به طور مثال به دلیل منقضی شدن تاریخ کوکی یا کلیک کاربر بر روی دکمه خروج، unset نشده و از بین نرفته اند، کاربر برای سرور قابل شناسایی است و بدون ورود نام کاربری و کلمه عبور، حتی با بستن پنجره مرورگر و مراجعه بعدی، می تواند از امکانات بخش اعضاء استفاده نماید، برای ایجاد این امکان در php ابتدا به فرمی که در آموزش قبل ساخته ایم یک چک باکس اضافه می کنیم (اگر آموزش قبلی را مطالعه نکرده اید، می توانید در انتهای این مطلب، از دکمه مربوط به مطالب قبلی و بعدی استفاده نمایید).

 

------------------------------------------------------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | پنل ورود و خروج در سایت با php و mysql</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    direction:rtl;
    font-size:12px;
}
</style>
</head>
<body>
<form action="login.php" method="post">
<label for="user">نام کاربری:</label><br />
<input name="username" id="user" type="text" maxlength="255" /><br /><br />
<label for="pass">کلمه عبور:</label><br />
<input name="password" id="pass" type="password" maxlength="255" /><br /><br />
<label for="remember">مرا به خاطر بسپار:</label>
<input type="checkbox" name="remember" id="remember" checked="checked" value="1" /><br /><br />
<input type="hidden" name="check" value="sended" />
<input type="submit" value="ورود" />
</form>
</body>
</html>


--------------------------------------------

توضیح:
- همان طور که ملاحظه می کنید؛ چک باکس ما در فرم بالا از نوع  input و checkbox است.
- برای اینکه به طور پیش فرض، چاک باکس فعال بوده و به حالت انتخاب شده درآمده باشد، بخش checked را اضافه می کنیم، اگر مایل هستید که به طور پیش فرض، (تیک) چک باکس غیر فعال باشد، این قسمت را حذف کنید.
- مقادیر value برای فرم بالا و قسمت چک باکس که عدد یک در نظر گرفته شده، فرضی است، شما می توانید مقادیر دیگری مثل true، ok و... در نظر بگیرید، اما نکته مهم این است که ما این مقادیر را در سمت سرور و در کد php خود به عنوان یک متغیر از فرم html دریافت خواهیم کرد تا از انتخاب شدن یا نشدن این گزینه توسط کاربر اطمینان حاصل کنیم.
اکنون در سمت سرور کد php با نام فرضی login.php را که در آموزش پیشین ساختیم، به صورت زیر ویرایش می کنیم.


--------------------------------------------

<?php
//شروع یک نشست
session_start();
//دریافت و تنظیم متغیرهای ارسال شده توسط کاربر
@$username = $_POST["username"];
@$password = $_POST["password"];
@$check = $_POST["check"];
$check_error = 0;
//بررسی معتبر بودن اطلاعات ارسالی کاربر
//نام کاربری
if (!isset($username) || $username == ""){
    echo "فیلد نام کاربری نباید خالی باشد!";
    $check_error = 1;
}
//کلمه عبور
elseif (!isset($password) || $password == ""){
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $check_error = 1;
}
//اطلاعات اتصال به پایگاه داده
$con = mysql_connect("localhost", "user", "pass")
or die(mysql_error());  
//نام دیتابیس
mysql_select_db("db", $con)
or die(mysql_error());
//جلوگیری از نفوذ به دیتابیس
$username = mysql_real_escape_string($username);
$password = md5($password);
if ($check_error != 1 && $check == "sended"){
    //تطبیق اطلاعات کاربر با آنچه که در دیتابیس ذخیره شده
    $result = mysql_query ("SELECT * FROM register WHERE username = "$username" AND password = "$password"");
    // تعداد ردیف های موجود
    $count = mysql_num_rows($result);
    if($count > 0){
        // اطلاعات کاربر درست است، تنظیم مجوز های استفاده از بخش اعضاء
        $_SESSION["username"] = $_POST["username"];
        $_SESSION["password"] = $_POST["password"];
        $_SESSION["remember"] = $_POST["remember"];
        // اطلاعات کاربر صحیح است، انتقال به صفحه اعضاء
        header("location:user.php");
    }
    else{
        // اطلاعات کاربر صحیح نیست
        echo "Error!<br />";
    }
}
//پایان ارتباط با پایگاه داده 
mysql_close($con);
?>

 

----------------------------------------------

توضیح:
- در این فایل ما سشن remember را به کد خود افزوده ایم که مقادیر آن در واقع همان مقادیر چک باکس خواهد بود.

$_SESSION["remember"] = $_POST["remember"];

به این صورت، اگر کاربر تیک "مرا به خاطر داشته باش" را غیر فعال نکرده باشد، مقدرا آن 1 و در غیر این صورت مقدار آن خالی خواهد بود.
- به دلیل اینکه در اینجا ما از تابع header و در ادامه از تابع setcookie استفاده می کنیم، باید هیچ نوع خروجی html و حتی فضای خالی یا کاراکترهای نامرئی (byte order mark یا BOM) پیش از فراخوانی آنها از طریق مرورگر ارسال نکنیم، در غیر این صورت با پیغام خطای headers already sent مواجه خواهیم شد، از این رو در کد خود، مقادیر کدهای html را حذف کرده ایم و در عوض با ایجاد یک انتقال از طریق header و location، کاربر را به طور خودکار به صفحه دیگر منتقل می کنیم.
حال نوبت به مقایسه مقادیر چک باکس و تنظیم یا عدم تنظیم کوکی است؛ لذا پس از انتقال کاربر به فایل user.php که در واقع محیط کاربری اعضای سایت است، مقادیر سشن remember را که پیش تر با دریافت اطلاعات فرم ورود تنظیم کرده ایم، بررسی می کنیم، اگر مقدار آن 1 بود، پس کاربر تمایل دارد که اطلاعاتش به خاطر سپرده شود، لذا کوکی را تنظیم می کنیم، اگر غیر از این بود، یعنی نباید کوکی یادآوری کاربر تنظیم شود.


-----------------------------------------------

<?php
//شروع یک نشست
session_start();
//بررسی تنظیم شدن یا نشدن متغیرهای سشن
if (!isset($_SESSION["username"]) || !isset($_SESSION["password"])){
//در صورتی که متغیرهای سشن تنظیم نشده باشند، کاربر مجاز به دیدن ادامه صفحه نیست و او را به صفحه اصلی منتقل می کنیم
header("location:index.php");
die();    
}
//بررسی امکان مرا به خاطر بسپار
elseif (isset($_SESSION["remember"]) && $_SESSION["remember"] == "1"){
    $login_time=3600;//یک ساعت
    setcookie(session_name(),session_id(),time()+$login_time,("/"));
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | محیط کاربری اعضای سایت</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    direction:rtl;
    font-size:12px;
}
</style>
</head>
<body>
شما در حال استفاده از بخش کاربری سایت هستید!
</body>
</html>


--------------------------------------------------

توضیح:
- از تابع setcookie برای تمدید مهلت استفاده از بخش اعضاء برای یک بار ورود کاربر (با ایجاد یک کوکی ) استفاده می کنیم.
- تابع setcookie باید یک آرگومان به صورت زمان به ثانیه داشته باشد که نمایانگر مدت زمان فعال بودن کوکی است، به فرض برای یک ساعت مقادیر 3600 ثانیه یا برای یک ماه معادل 2592000 ثانیه، بدین منظور ما از تابع time با افزودن یک مقدار به آن استفاده کرده ایم.
- نام کوکی با پارامتر session_name و مقادیر آن با session_id ذخیره می شود، همچنین برای تعیین یک مسیر (path) ذخیره سازی اطلاعات کوکی، پارامتر آخر را اضافه می کنیم، با تنظیم آن به صورت "/"، کوکی برای تمام فولدرهای یک سرور قابل دسترسی خواهد بود، در صورت عدم استفاده از متغیر path به طور پیش فرض، کوکی فقط در دایرکتوری که آن را ایجاد کرده است قابل استفاده است، به فرض با تنظیم آن به صورت "/user/" کوکی فقط در این فولدر قابل استفاده است، از این رو بهتر است همواره از روش ذکر شده در مثال استفاده کنید.
توجه کنید که قابلیت "مرا به خاطر داشته باش" برای برنامه هایی که به امنیت بالایی احتیاج دارند، معمولا توصیه نمی شود، چرا که اگر کاربر به هر دلیل از سیستم به شکل استاندارد خارج نشود (به فرض پنجره مرورگر خود را ببندد یا برق به طور ناگهانی  قطع شود)، فردی دیگر بر روی همان سیستم (و همان مرورگر) می تواند بدون وارد کردن نام کاربری و کلمه عبور و تنها با داشتن آدرس url صفحه کاربری، وارد قسمت مدیریت شود، متاسفانه این مشکلی است که بیشتر از روی ناآگاهی و معمولا در کامپیوترهای اشتراکی مانند کافی نت ها اتفاق می افتد؛ لذا استفاده از این امکان باید با در نظر گرفتن هشدارها و نکات امنیتی صورت گیرد.
ایجاد امکان خروج خودکار بعد از مدت زمان عدم فعالیت

در مقابل امکان "مرا به خاطر داشته باش"، قابلیت دیگری را نیز می توان برای پنل مدیریت سایت در نظر گرفت که معمولا به دلیل وجود حساسیت های خاص و ارتقاء امنیت صورت می گیرد، این امکان ایجاد یک سیستم خودکار خروج است، یعنی اگر به فرض مدت زمانی کاربر بدون فعالیت در صفحه باقی بماند، نشست او خود به خود منقضی شود، در این حالت حتی در موقعی که پنجره مرورگر هنوز باز است، اعتبار کاربر در سرور به پایان می رسد و او باید مجددا در پنل سایت وارد شود، این امکان معمولا در سیستم هایی که جنبه امنیت برایشان از اهمیت بالایی برخوردار است (مانند سیستم تراکنش های بانکی و مالی، کنترل پنل هاست ها و...) به کار گرفته می شود.
برای افزودن این امکان به سیستم خود، ابتدا در فایل اصلی لاگین، یعنی login.php مقادیر زیر را در ابتدای کد اضافه کنید.


--------------------------------------------------

<?php
//زمان برای خروج خودکار کاربر
$now_time = time();
$_SESSION["time_started"] = $now_time;     
$_SESSION["time_remaining"] = 3600;
?>


--------------------------------------------------

به این صورت:



--------------------------------------------------

<?php
//شروع یک نشست
session_start();
//زمان برای خروج خودکار کاربر
$now_time = time();
$_SESSION["time_started"] = $now_time;     
$_SESSION["time_remaining"] = 3600;
//دریافت و تنظیم متغیرهای ارسال شده توسط کاربر
@$username = $_POST["username"];
@$password = $_POST["password"];
@$check = $_POST["check"];
$check_error = 0;
//بررسی معتبر بودن اطلاعات ارسالی کاربر
//نام کاربری
if (!isset($username) || $username == ""){
    echo "فیلد نام کاربری نباید خالی باشد!";
    $check_error = 1;
}
//کلمه عبور
elseif (!isset($password) || $password == ""){
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $check_error = 1;
}
//اطلاعات اتصال به پایگاه داده
$con = mysql_connect("localhost", "user", "pass")
or die(mysql_error());  
//نام دیتابیس
mysql_select_db("db", $con)
or die(mysql_error());
//جلوگیری از نفوذ به دیتابیس
$username = mysql_real_escape_string($username);
$password = md5($password);
if ($check_error != 1 && $check == "sended"){
    //تطبیق اطلاعات کاربر با آنچه که در دیتابیس ذخیره شده
    $result = mysql_query ("SELECT * FROM register WHERE username = "$username" AND password = "$password"");
    // تعداد ردیف های موجود
    $count = mysql_num_rows($result);
    if($count > 0){
        // اطلاعات کاربر درست است، تنظیم مجوز های استفاده از بخش اعضاء
        $_SESSION["username"] = $_POST["username"];
        $_SESSION["password"] = $_POST["password"];
        $_SESSION["remember"] = $_POST["remember"];
        // اطلاعات کاربر صحیح است، انتقال به صفحه اعضاء
        header("location:user.php");
    }
    else{
        // اطلاعات کاربر صحیح نیست
        echo "Error!<br />";
    }
}
//پایان ارتباط با پایگاه داده 
mysql_close($con);
?>


--------------------------------------------------

توضیح:
- در ابتدا ما زمان آخرین فعالیت کاربر را در متغیر now_time ذخیره می کنیم و آن را به سشن time_started نسبت می دهیم.
- سپس حداکثر زمان مجاز برای ماندن کاربر در صفحات (بدون رفرش کردن یا رفتن به صفحه دیگر) را  در سشن دیگر با نام time_remaining تنظیم می کنیم.
این اطلاعات به دلیل اینکه از نوع سشن هستند، در صفحات دیگر که در آنها نیز سشن را شروع می کنیم (با session_start)، قابل دسترسی می باشند، لذا پس از انتقال کاربر به صفحه user.php می توانیم حداکثر زمان مجاز را با زمان آخرین فعالیت او مقایسه کنیم، اگر اختلاف کم تر از صفر بود، پس کاربر زمانی ندارد و باید از نو وارد سیستم شود، در غیر این صورت حداکثر زمان او را برای به فرض 1 ساعت دیگر (3600 ثانیه) تمدید می کنیم، این کار را در ادامه انجام داده ایم.

<?php
//شروع یک نشست
session_start();
//بررسی تنظیم شدن یا نشدن متغیرهای سشن
if (!isset($_SESSION["username"]) || !isset($_SESSION["password"])){
//در صورتی که متغیرهای سشن تنظیم نشده باشند، کاربر مجاز به دیدن ادامه صفحه نیست و او را به صفحه اصلی منتقل می کنیم
header("location:index.php");
die();    
}
//بررسی امکان مرا به خاطر بسپار
elseif (isset($_SESSION["remember"]) && $_SESSION["remember"] == "1"){
    $login_time=3600;//یک ساعت
    setcookie(session_name(),session_id(),time()+$login_time,("/"));
}
//مقایسه زمان باقی مانده
$old_time = $_SESSION["time_started"];     
$new_time = time();    
$remain_time = $new_time - $old_time;     
$_SESSION["time_remaining"] = $_SESSION["time_remaining"] - $remain_time;     
if ($_SESSION["time_remaining"] > 0) {
    //تمدید مهلت
    $_SESSION["time_started"] = $new_time;    
}
else {
    //زمان کاربر به پایان رسیده است، انتقال به صفحه ورود
    header("location:index.php");     
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | محیط کاربری اعضای سایت</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    direction:rtl;
    font-size:12px;
}
</style>
</head>
<body>
شما در حال استفاده از بخش کاربری سایت هستید!
</body>
</html>

 

--------------------------------------------------

با کمی دقت در کد بالا و آشنایی با نحوه عملکرد سشن ها در php، به راحتی می توانید فعل و انفعالات صورت گرفته را در مثال بالا تفسیر کرده و با توجه به برنامه خود از آنها استفاده نمائید.




موضوع مطلب :
پنج شنبه 92 فروردین 29 :: 10:31 صبح ::  نویسنده : smfatemi

آموزش ساخت پنل ورود و خروج سایت با php و mysql

می خواهیم کار خود را با فرم ورود و خروج تکمیل کنیم تا کاربرانی که پیش تر در سایتمان ثبت نام کرده اند، بتوانند به سایت وارد شده و از پنل کاربری شخصی خود استفاده کنند، در این آموزش خواهیم دید که مبحث مربوط به نشست ها (سشن یا session)، برای ایجاد یک فرم ورود و خروج تا چه میزان اهمیت دارد و با نحوه تنظیمات سفارشی مربوط به آن، بیشتر آشنا خواهیم شد.
سشن (session) یا نشست چه کاربردی دارد؟

قبل از اینکه به کدنویسی کار پردازیم، لازم است نگاهی اجمالی داشته باشیم به اینکه چرا باید در فرم ورود و خروج از سشن (session) یا نشست استفاده کنیم، برای درک صحیح مطلب اجازه دهید با یک مثال موضوع را مطرح کنیم، فرض کنید می خواهید وارد یک نمایشگاه بزرگ کتاب با غرفه های متعدد شوید (شما به عنوان کاربر و نمایشگاه کتاب به فرض به عنوان یک سایت)، در قسمت ورودی نمایشگاه برگه ای با یک کد اختصاصی و تاریخ انقضاء به شما تعلق می گیرد که برای ورود به غرفه های گوناگون باید آن را ارائه کنید (کد را به فرض همان سشن فرض کنید و غرفه ها را صفحات یک سایت)، ممکن است شما بعد از خروج از نمایشگاه دیگر نتوانید با آن برگه وارد شوید (برگه منقضی شود) و یا بعد از گذشت چند ساعت، این اتفاق رخ دهد و مجبور به گرفتن یک برگه جدید شوید، حال اگر این برگه که روی آن مشخصات اختصاصی شما در مراجعه فعلی به نمایشگاه درج شده است، به هر دلیل دریافت نشود یا از بین برود، غرفه ها نمی توانند هویت شما را به درستی شناسایی کنند و لذا ممکن است اجازه استفاده از خدمات خود را ندهند، مشابه همین اتفاق به نوعی در یک سایت در مورد بحث سشن (session) یا نشست  می افتد، با سشن سرور کدهای اختصاصی برای هر کاربر و در مرورگر او ایجاد می کند (که به آن کوکی می گویند) تا در هر بار درخواست یک صفحه، مرورگر کد سشن را ارسال کرده و سرور بررسی کند که آیا کاربر مورد نظر دارای اعتبار لازم برای استفاده از آن صفحه می باشد یا خیر، این اعتبار نیز در صورتی به کاربر تعلق می گیرد که او نام کاربری و کلمه عبور را به طور صحیح وارد کرده باشد و متغیرهای سشن مربوط به آن نام کاربری و کلمه عبور در سمت سرور از قبل تنظیم شده و دارای اعتبار باشند (به فرض نشست منقضی نشده باشد یا کاربر از سیستم خارج نشده باشد).
ساخت دیتابیس، ردیف ها و اطلاعات اعضاء

همانطور که گفتیم، آموزش فعلی، در ادامه مطلب گذشته بیان می شود، به این دلیل، نیاز به دیتابیس و اطلاعاتی از پیش ثبت شده داریم، بدین منظور می توانید مطلب زیر را مطالعه کنید:
آموزش ساخت فرم عضویت در سایت با php و mysql 
فرم html جهت ورود و خروج

همانطور که در آموزش مربوط به ساخت فرم عضویت در سایت با php و mysql ملاحظه کردید، در اینجا نیز به یک فرم html ساده جهت دریافت نام کاربری و کلمه عبور اعضاء، نیازمندیم، البته اگر چه این فرم به زبان html است، اما بهتر است پسوند فایل خود را به php ذخیره کنید، چرا که به دلیل کار با سشن و دریافت پاره ای اطلاعات از کاربر و به فرض نمایش پیام، در حالت ورود و خروج به سایت، به آن نیاز خواهیم داشت؛ لذا ابتدا فرم زیر را در یک فایل php ایجاد کنید.

------------------------------------------------------------

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | پنل ورود و خروج در سایت با php و mysql</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
font-family:Tahoma, Geneva, sans-serif;
direction:rtl;
font-size:12px;
}
</style>
</head>
<body>
<form action="login.php" method="post">
<label for="user">نام کاربری:</label><br />
<input name="username" id="user" type="text" maxlength="255" /><br /><br />
<label for="pass">کلمه عبور:</label><br />
<input name="password" id="pass" type="password" maxlength="255" /><br /><br />
<input type="hidden" name="check" value="sended" />
<input type="submit" value="ورود" />
</form>
</body>
</html>

----------------------------------------------------------------

توضیح:
- دوفیلد اصلی در فرم ما با نام های  username و password مشخص شده اند، فیلد مربوط به پسورد از نوع password است تا کلمه عبور کاربر به شکل حفاظت شده ای وارد شود.
- اطلاعات این فرم به فایل فرضی login.php با متد post ارسال می شود.
- فیلد مخفی با نام فرضی check، جهت اطمینان از ارسال فرم توسط کاربر و اختیاری است.
فایل login.php جهت بررسی ورود و خروج کاربر

پس از اینکه کاربر اطلاعات خود را ارسال می کند، داده ها و از جمله نام کاربری و کلمه عبور او باید با آنچه که در دیتابیس سرور وجود دارد تطبیق داده شود، از اینرو به برنامه ای به یک زبان سمت سرور نیاز خواهیم داشت که در اینجا php این کار را برایمان انجام خواهد داد، کد زیر یک نمونه را نشان می دهد.



------------------------------------------------------------------

<?php
//شروع یک نشست
session_start();
//بررسی تنظیم شدن یا نشدن متغیرهای سشن
if (!isset($_SESSION["username"]) || !isset($_SESSION["password"])){
//در صورتی که متغیرهای سشن تنظیم نشده باشند، کاربر مجاز به دیدن ادامه صفحه نیست و او را به صفحه اصلی منتقل می کنیم
header("location:index.php");    
}
?>

----------------------------------------------------------------
دکمه خروج از سایت

برای ساخت یک دکمه خروج، هنگامی که کاربر وارد سایت می شود،
 ابتدا یک فایل با نام فرضی logout.php بسازید و سپس با یک فرم ساده html آن را فراخوانی کنید،
مثال زیر گویا است.
محتویات فایل logout.php:
-----------------------------------------------------------------

<?php
//شروع یک نشست
session_start();
//منقضی کردن متغیر های نشست
unset($_SESSION["username"]);
unset($_SESSION["password"]);
//پایان نشست
session_destroy();
//انتقال به صفحه اصلی یا صفحه مورد نظر
header("location:index.php");
?>

---------------------------------------------------------------

توضیح:
- همانطور که ملاحظه می کنید، در اینجا از unset برای منقضی کردن متغیرهای سشن استفاده کرده ایم.
- با تابع session_destroy یک نشست را به پایان می بریم و برای ورود مجدد کاربر، نیاز به ارسال نام کاربری و کلمه عبور است.
محتویات فرم و دکمه ساده html جهت خروج:
---------------------------------------------------------------
<form action="logout.php" method="post">
<input type="submit" value="خروج" />
</form>
---------------------------------------------------------------
توضیح:
- این فرم صرفا فایل logout.php را فراخوانی می کند و با فراخوانی آن فایل، سشن به طور کامل منقضی می شود.
- با کمی آشنایی با این روش، می توانید ایده های جالبی تعریف کنید، مثلا
پیام های خوش آمد گویی و خروج به کاربر نشان دهید، یا از نام او که در
متغیر سشن username وجود دارد، به فرض برای نمایش نام کاربری استفاده کنید.

مبحث  مربوط به سشن ها ممکن است در نگاه اول کمی پیچیده به نظر برسد،
به همین جهت در این مطلب به همین حد اکتفا می کنیم و در آموزش های بعدی،
خواهیم دید که چگونه می توان امکانات جانبی بیشتری به فرم ورود و خروج کاربر به سایت،
 افزود.




موضوع مطلب :
دوشنبه 91 اسفند 7 :: 6:12 عصر ::  نویسنده : smfatemi

چگونگی اعمال استایل ها در CSS :

به سه روش می توان استایل های CSS را اعمال کرد که در ادامه به توضیح مختصر این روش ها می پردازیم.

روش اول : استفاده از استایل های درونی (Internal Stylesheet) :

در این روش هیچ فایل جداگانه ای برای دستورات CSS ایجاد نمی شود بلکه دستورات CSS درون یک تگ <style> و در درون تگ <head> فایل HTML قرار داده می شوند. به طور مثال کد زیر را که بخشی از کد HTML است را زیر را در نظر بگیرید :

<head>

    <title>

        A Simple Document with CSS

    </title>

    <style>

        body {

            background-color: white;

            margin: 5px;

            font-family: helvetica, arial, sans-serif;

        }

 

        div#content {

            width: 75%;

            margin: 0 auto;

            padding: 10px;

            border: 1px solid #ccc;

        }

    </style>

</head>

همانطور که گفته شد استایل ها درون فایل HTML و در تگ head قرار گرفته اند. حالا این بخش از کد را در نظر بگیرید :

body {

            background-color: white;

            margin: 5px;

            font-family: helvetica, arial, sans-serif;

     }

کلمه body به مرورگر می گوید که کلیه دستوراتی که مابین {} می آید را بر روی تمام بخش های تگ body اعمال کند. هر خط که با ; خاتمه می یابد کک قانون یا دستور CSS است که خود از یک ویژگی و  یک مقدار تشکیل شده است که با : از هم جدا شده اند. اگر متوجه این دستورات نمی شوید نگران نباشید چون بعدا به طور مفصل آنها را توضیح خواهم داد.

روش دوم : استایل های درون خطی  (inline stylesheets):

در این روش استایل های مد نظر، درون تگ بازکننده المنت مورد نظر نوشته می شوند. به مثال زیر توجه کنید :

<p style="color: red;"> This is a Sample Paragraph </p>

همانطور که گفته شد دستورات CSS مانند مثال بالا درون تگ باز کننده پاراگراف قرار می گیرند و باعث می شود که متن این پاراگراف به رنگ قرمز نمایش داده شود.

روش سوم : استایل های خارجی (external stylesheets) :

در این روش کلیه دستورات CSS درون یک فایل جداگانه با پسوند css ذخیره می شوند سپس برای اعمال این دستورات روی یک فایل HTML در تگ head آن فایل به فایل css اشاره می شود. نحوه اشاره به صورت زیر است :

<link rel="stylesheet" type="text/css" href="main.css" />

قسمتی از کد که درون href=”" قرار می گیرد اشاره به محل قرار گیری فایل CSS دارد. مزیت اصلی استفاده از فایل استایل خارجی این است که برای تغییر در یک جزء خاص در کل یک وب سایت می توان فقط در فایل CSS آن تغییر را ایجاد کرد و تغییرات روی همه سایت اعمال می شود.

توصیه برای چگونگی اعمال استایل ها :

همیشه استایل های عمومی تر را در بالای فایل css خود قرار دهید  و سپس قسمت های دیگر را به ترتیب اهمیت اضافه کنید. مانند مثال زیر :

body {

    background-color: white;

    margin: 5px;

    font-family: helvetica, arial, sans-serif;

}

 

div#content {

    width: 75%;

    margin: 0 auto;

    padding: 10px;

    border: 1px solid #ccc;

}

همانطور که مشخص است ابتدا یک سری استایل عمومی در بالای فایل css و برای body در نظر گرفته شده است و سپس یک سری استایل روی یک div که id آن content است اعمال شده است. در مورد div و id بعدا توضیح خواهم داد.

خوب این درس اول CSS بود. تا اینجا باید متوجه شده باشید که از CSS برای چه منظوری استفاده می شود و همچنین یک تصویر کلی (هر چند مبهم) از دستورات CSS در ذهن شما شکل گرفته باشد. اگر این طور نیست این مطلب را باز هم مرور کنید و اگر احساس می کنید بخشی از آن ناواضح توضیح داده شده است، از طریق نظرات به من اطلاع دهید تا یا آن را اصلاح کنم و یا در درس های بعدی تاکید بیشتری روی آن داشته باشم.




موضوع مطلب :
1   2   >