PDA

View Full Version : حرفه ای: از هر IP فقط یک بار !!



xoogle.ir
یک شنبه 22 فروردین 1389, 15:41 عصر
توی سایتی که دارم میسازم هر کاربر یک صفحه شخصی داره که میتونه آدرسش رو در اختیار دیگران بذاره تا بقیه صفحه شخصی او رو بازدید کنند مثلا هر کاربر صفحه ای مثل این داره http://example.com/page/username
دیگران میتونند این صفحه رو با وارد نمودن آدرس مشاهده کنند.
حالا قراره که هر بار که این صفحه بازدید میشه به صاحب صفحه یه امتیازی تعلق بگیره مثلا برای هر بار بازدید ، صاحب صفحه 2 امتیاز بگیره و این امتیاز توی بانک ذخیره میشه.

تا این جاش مشکلی نیست و خودم راه حلش رو بلدم اما مشکل از جایی شروع شده که استاد محترممون گفت که باید کاری کنید تا از هر IP در 24 ساعت فقط یک بار به صاحب صفحه امتیاز تعلق بگیره بع عبارت دیگه اگر من صفحه http://example.com/page/ali رو بازدید کردم فقط برای بار اول 2 امتیاز به ali تعلق بگیره و اگر من تا 24 ساعت دیگه هم بی کار بودم و فقط صفحه رو رفرش کردم دیگه امتیازی به ali تعلق نگیره :عصبانی++:

راستش هنگ کردم نمیدونم چه طوری باید این کار رو انجام بدم؟
آیا احتیاج به ساخت یک جدول جدید در بانک هست؟ یعنی از ب بسم الله نمیدونم این کار رو چه جوری باید انجام بدم :ناراحت:
کمکم کنید :گریه:

امیـرحسین
یک شنبه 22 فروردین 1389, 20:10 عصر
یک جدول بسازید که این ستونها رو داشته باشه: userid - ip - timestamp
حالا وقتی یک پروفایل بازدید میشه برای ثبت بازدید، چک کنید:
اگر کاربر درحال باز از پروفایل خودش بود. هیچ کاری نکنه.
جدولی که ساختید رو براساس IP بازدیدکننده و آیدی پروفایل جستجو کنید. اگر چیزی نبود، اطلاعات رو ثبت کنید. اگر موردی پیدا شد، زمانش رو چک کنید. اختلاف مقدار timestamp از خروجی تابع ()time باید بیشتر از 84600 (24 ساعت) باشه تا یک بازدید محاسبه شه و timestamp بروز بشه.
به نمونه زیر دقت کنید:
$userId = 57;
$currentUserId = 12;
$currentUserIp = '127.0.0.01';
$timestamp = time();

if($userId == $currentUserId)
return;

$select = mysql_query("SELECT timestamp FROM `logs` WHERE userid = $userId AND ip = '$currentUserIp'");

if(mysql_num_rows($select) == 0) {

// log one visit

mysql_query("INSERT INTO `logs` (userid, ip, timestamp) VALUES($userId, '$currentUserIp', $timestamp)");

} else {
$row = mysql_fetch_assoc($select);
if( ($time - $row['timestamp']) > (24 * 60 * 60) ) {

// log one visit

mysql_query("UPDATE `logs` SET timestamp = '$timestamp' WHERE userid = $userId AND ip = '$currentUserIp'");
}
}


// Clean Up
mysql_query("DELETE FROM `logs` WHERE timestamp > (24 * 60 * 60)");
این روش یک مشکل داره و اون اینه که اطلاعات هیچوقت از جدول پاک نمیشه که توسط کوئری خط آخر این کار هم انجام میشه.

xoogle.ir
دوشنبه 23 فروردین 1389, 11:34 صبح
حیف نمیشه 100 بار تشکر کرد وگرنه این کار رو میکردم :قلب:
باید این کدی که شما دادید رو تست کنم ولی حتما جواب میده البته به گمونم query آخر که برای حذف کردن رکورد ها استفاده میشه اشتباهه چون تمام timestamp هایی که از 24 ساعت بیشتر هست رو پاک میکنه که این میشه تمام جدول :متفکر:
البته اگر اشتباه برداشت نکرده باشم حالا شما دوباره این قسمت رو چک کنید

امیـرحسین
دوشنبه 23 فروردین 1389, 20:21 عصر
بعد از 24 ساعت یعنی قراره یک بازدید محاسبه بشه دیگه. اگر اجراش کنید، می تونید بخش else کد بالا رو حذف کنید. در غیر اینصورت می تونید زمانش رو از 24 ساعت بیشتر کنید و حتی کوئری رو از اسکریپت جدا کنید تا بصورت دستی انجام شه.

yasgig
سه شنبه 24 فروردین 1389, 14:12 عصر
اینم یه نمونش که کاملا درست کار میکنه.چون خودم هم ازش استفاده می کنم:

<?php
mysql_connect('localhost','root','');
mysql_select_db('yasgig');
mysql_query("SET NAMES 'utf8'");
$date = date(Ymd);
$ip= getenv("REMOTE_ADDR");
mysql_query("INSERT INTO user_ip VALUES ('$date','$ip')");
mysql_query("DELETE FROM `user_ip` WHERE `date` AND `date` <'$date'");
$result = mysql_query("SELECT ip FROM user_ip WHERE ip='$ip'");
$number = mysql_num_rows($result);
if($number>1)
{
}else{
در این بخش امتیازتون رو وارد بانک اطلاعاتی کنید
}
?>
کافیه یه جدول با نام user_ip داشته باشی با دوتا ستون در داخل اون با نامهای date و ip هر دو از نوع text.