PDA

View Full Version : آموزش: ساخت شمارنده همه كاره براي سايت



MMSHFE
یک شنبه 21 فروردین 1390, 11:55 صبح
با سلام، اين بار يك كلاس كامل براي جمع آوري آمار بازديد سايت آماده كردم كه كدش رو ميتونيد ببينيد:


<?PHP
//Copyright محمد مصطفي شهركي @ http://www.ncis.ir
class Visits
{
private $now;

public function Visits()
{
$this->Today();
}

private function Today()
{
$this->now = new DateTime('now');
}

private function Connect()
{
mysql_connect('localhost','root','');
mysql_select_db('visits');
mysql_query('SET NAMES \'utf8\'');
}

public function Count()
{
$this->Connect();
$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = mysql_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
switch(mysql_num_rows($result))
{
case -1:
echo '<P dir="ltr" align="left">'.mysql_error().'</P>'."\n";
break;
case 0:
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id` DESC LIMIT 1');
$id = 0;
if(mysql_num_rows($result) > 0)
{
$id = mysql_result($result, 0, 0);
}
$id++;
mysql_query("INSERT INTO `counter` VALUES ('$id','$now','1')");
break;
default:
while($row = mysql_fetch_assoc($result))
{
$id = $row['id'];
mysql_query("UPDATE `counter` SET `count`=`count`+1 WHERE (`id`='$id')");
}
break;
}
}

public function GetAll()
{
$this->Connect();
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}

public function GetLastDays($days)
{
$this->Connect();
$this->Today();
$now = $this->now;
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = -1;
while($vdate <= $now)
{
$vdate->add(new DateInterval('P1D'));
$interval++;
}
if($interval < $days)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetLastDay($day)
{
$this->Connect();
$this->Today();
$now = $this->now;
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = -1;
while($vdate <= $now)
{
$vdate->add(new DateInterval('P1D'));
$interval++;
}
if($interval == $day)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetToday()
{
$this->Connect();
$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = mysql_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}
}
?>
روش استفاده از اين كلاس بدين ترتيب هست:
ابتدا يك جدول به نام visits در DB خودتون بسازين و فيلدهاي id و vdate و count رو به ترتيب با انواع int و date و int ايجاد كرده و فيلد id رو كليد اصلي (Primary Key) بگذارين. بعد به فايل visits.php رفته و درون متد Connect، نام سرور، نام كاربري، رمز عبور و نام DB رو مطابق با تنظيمات سايت خودتون اصلاح كنيد.
حالا براي استفاده كافيه فايل visits.php رو در هر صفحه كه ميخواين آمار بازديد رو داشته باشين، ضميمه كنيد.
فهرست متدهاي عمومي موجود در كلاس Visits به صورت زير هست:
Count
اين متد عمل شمارش رو انجام ميده. اگه ركورد مربوط به امروز رو در جدول پيدا كرد، به اون ركورد يكي اضافه ميكنه و اگه پيدا نكرد، يك ركورد براي امروز ميسازه. دقت كنيد كه اگه ميخواين بازديد از صفحه جاري هم به آمار بازديد يكي اضافه كنه، اين متد رو بايد صدا بزنيد وگرنه فقط ميتونيد از ساير امكانات كلاس يعني نمايش آمار بازديد استفاده كنيد. عمداً اين قسمت رو جدا كردم چون در برخي از موارد نميخوايم آمار اضافه بشه. مثلاً صفحه نمايش آمار بازديد خودش نبايد شمرده بشه!
GetAll
آمار بازديد كل رو بر ميگردونه.
GetLastDays
مجموع آمار بازديد چند روز گذشته رو محاسبه ميكنه. تعداد روزها رو بايد بعنوان پارامتر براش بفرستيد.
GetLastDay
آمار دقيق روزهاي گذشته رو ميده. فرقش با قبلي در اينه كه در قبلي، اگه مثلاً 5 رو بعنوان پارامتر بدين، مجموع آمار بازديد 5 روز قبل رو ميده ولي اين يكي، دقيقاً آمار پنجمين روز قبل از امروز رو ميگه.
GetToday
آمار بازديد امروز رو اعلام ميكنه. البته اگه دو متد قبلي رو با پارامتر 0 صدا بزنيد هم همينكار انجام ميشه ولي اين مورد رو براي راحتي بيشتر گذاشتم.
در ادامه، يك مثال ميبينيد كه از اين كلاس استفاده كرده:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<TITLE>Visits</TITLE>
</HEAD>
<BODY>
<?PHP
require_once('visits.php');
$visits = new Visits();
$visits->Count();
echo '<B>Visits</B><BR/>'."\n";
echo 'Total&nbsp;'.$visits->GetAll().'<BR/>'."\n";
echo 'Today&nbsp;'.$visits->GetToday().'<BR/>'."\n";
echo 'Yesterday&nbsp;'.$visits->GetLastDay(1).'<BR/>'."\n";
echo 'The day before yesterday&nbsp;'.$visits->GetLastDay(2).'<BR/>'."\n";
echo 'Sum of 2 days ago&nbsp;'.$visits->GetLastDays(2).'<BR/>'."\n";
echo 'Last week&nbsp;'.$visits->GetLastDays(7).'<BR/>'."\n";
echo 'Last month&nbsp;'.$visits->GetLastDays(30).'<BR/>'."\n";
echo 'Last year&nbsp;'.$visits->GetLastDays(365).'<BR/>'."\n";
?>
</BODY>
</HTML>
نمونه خروجي:


Visits
Total 59
Today 31
Yesterday 15
The day before yesterday 13
Sum of 2 days ago 46
Last week 59
Last month 59
Last year 59
اميدوارم كه اين كلاس مورد توجه دوستان قرار بگيره. مزيت اصلي اين كلاس اينه كه براي هر روز، فقط يك ركورد داريم و فشار زيادي به سرور نمياد. مثلاً در طول يك سال، فقط 365 ركورد خواهيم داشت كه با توجه به ظرفيتهاي MySQL ميشه گفت فشار وارد شده به سرور در حد صفر هست.
موفق و مؤيد باشيد.
-----
ویرایش: نسخه دوم اضافه شد.

mamali-mohammad
یک شنبه 21 فروردین 1390, 14:52 عصر
ممنون
خیلی خوبه
فقط یه سوال :
اگه بخوایم هر مطلبی که پست میشه ، بازدید مشخص خودشو داشته باشه باید چیکار کنیم ؟

MMSHFE
دوشنبه 22 فروردین 1390, 07:22 صبح
با سلام، براي اين كار، بايد يك سري تغييرات توي ساختارش ايجاد بشه. به زودي يك نسخه تكميل شده از اين كلاس رو آماده ميكنم.
موفق باشيد.

sargardoon
دوشنبه 22 فروردین 1390, 07:27 صبح
دستتون درد نکنه،
میشه با گذاشتن و چک کردن IP تبدیلش کرد به unique visitor
برای گرفتن IP کاربر

$_SERVER['REMOTE_ADDR'];

hamed-php
دوشنبه 22 فروردین 1390, 11:20 صبح
سلام

ممنون از این کلاس

فقط چرا آمار بازدید امروز رو به ازای هر رفرش 2 بار افزایش میدهد. در بامک هم 3 بار افزایش میابد؟

MMSHFE
دوشنبه 22 فروردین 1390, 11:56 صبح
مطمئنيد؟ من تستش كردم و كاملاً درست كار ميكنه. شايد توي فايلي ازش استفاده كردين كه چند بار include شده. منظورم اينه كه احتمالاً متد Count رو چند بار در صفحه صدا ميزنيد (توي يك فايل يا توي فايلهاي مختلف كه include شدن).

mamali-mohammad
سه شنبه 23 فروردین 1390, 13:57 عصر
سلام
جناب وقت کردید برای هر Id بازدید جداگانه بنویسید ؟

MMSHFE
سه شنبه 23 فروردین 1390, 20:11 عصر
با سلام، دارم روش كار ميكنم. به محض تكميل، همينجا ميگذارم. موفق باشيد.

zabihollah
چهارشنبه 21 اردیبهشت 1390, 14:53 عصر
با سلام، اين بار يك كلاس كامل براي جمع آوري آمار بازديد سايت آماده كردم كه كدش رو ميتونيد ببينيد:


<?PHP
//Copyright محمد مصطفي شهركي @ http://www.ncis.ir
class Visits
{
private $now;

public function Visits()
{
$this->Today();
}

private function Today()
{
$this->now = new DateTime('now');
}

private function Connect()
{
mysql_connect('localhost','root','');
mysql_select_db('visits');
mysql_query('SET NAMES \'utf8\'');
}

public function Count()
{
$this->Connect();
$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = mysql_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
switch(mysql_num_rows($result))
{
case -1:
echo '<P dir="ltr" align="left">'.mysql_error().'</P>'."\n";
break;
case 0:
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id` DESC LIMIT 1');
$id = 0;
if(mysql_num_rows($result) > 0)
{
$id = mysql_result($result, 0, 0);
}
$id++;
mysql_query("INSERT INTO `counter` VALUES ('$id','$now','1')");
break;
default:
while($row = mysql_fetch_assoc($result))
{
$id = $row['id'];
mysql_query("UPDATE `counter` SET `count`=`count`+1 WHERE (`id`='$id')");
}
break;
}
}

public function GetAll()
{
$this->Connect();
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}

public function GetLastDays($days)
{
$this->Connect();
$this->Today();
$now = $this->now;
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = -1;
while($vdate <= $now)
{
$vdate->add(new DateInterval('P1D'));
$interval++;
}
if($interval < $days)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetLastDay($day)
{
$this->Connect();
$this->Today();
$now = $this->now;
$result = mysql_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = -1;
while($vdate <= $now)
{
$vdate->add(new DateInterval('P1D'));
$interval++;
}
if($interval == $day)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetToday()
{
$this->Connect();
$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = mysql_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}
}
?>
روش استفاده از اين كلاس بدين ترتيب هست:
ابتدا يك جدول به نام visits در DB خودتون بسازين و فيلدهاي id و vdate و count رو به ترتيب با انواع int و date و int ايجاد كرده و فيلد id رو كليد اصلي (Primary Key) بگذارين. بعد به فايل visits.php رفته و درون متد Connect، نام سرور، نام كاربري، رمز عبور و نام DB رو مطابق با تنظيمات سايت خودتون اصلاح كنيد.
حالا براي استفاده كافيه فايل visits.php رو در هر صفحه كه ميخواين آمار بازديد رو داشته باشين، ضميمه كنيد.
فهرست متدهاي عمومي موجود در كلاس Visits به صورت زير هست:
Count
اين متد عمل شمارش رو انجام ميده. اگه ركورد مربوط به امروز رو در جدول پيدا كرد، به اون ركورد يكي اضافه ميكنه و اگه پيدا نكرد، يك ركورد براي امروز ميسازه. دقت كنيد كه اگه ميخواين بازديد از صفحه جاري هم به آمار بازديد يكي اضافه كنه، اين متد رو بايد صدا بزنيد وگرنه فقط ميتونيد از ساير امكانات كلاس يعني نمايش آمار بازديد استفاده كنيد. عمداً اين قسمت رو جدا كردم چون در برخي از موارد نميخوايم آمار اضافه بشه. مثلاً صفحه نمايش آمار بازديد خودش نبايد شمرده بشه!
GetAll
آمار بازديد كل رو بر ميگردونه.
GetLastDays
مجموع آمار بازديد چند روز گذشته رو محاسبه ميكنه. تعداد روزها رو بايد بعنوان پارامتر براش بفرستيد.
GetLastDay
آمار دقيق روزهاي گذشته رو ميده. فرقش با قبلي در اينه كه در قبلي، اگه مثلاً 5 رو بعنوان پارامتر بدين، مجموع آمار بازديد 5 روز قبل رو ميده ولي اين يكي، دقيقاً آمار پنجمين روز قبل از امروز رو ميگه.
GetToday
آمار بازديد امروز رو اعلام ميكنه. البته اگه دو متد قبلي رو با پارامتر 0 صدا بزنيد هم همينكار انجام ميشه ولي اين مورد رو براي راحتي بيشتر گذاشتم.
در ادامه، يك مثال ميبينيد كه از اين كلاس استفاده كرده:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<TITLE>Visits</TITLE>
</HEAD>
<BODY>
<?PHP
require_once('visits.php');
$visits = new Visits();
$visits->Count();
echo '<B>Visits</B><BR/>'."\n";
echo 'Total&nbsp;'.$visits->GetAll().'<BR/>'."\n";
echo 'Today&nbsp;'.$visits->GetToday().'<BR/>'."\n";
echo 'Yesterday&nbsp;'.$visits->GetLastDay(1).'<BR/>'."\n";
echo 'The day before yesterday&nbsp;'.$visits->GetLastDay(2).'<BR/>'."\n";
echo 'Sum of 2 days ago&nbsp;'.$visits->GetLastDays(2).'<BR/>'."\n";
echo 'Last week&nbsp;'.$visits->GetLastDays(7).'<BR/>'."\n";
echo 'Last month&nbsp;'.$visits->GetLastDays(30).'<BR/>'."\n";
echo 'Last year&nbsp;'.$visits->GetLastDays(365).'<BR/>'."\n";
?>
</BODY>
</HTML>
نمونه خروجي:


Visits
Total 59
Today 31
Yesterday 15
The day before yesterday 13
Sum of 2 days ago 46
Last week 59
Last month 59
Last year 59
اميدوارم كه اين كلاس مورد توجه دوستان قرار بگيره. مزيت اصلي اين كلاس اينه كه براي هر روز، فقط يك ركورد داريم و فشار زيادي به سرور نمياد. مثلاً در طول يك سال، فقط 365 ركورد خواهيم داشت كه با توجه به ظرفيتهاي MySQL ميشه گفت فشار وارد شده به سرور در حد صفر هست.
موفق و مؤيد باشيد.
سلام
وقتي كد مورد نظر را در صفحه قرار ميدم اين خطا را ميده:
Fatal error: Call to undefined method DateTime::add() in /home/snpardis/public_html/visits.php on line 113

MMSHFE
پنج شنبه 22 اردیبهشت 1390, 07:31 صبح
با سلام، دوست گرامي، اين كلاس براي PHP 5.3 به بالاتر نوشته شده كه كلاس DateTime توش وجود داره. موفق باشيد.

aliminaei01
چهارشنبه 25 مرداد 1391, 16:49 عصر
سلام و خسته نباشید -
این فایل ضمیمه رو می شه راهنمائی کنید که چجوری بکار گیری کنم ؟

MMSHFE
جمعه 27 مرداد 1391, 08:32 صبح
کار سختی نیست. اول باید مرحله آماده سازی رو انجام بدیم:
1- توی دیتابیس سایتتون یک جدول به اسم counter با فیلدهای زیر بسازین:
id از نوع int و کلید اصلی (Primary Key)
vdate از نوع char با طول 10
count از نوع int
2- کدی که گذاشتم رو توی یک فایل به اسم visits.class.php ذخیره کنید و خط اول و دوم تابع connect رو اصلاح کنید و نام سرور، نام کاربری، رمز عبور و نام دیتابیس خودتون رو به ترتیب به جای 'localhost' و 'root' و '' و 'visits' بگذارین.
حالا توی هر صفحه که میخواین با این کلاس کار کنید، یک شئ از کلاس ایجاد کنید:


require_once 'visits.class.php';
$visits = new Visits();

بعد اگه میخواین با هر بار بازدید اون صفحه، تعداد بازدیدهای سایت یک واحد اضافه بشه، توی اون صفحه تابع Count رو صدا بزنید:

$visits->Count();
اگه خواستین آمار بازدید و... رو هم به دست بیارین، کافیه برحسب نیاز از سایر توابع (GetAll و...) استفاده کنید که مثالش رو گذاشتم.
موفق باشید.

armsoftpc
پنج شنبه 09 شهریور 1391, 21:42 عصر
به نام خدا
با عرض سلام به همه ی دوستان و با اجازه از آقای شهرکی
من روی کد کار کردم و این کد چند مشکل داشت که همشون رو رفع کردم، البته این توسعه ی این کد ادامه دارد و به زودی نسخه های بهتری از اون رو منتشر می کنم.


استفاده از سیستم قدیمی mysql برای ارتباط با پایگاه داده که در php6 دیگر پشتیبانی نخواهد شد.
عدم پشتیبانی از php های نسخه قبل تر از 5.3 که این مهم ترین مشکل این اسکریپت است ، چون اکثر هاست های اشتراکی هنوز بر روی سرور 5.2.17 هستند، کد توسعه یافته از php 5.2 بخوبی پشتیبانی می کند.
تکرار کد

اینم کد:

<?PHP
//Copyright محمد مصطفي شهركي @ http://www.ncis.ir
// and Armpc @ prgtools.mihanblog.com
class Visits
{
private $now;

public function Visits()
{
$this->Today();
}

private function Today()
{
$this->now = new DateTime('now');
}


public function Count()
{

$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = arm_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
switch(mysqli_num_rows($result))
{
case -1:
echo '<P dir="ltr" align="left">'.mysqli_error().'</P>'."\n";
break;
case 0:
$result = arm_query('SELECT * FROM `counter` ORDER BY `id` DESC LIMIT 1');
$id = 0;
if(mysqli_num_rows($result) > 0)
{
$id = mysqli_result($result, 0, 0);
}
$id++;
arm_query("INSERT INTO `counter` VALUES ('$id','$now','1')");
break;
default:
while($row = mysqli_fetch_assoc($result))
{
$id = $row['id'];
arm_query("UPDATE `counter` SET `count`=`count`+1 WHERE (`id`='$id')");
}
break;
}
}

public function GetAll()
{
$result = arm_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysqli_num_rows($result) > 0)
{
while($row=mysqli_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}

public function GetLastDays($days)
{
$this->Today();
$now = $this->now;
$result = arm_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysqli_num_rows($result) > 0)
{
while($row=mysqli_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = -1;
while($vdate <= $now)
{
$vdate->modify("+1 day");
$interval++;
}
if($interval < $days)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetLastDay($day)
{

$this->Today();
$now = $this->now;
$result = arm_query('SELECT * FROM `counter` ORDER BY `id`');
$visits = 0;
if(mysqli_num_rows($result) > 0)
{
while($row=mysqli_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = -1;
while($vdate <= $now)
{
$vdate->modify("+1 day");
$interval++;
}
if($interval == $day)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetToday()
{

$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = arm_query("SELECT * FROM `counter` WHERE (`vdate`='$now') ORDER BY `id`");
$visits = 0;
if(mysqli_num_rows($result) > 0)
{
while($row=mysqli_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}
}
?>
به جای arm_query از mysqli_query استفاده کنید.

رضا قربانی
جمعه 10 شهریور 1391, 22:05 عصر
من روی کد کار کردم و این کد چند مشکل داشت که همشون رو رفع کردم، البته این توسعه ی این کد ادامه دارد و به زودی نسخه های بهتری از اون رو منتشر می کنم.
چقدر باحال.
کپی رایت در جولوی چشم ارائه دهنده :لبخند:

elimiz
یک شنبه 12 شهریور 1391, 23:01 عصر
بدلیل درخواست دوستان

armsoftpc
شنبه 18 شهریور 1391, 13:02 عصر
چقدر باحال.
کپی رایت در جولوی چشم ارائه دهنده :لبخند:منظورتون رو متوجه نمی شم، من فقط اشکالات کد رو رفع کردم، چی ربطی به کپی رایت داره، اصلا همون بهتر که هیچ کدی رو توسعه ندی!
در ضمن آقای شهرکی اگر شما راضی نیستید ، دو سوت هر پست رو حذف می کنم، منتظر نظرتون هستم.
اومدیم ثواب کنیم ، کباب شدیم.

رضا قربانی
شنبه 18 شهریور 1391, 16:04 عصر
منظورتون رو متوجه نمی شم، من فقط اشکالات کد رو رفع کردم، چی ربطی به کپی رایت داره، اصلا همون بهتر که هیچ کدی رو توسعه ندی!
در ضمن آقای شهرکی اگر شما راضی نیستید ، دو سوت هر پست رو حذف می کنم، منتظر نظرتون هستم.
اومدیم ثواب کنیم ، کباب شدیم.
چرا داغ می کنید . شوخی بود . این چیه که انقدر بزرگش می کنی .
شما توسعه بده ، موقع توسعه بگید با کمک دوست خوبم آقای شهرکی. :لبخند:

hamed-php
شنبه 18 شهریور 1391, 18:14 عصر
سلام

برای نمایش افراد آنلاین چطور؟ ایده ای دارید

armsoftpc
شنبه 18 شهریور 1391, 18:22 عصر
با سلام

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

armsoftpc
شنبه 18 شهریور 1391, 18:24 عصر
برای نمایش افراد آنلاین چطور؟ ایده ای دارید
سلام دوست عزیز این کار به یه جدول تمپروری نیاز داره(نه این که جدول نوعش از نوع مموری باشه، بلکه اطلاعاتش هی پاک و هی ثبت بشه)
به تاپیک زیر یه نگاه بنداز کلاسش رو گذاشتم:
http://barnamenevis.org/showthread.php?353889-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7-%D9%88-%DA%A9%D8%AF%D9%87%D8%A7%DB%8C-%D9%85%D9%81%DB%8C%D8%AF-%D8%AF%D8%B1-php

tehro0n
شنبه 20 آبان 1391, 11:29 صبح
دوستی برای نمایش آمارگیر اصرار داشت که از این روش استفاده کرد نظر شما چیست؟


CREATE TABLE `counter` (
`visit_date` int(10) NOT NULL,
`url_id` int(11) NOT NULL,
`nation_id` int(11) NOT NULL,
`visit_count` int(11) DEFAULT NULL,
PRIMARY KEY (`visit_date`,`url_id`,`nation_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


$q2 = "INSERT INTO
`counter`
(
`visit_date`,
url_id,
nation_id,
`visit_count`
)
VALUE (
%s,
(select id from sites where url='%s'),
(select id from nation where ip='%s'),
%s
)
ON DUPLICATE KEY UPDATE visit_count=visit_count+1;";


BaseDAL::GetInstance()->ExecuteNoneQuery($q2, array(date('Ymd'), $url, $ip, 1));


public static function GetVisitCount($date = false)
{
$where = '';
if ($date)
$where = 'where visit_date=' . $date;
$q = "select sum(visit_count) from counter $where";
$num = BaseDAL::GetInstance()->GetScalar($q);
if (empty($num))
$num = 0;
return $num;
}


public static function GetTodayVisitCount()
{
return self::GetVisitCount(date('Ymd'));
}

public static function GetYesterdayVisitCount()
{
return self::GetVisitCount(date("Ymd", strtotime("-1 day")));
}

imanitc
شنبه 20 آبان 1391, 12:29 عصر
اگر بشه بيشترين بازديد کننده در روز رو هم ذخيره کرد خيلي خوب ميشه فکر کنم کار خيلي ساده باشه منتظر نسخه جديد و کامل از جناب شهرکي هستيم

tehro0n
شنبه 20 آبان 1391, 12:45 عصر
چند سئوال هم از مدیریت محترم که این برنامه را نوشتند یا دوستانی که در این زمینه ها اطلاعاتی دارند دارم که شاید ابتدایی باشه ولی خوب سئواله دیگه!
Keyname بیشتر برای id هایی که INC میشن PRIMARY می گذاریم ؟ چه فرقی با index داره؟
utf8_bin چه فرقی با مدل ساده اش یا بقیه داره؟
Type جدول شما InnoDB هست چه فرقی با MyISAM که پیش فرض خود phpMyAdmin هست داره؟
در این کدی که نوشتید برای نمایش هر نوع visit به mySql کانکت میشه؟ اگه اینطوره بهتر نبود که یکبار کانکت بشیم و سپس کارهای لازم رو انجام بدیم؟
و اینکه اگر برای چند سایت بخواهیم این سرویس شما را پوشش بدیم و آدرس های سایت مختلفی داشته باشه، روش شما که تاریخ ها ردیفی باشند و هروز را بشمارند که پس از دو سال اگه 30000 یوزر داشته باشیم میشه 30000 * 365 * 2 ردیف ، این روش بهتر است یا از 80 ستون استفاده کردن؟ که در 80 ستون که روزهای مختلف به جای INC شدن در این جدول UPDATE بشن و شامل 30 روز و 12 ماه و 2 سال باشه؟ که البته در این جدول 40 ستون تعداد بازدید داشته باشه و 40 ستون تعداد کاربر که رو هم میشه حدود 80 ستون ولی 30000 ردیف خواهد داشت! کدام بهتر است و فشار کمتری به سرور میاره؟

MMSHFE
شنبه 20 آبان 1391, 19:15 عصر
با سلام، پاسخ سؤالاتتون به ترتيب:
1- كليد اصلي تفاوتي كه با index معمولي داره اينه كه جدول در حافظه هميشه بر اساس اين فيلد مرتب هست و فقط هم يك كليد اصلي داريم ولي Index ميتونه چندتا باشه. ضمناً كليد اصلي علاوه بر Index خاصيت Unique رو هم داره.
2- utf8_bin كدگذاري كامل يونيكد هست و تمامي كاركترهاي يونيكد رو پشتيباني ميكنه و نسبت به بزرگي و كوچكي حروف هم حساسه.
3- در هربار اجراي اسكريپت، در معماري جديد MySQL اگه اتصال قبلي هنوز برقرار باشه، اتصال جديدي ايجاد نميشه و از همون استفاده ميشه و در انتهاي اسكريپت اتصال بسته ميشه.
4- دقت كنيد كه اين اسكريپت اصلاً كاري به كاربران نداره و براي 2 سال فقط 2 * 365 ركورد خواهيم داشت. براي سايتهاي مختلف هم جداول مختلف ايجاد كنيد.

tehro0n
شنبه 20 آبان 1391, 23:33 عصر
البته سئوال آخر را برای توسعه عرض کردم که بخواهیم از سرویس دهنده استفاده کنیم کدام جدول بهتره داشته باشیم؟
و اینکه این موضوع را هم که مطرح کردم لطف می کنید بفرمایید به چه صورت است

Type جدول شما InnoDB هست چه فرقی با MyISAM که پیش فرض خود phpMyAdmin هست داره؟

در کدهایتان به موردی برخوردم که شما از ORDER BY `id` در جایی که فقط یک خروجی داریم استفاده کردید، مگه ORDER BY `id` پس از خروجی ها آن ها را مرتب نمی کند؟ یا اینکه اگر نوشته شود کوئری به ترتیب id جستجو هم می کند!

tehro0n
یک شنبه 21 آبان 1391, 17:11 عصر
اگر بشه بيشترين بازديد کننده در روز رو هم ذخيره کرد خيلي خوب ميشه فکر کنم کار خيلي ساده باشه منتظر نسخه جديد و کامل از جناب شهرکي هستيم

خوب این مورد شما را با تغییرات کلی اسکریپت آقای شهرکی انجام دادم که فکر کنم اسکریپت بهینه تری شده باشه، دوستان تست بگیرید اگه در کدنویسی موردی بود که باید تصحیی بشه مطرح کنید، مخصوصا در مورد بسته شدن MySqli یا Result که بعضی ها می گن php خودش می بنده اما من با توضیحاتی که در MySqli خوندم توضیح داده بود برای بسته شدن close کنید!

ابتدا تغییری در دیتابیس که آن را INC کردم
-- phpMyAdmin SQL Dump
-- version 3.5.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Nov 11, 2012 at 02:59 PM
-- Server version: 5.5.25a
-- PHP Version: 5.4.4

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `visits`
--

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

--
-- Table structure for table `counter`
--

CREATE TABLE IF NOT EXISTS `counter` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vdate` date NOT NULL,
`count` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=6 ;

--
-- Dumping data for table `counter`
--

INSERT INTO `counter` (`id`, `vdate`, `count`) VALUES
(1, '2011-03-18', 13),
(2, '2011-04-09', 15),
(3, '2011-04-10', 30),
(4, '2012-11-10', 2),
(5, '2012-11-11', 40);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

سپس تغییرات کلی در فایل visits.php

<?PHP
/*
Copyright محمد مصطفي شهركي @ http://www.ncis.ir
Upgraded By Arman Rezaei @ http://www.toolsir.com
*/
class Counter
{
private function Date()
{
$this->now = new DateTime('now');
}

public function Counter()
{
$mysqli = new mysqli('localhost', 'root', '', 'visits');
// check connection
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
} else {
$mysqli->set_charset("utf8"); // change character set to utf8
$this->mysqli = $mysqli;
}
}

public function Update()
{
$mysqli = $this->mysqli;
$this->Date();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = $mysqli->query("SELECT `id` FROM `counter` WHERE `vdate`='$now'");
$res = $result->fetch_assoc();
if ($result->num_rows == 1)
$mysqli->query("UPDATE `counter` SET `count`=`count`+1 WHERE `id`={$res['id']}");
else
$mysqli->query("INSERT INTO `counter` (`vdate`, `count`) VALUES ('$now',1)");
// close result set
$result->free();
// close connection
$mysqli->close();
}

public function GetToday()
{
$mysqli = $this->mysqli;
$this->Date();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = $mysqli->query("SELECT `count`+1 AS `count` FROM `counter` WHERE `vdate`='$now'");
$res = $result->fetch_assoc();
// close result set
$result->free();
return $res['count'];
}

public function GetSumLastDays($days)
{
$mysqli = $this->mysqli;
$this->Date();
$now = $this->now;
$today = $now->format('Y-m-d');
$now->sub(new DateInterval('P'.$days.'D'));
$lastdays = $now->format('Y-m-d');
$result = $mysqli->query(
"SELECT
SUM(`count`)+1 AS `SumLastDays`
FROM
`counter`
WHERE
`vdate` <= '$today'
AND
`vdate` >= '$lastdays'");

$res = $result->fetch_assoc();
// close result set
$result->free();
return ($res['SumLastDays'] > 0) ? $res['SumLastDays'] : 0;
}

public function GetLastDay($day)
{
$mysqli = $this->mysqli;
$this->Date();
$now = $this->now;
$now->sub(new DateInterval('P'.$day.'D'));
$lastday = $now->format('Y-m-d');
$result = $mysqli->query("SELECT `count` FROM `counter` WHERE `vdate` = '$lastday'");
$res = $result->fetch_assoc();
// close result set
$result->free();
return ($res['count'] > 0) ? $res['count'] : 0;
}

public function GetMaxDay()
{
$mysqli = $this->mysqli;
$this->Date();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = $mysqli->query(
"SELECT
`count`,`vdate`
FROM
`counter`
WHERE
`count`=(SELECT MAX(`count`) FROM `counter` WHERE `vdate` != '$now')");
$res = $result->fetch_assoc();
// close result set
$result->free();
return $res['count'].' on '.$res['vdate'];
}

public function GetTotal()
{
$mysqli = $this->mysqli;
$result = $mysqli->query("SELECT SUM(`count`)+1 AS `total` FROM `counter`");
$res = $result->fetch_assoc();
// close result set
$result->free();
return $res['total'];
}
}
?>

در مورد کلاس بیشترین بازدید ابتدا از تابع MAX در phpMyAdmin استفاده کردم اما تاریخ بیشترین بازدید رو درست بر نمی گرداند! نمی دونم چرا.. اگه دوستان تونستند به همین شکل MAX ویرایش کنند

در نهایت نحوه نمایش خروجی ها

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<TITLE>Visits</TITLE>
</HEAD>
<BODY>
<?PHP
require_once('visits.php');
$visits = new Counter();
echo '<B>Visits</B><BR/>'."\n";
echo 'Total&nbsp;'.$visits->GetTotal().'<BR/>'."\n";
echo 'Today&nbsp;'.$visits->GetToday().'<BR/>'."\n";
echo 'Yesterday&nbsp;'.$visits->GetLastDay(1).'<BR/>'."\n";
echo 'The day before yesterday&nbsp;'.$visits->GetLastDay(2).'<BR/>'."\n";
echo 'Sum of 2 days ago&nbsp;'.$visits->GetSumLastDays(2).'<BR/>'."\n";
echo 'Last week&nbsp;'.$visits->GetSumLastDays(7).'<BR/>'."\n";
echo 'Last month&nbsp;'.$visits->GetSumLastDays(30).'<BR/>'."\n";
echo 'Last year&nbsp;'.$visits->GetSumLastDays(365).'<BR/>'."\n";
echo 'Most viewed&nbsp;'.$visits->GetMaxDay().'<BR/>'."\n";
$visits->Update();
?>
</BODY>
</HTML>

MMSHFE
یک شنبه 21 آبان 1391, 21:22 عصر
دوستان عزیز، الوعده وفا. اینم از نسخه جدید که روی تمام نگارشهای PHP کار میکنه و نیازی هم به کلاس DateTime نداره. بعلاوه مواردی مثل استخراج روزهای مربوط به حداکثر بازدید و... هم بهش اضافه شده. کد برنامه هم خیلی بهینه سازی شده تا فشار کمتری روی سرور بیاد. توضیحات هم تاحدودی بهش اضافه شده. منتظر نظر دوستان هستم.
و اما کدها:
1- ساختار دیتابیس:

-- phpMyAdmin SQL Dump
-- version 3.4.9
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Nov 11, 2012 at 06:12 PM
-- Server version: 5.5.20
-- PHP Version: 5.3.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `visits`
--

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

--
-- Table structure for table `visits`
--

DROP TABLE IF EXISTS `visits`;
CREATE TABLE IF NOT EXISTS `visits` (
`id` int(11) NOT NULL,
`vdate` char(10) COLLATE utf8_bin NOT NULL,
`counter` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

--
-- Dumping data for table `visits`
--

INSERT INTO `visits` (`id`, `vdate`, `counter`) VALUES
(1, '1391/03/16', 677037),
(2, '1391/03/17', 35),
(3, '1391/03/18', 28),
(4, '1391/03/19', 180),
(5, '1391/03/20', 55),
(6, '1391/03/21', 146),
(7, '1391/03/23', 4),
(8, '1391/03/27', 111),
(9, '1391/03/31', 1),
(10, '1391/04/08', 34),
(11, '1391/04/09', 80),
(12, '1391/04/10', 1),
(13, '1391/04/11', 3),
(14, '1391/04/12', 12),
(15, '1391/05/15', 6),
(16, '1391/07/02', 7),
(17, '1391/07/07', 4),
(18, '1391/07/16', 1),
(19, '1391/07/25', 1),
(20, '1391/08/14', 1),
(21, '1391/08/20', 7),
(22, '1391/08/21', 36);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

2- کلاس Visits (فایل visits.class.php) :


<?php
//Copyright محمد مصطفی شهركی @ http://www.ncis.ir
define('D_HOST', 'localhost');
define('D_USER', 'root' );
define('D_PASS', '' );
define('D_NAME', 'visits' );
define('DTABLE', 'visits' );
// Visits Class
class Visits {
private $con;
private $now;
private $vDate;
// Constructor
public function Visits($IsShamsi = false) {
if($IsShamsi) {
require_once 'jdf.php';
$this->vDate = 'jdate';
}
else {
$this->vDate = 'date';
}
$this->Connect();
$this->Today();
}
// Calculate current timestamp
private function Today() {
$this->now = time();
}
// Connect to DB
private function Connect() {
if($this->con == null || !mysql_ping($this->con)) {
$this->con = mysql_connect(D_HOST, D_USER, D_PASS);
mysql_select_db(D_NAME, $this->con);
mysql_query('SET NAMES \'utf8\'', $this->con);
}
}
// Calculate a unique ID to use for the new inserted record
private function GetNewID() {
$this->Connect();
$id = 0;
$result = mysql_query('SELECT MAX(`id`) AS `max_id` FROM `' . DTABLE . '`', $this->con);
if($result && mysql_num_rows($result) > 0) {
$id = mysql_result($result, 0, 0);
}
$id++;
return $id;
}
// Get the count of a specified timestamp
private function GetCount($timestamp) {
$this->Connect();
$today = tr_num(call_user_func($this->vDate, 'Y/m/d', $timestamp));
$visits = 0;
$result = mysql_query('SELECT * FROM `' . DTABLE . "` WHERE (`vdate`='{$today}') ORDER BY `id`", $this->con);
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
$visits += $row['counter'];
}
}
return $visits;
}
// Count the current visit
public function DoCount() {
$this->Connect();
$this->Today();
$today = tr_num(call_user_func($this->vDate, 'Y/m/d', $this->now));
$result = mysql_query('SELECT * FROM `' . DTABLE . "` WHERE (`vdate`='{$today}') ORDER BY `id`", $this->con);
switch(mysql_num_rows($result)) {
case -1:
echo '<p dir="ltr" align="left">' . mysql_error() . '</p>' . PHP_EOL;
break;
case 0:
$id = $this->GetNewID();
mysql_query('INSERT INTO `' . DTABLE . "` VALUES ('{$id}','{$today}','1')", $this->con);
break;
default:
while($row = mysql_fetch_assoc($result)) {
$id = $row['id'];
mysql_query('UPDATE `' . DTABLE . "` SET `counter`=`counter`+1 WHERE (`id`='{$id}')", $this->con);
}
break;
}
}
// Get the count of all visits from DB
public function GetAll() {
$this->Connect();
$result = mysql_query('SELECT SUM(`counter`) AS `counter` FROM `' . DTABLE . '` ORDER BY `id`', $this->con);
$visits = ($result && mysql_num_rows($result) > 0 ? mysql_result($result, 0, 0) : 0);
return $visits;
}
// Get sum of visit counts of previous desired days
public function GetLastDays($days) {
$this->Connect();
$this->Today();
$ts = $this->now;
$visits = 0;
for($i = 0; $i < $days; $i++) {
$visits += $this->GetCount($ts);
$ts -= 86400;
}
return $visits;
}
// Get visit count of the exact previous n-th day
public function GetLastDay($day) {
$this->Connect();
$this->Today();
$ts = $this->now;
for($i = 0; $i < $day; $i++) {
$ts -= 86400;
}
$visits = $this->GetCount($ts);
return $visits;
}
// Get visit count of today
public function GetToday() {
$this->Connect();
$this->Today();
$visits = $this->GetCount($this->now);
return $visits;
}
// Get maximum visits of previous n/all day(s)
public function GetMax($days = 0) {
$this->Connect();
$this->Today();
$ts = $this->now;
$maxDays = array();
if($days == 0) {
$result = mysql_query('SELECT * FROM `' . DTABLE . '` WHERE (`counter`=(SELECT MAX(`counter`) AS `max` FROM `' . DTABLE . '`)) ORDER BY `id`');
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
$maxDays[] = array('vdate' => $row['vdate'], 'counter' => $row['counter']);
}
}
}
else {
$max = 0;
$vDates = array();
for($i = 0; $i < $days; $i++) {
$visits = $this->GetCount($ts);
if($max < $visits) {
$max = $visits;
$vDates[] = tr_num(call_user_func($this->vDate, 'Y/m/d', $ts));
}
$ts -= 86400;
}
foreach($vDates as $vDate) {
$result = mysql_query('SELECT * FROM `' . DTABLE . "` WHERE (`vdate`='{$vDate}') ORDER BY `id`");
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
$maxDays[] = array('vdate' => $row['vdate'], 'counter' => $row['counter']);
}
}
}
}
return $maxDays;
}
}
?>

3- مثالی از نحوه استفاده (فایل index.php) :


<!doctype html>
<html>
<head>
<title>Visits Class DEMO</title>
<meta charset="utf-8">
</head>
<body>
<?php
require_once 'visits.class.php';
$visits = new Visits(true);
$visits->DoCount();
echo '<b>Visits</b><br/>' . PHP_EOL;
echo 'Total ' . $visits->GetAll() . '<br/>' . PHP_EOL;
echo 'Today ' . $visits->GetToday() . '<br/>' . PHP_EOL;
echo 'Yesterday ' . $visits->GetLastDay(1) . '<br/>' . PHP_EOL;
echo 'The day before yesterday ' . $visits->GetLastDay(2) . '<br/>' . PHP_EOL;
echo 'Sum of 2 days ago ' . $visits->GetLastDays(2) . '<br/>' . PHP_EOL;
echo 'Last week ' . $visits->GetLastDays(7) . '<br/>' . PHP_EOL;
echo 'Last month ' . $visits->GetLastDays(30) . '<br/>' . PHP_EOL;
echo 'Last year ' . $visits->GetLastDays(365) . '<br/>' . PHP_EOL;
echo 'Maximum visits of all times:<br/>' . PHP_EOL;
$maxVisits = $visits->GetMax();
foreach($maxVisits as $maxVisit) {
echo $maxVisit['vdate'] . ' : ' . $maxVisit['counter'] . '<br/>' . PHP_EOL;
}
echo 'Maximum visits of previous 30 days:<br/>' . PHP_EOL;
$maxVisits = $visits->GetMax(30);
foreach($maxVisits as $maxVisit) {
echo $maxVisit['vdate'] . ' : ' . $maxVisit['counter'] . '<br/>' . PHP_EOL;
}
?>
</body>
</html>
نکته اصلی اینکه این نسخه، از هر دو تاریخ شمسی و میلادی پشتیبانی میکنه. یعنی میتونید از این کلاس برای هر دو گروه پروژه هایی که تاریخ توی اونها بصورت شمسی یا میلادی ذخیره میشه، استفاده کنید. توی مثال، تاریخ شمسی استفاده شده. برای تاریخ میلادی کافیه موقع ایجاد شئ از کلاس، پارامتر بهش ندین یا false بفرستین. برای تاریخ شمسی از کتابخانه JDF (http://jdf.scr.ir) استفاده شده که توی فایلهای ضمیمه، گذاشتم. مورد آخر اینکه مشکل اتصال هم رفع شده و در هربار اتصال، چک میشه که اگه اتصال قبلی هنوز برقرار بود، دیگه اتصال جدید برقرار نکنه و اگه نبود، اونوقت اتصال جدید ساخته میشه.
اگه سؤالی بود در خدمتم.
موفق باشید.

tehro0n
دوشنبه 22 آبان 1391, 00:06 صبح
اگر این مورد را هم توضیح دهید ممنون میشم
http://barnamenevis.org/showthread.php?282021-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%B4%D9%85%D8%A7%D8%B1%D9%86%D8%AF%D9%87-%D9%87%D9%85%D9%87-%D9%83%D8%A7%D8%B1%D9%87-%D8%A8%D8%B1%D8%A7%D9%8A-%D8%B3%D8%A7%D9%8A%D8%AA&p=1623752&viewfull=1#post1623752

MMSHFE
دوشنبه 22 آبان 1391, 16:12 عصر
البته سئوال آخر را برای توسعه عرض کردم که بخواهیم از سرویس دهنده استفاده کنیم کدام جدول بهتره داشته باشیم؟
و اینکه این موضوع را هم که مطرح کردم لطف می کنید بفرمایید به چه صورت است
InnoDB یکسری امکانات جدید داره مثل Stored Procedure و... ولی درعوض سرعت MyISAM کمی (فقط کمی) بیشتره. بسته به نیازتون مورد دلخواه رو انتخاب کنید.

در کدهایتان به موردی برخوردم که شما از ORDER BY `id` در جایی که فقط یک خروجی داریم استفاده کردید، مگه ORDER BY `id` پس از خروجی ها آن ها را مرتب نمی کند؟ یا اینکه اگر نوشته شود کوئری به ترتیب id جستجو هم می کند!
ORDER BY کلاً کارش مرتب کردنه و درمورد ID که غیرتکراری هست فرقی نمیکنه از ORDER BY استفاده کنیم یا نه ولی اگه چند رکورد داشته باشیم و بخوایم اولی رو انتخاب کنیم، اونوقت ORDER BY به کمکمون میاد. من برای جلوگیری از اشتباهات ناخواسته، عادت کردم ORDER BY رو همیشه بنویسم (مثلاً ممکنه توی پروژه ای که کار میکنم، طراح DB یادش رفته باشه فیلد رو Primary Key بگذاره) و درنتیجه دو رکورد با ID یکسان داشته باشیم که در اینجا، ORDER BY در کنار LIMIT باعث میشه نتیجه دلخواه رو بگیرم).
موفق باشید.

رضا قربانی
دوشنبه 22 آبان 1391, 17:31 عصر
. منتظر نظر دوستان هستم.
تشکر بابت نسخه جدیدتون :ی
چقدر خوب می شد که این امکان هم بهش اضافه می کردید تا بر اساس ip هم آمار بازدید بزنه

MMSHFE
دوشنبه 22 آبان 1391, 20:58 عصر
اونم بروی چشم. راستش همینم به زحمت امروز یک ساعت وقت خالی پیدا کردم نوشتم. دارم یه کارهایی انجام میدم که بزودی خبرای خوبش رو میشنوید. اولیش برگزاری مسابقه برنامه نویسی PHP توی همین تالاره، با جایزه نقدی (پول!) و ارائه سورس کدهای برنده برای همه اعضا و اعلام نقاط ضعف هر اسکریپت به کاربر مربوطه هست. بقیه رو هم کم کم لو میدم :لبخند:

رضا قربانی
دوشنبه 22 آبان 1391, 23:52 عصر
اونم بروی چشم. راستش همینم به زحمت امروز یک ساعت وقت خالی پیدا کردم نوشتم. دارم یه کارهایی انجام میدم که بزودی خبرای خوبش رو میشنوید. اولیش برگزاری مسابقه برنامه نویسی PHP توی همین تالاره، با جایزه نقدی (پول!) و ارائه سورس کدهای برنده برای همه اعضا و اعلام نقاط ضعف هر اسکریپت به کاربر مربوطه هست. بقیه رو هم کم کم لو میدم :لبخند:
دستت درد نکنه . فقط قبل این کارا یه یک ساعت دیگه هم وقت به خاطر گل روی خودت بذار تا بازدید بر اساس ip باشه.

MMSHFE
سه شنبه 23 آبان 1391, 21:30 عصر
بروی چشم. بازدید براساس IP رو هم در دستور کار گذاشتم. اونم با اولویت ویژه!

tehro0n
چهارشنبه 24 آبان 1391, 16:48 عصر
به نظر شما نیازی نیست که کانکشین ها و نتیجه های کوئری رو ببندیم؟
در http://www.php.net/manual/en/mysqli.query.php قبل از اتمام هم کوئری و هم کانکشن ها رو می بنده، برخی از دوستان می گن خود php این کارو می کنه و ننویسیم چون رم می گیره، ولی در این صفحه توضیح داده شده که برای بستن close یا free انجام دهیم!
نظر شما چیست؟

MMSHFE
چهارشنبه 24 آبان 1391, 18:55 عصر
بستن اتصال به هیچ عنوان اجباری نیست. خود PHP با پایان اسکریپت، اتصال رو میبنده. توی کدی هم که گذاشتم اگه دقت کنید، میبینید که چک میشه ببینیم اتصالی از قبل موجوده یا نه و اگه بود، همون رو بکار میگیریم و اگه نبود، یک اتصال جدید برقرار میکنیم.
موفق باشید.

hamed-php
جمعه 26 آبان 1391, 19:18 عصر
سلام
خسته نباشید


تعداد افراد آنلاین رو هم بگذارید لطفاً

MMSHFE
جمعه 26 آبان 1391, 23:10 عصر
نمايش تعداد افراد آنلاين ارتباطي به ديتابيس و كلاس شمارنده نداره. بايد با مديريت Session و... كار كنيم.

tehro0n
شنبه 27 آبان 1391, 01:31 صبح
جناب شهرکی این کانکت شدن به دیتا بیس برای تک یوزر هست یا اینکه وقتی کانکت میشه اگه بسته نشه برای تمام یوزر ها که آنلاین هستند بازه؟
من اسکریپتی که دارم به دلیل بازدید بالا حدود 2 gig رم پر میشه و گاهی اوقات connect faild می ده و میگه تعداد کانکشن زیادی بازه
اسکریپتی که صحبت می کنم حدودا 4 میلیون تو 3 ماه استفاده شده.. برای اینکه سربار رو کم کنم یا کانکشین بی خودی باز نشه چه کنم؟
یک جا هم شنیدم که گفتند تعداد معمولی کانکشن رو با php.ini یا phpmyadmin بالاتر ببر که نمی دونستم درسته یا نه و اینکه کجاست برای همین دستکاری نکردم

MMSHFE
شنبه 27 آبان 1391, 20:11 عصر
اتصال برای هر کاربر جداگانه هست و تا وقتی که مرورگرش رو نبسته باشه، اتصال برقراره. درواقع خود MySQL هم یه جور مکانیزم کنترل Session داره. منتها سشنهای MySQL با سشنهای PHP فرق میکنه. درمورد اسکریپتتون هم باید کدتون رو ببینیم تا بشه اظهارنظر کرد اما در کل تغییر تعداد معمولی کانکشنها ایده مناسبی نیست چون همه جا (بخصوص توی هاستهای اشتراکی) دسترسی بهش ندارین. بهترین راه، بهینه سازی اتصالاتتون هست.

rezaonline.net
یک شنبه 28 آبان 1391, 22:04 عصر
تشکر ازتون .




:تشویق:

tehro0n
چهارشنبه 01 آذر 1391, 19:10 عصر
اتصال برای هر کاربر جداگانه هست و تا وقتی که مرورگرش رو نبسته باشه، اتصال برقراره. درواقع خود MySQL هم یه جور مکانیزم کنترل Session داره. منتها سشنهای MySQL با سشنهای PHP فرق میکنه. درمورد اسکریپتتون هم باید کدتون رو ببینیم تا بشه اظهارنظر کرد اما در کل تغییر تعداد معمولی کانکشنها ایده مناسبی نیست چون همه جا (بخصوص توی هاستهای اشتراکی) دسترسی بهش ندارین. بهترین راه، بهینه سازی اتصالاتتون هست.

این اسکریپت سرویس دهنده ابزار وب است
حدودا 6000 کاربر ازش استفاده میکنند ولی کلی رم رو گرفته و mysql connect هم می گه که تعداد کانکت ها خیلی شده و از کار می افته

یک جدول هست که تمامی اطلاعات کاربر رو insert می کنه که برای نمایش اطلاعات چند مرورگر وارد شده و جستجوگر ها و .. است
یک جدول هم برای تعیین کشور کاربر ورودی است که از ip2location گرفتم
جدول دیگه برای ذخیره تعداد بازدیدها و تعداد کاربرها در 30 روز گذشته است که به صورت عمودی ذخیره میشه ( این کار رو برای این انجام دادم که استفاده کنندگان قدیمی برای نمایش اطلاعاتشون دیگه count نکنم اون insert هارو و یک جورایی مانند روش شما انجام دادم با این تفاوت که شما برای تک تک روزها تاریخ می زنید و تعداد ردیف های زیادی دارید اما من تعداد ستون های زیادی دارم که شامل 30 بازدید + 30 کاربر + 12 ماه بازدید + 12 ماه کاربر + 2 سال که در مجموع حدود 86 ستون + ستون روز آپدیت این جدول) این جدول به غیر از بازدید امروزش در کل روزی یکبار سایر ستون ها جا به جا میشن و با هر بازدید همه آپدیت نمی شوند

این اسکریپت با شیوه کلاس نوشته نشده و در بالا کانکت میشیم و بر اساس get هایی که کاربر گفته نمایش داده می شوند
نمونه ای از اسکریپت و روش به دست آوردن اطلاعات



$mysqli = new mysqli(COUNTER_HOST, COUNTER_USER, COUNTER_PASS, COUNTER_DB);
// check connection
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
} else
$mysqli->set_charset("utf8"); // change character set to utf8

$_ip = $_SERVER['REMOTE_ADDR']; // for example '176.227.203.241'; us
$result = $mysqli->query (
"SELECT
`v`.* , `i`.`country`
FROM

`ip2nation` `i`,
`sites` `s`
LEFT JOIN `visits` `v`
ON `s`.`id` = `v`.`id`
WHERE
`s`.`url` = '{$_url}'
AND
`i`.`ip` < INET_ATON('{$_ip}')
ORDER BY
`i`.`ip` DESC
LIMIT 0,1");

Tarragon
شنبه 25 آذر 1391, 14:29 عصر
تشکر
کلاس عالی هستش اما ای کاش یه راهنمایی کامل برای نشون دادن افراد آنلاین می دادید

h05531n
دوشنبه 04 دی 1391, 10:30 صبح
سلام

اگر بخوایم آمار هر صفحه سایت رو جداگانه داشته باشیم ، باید چیکار کنیم؟:متفکر:

masiha68
پنج شنبه 10 اسفند 1391, 01:26 صبح
من روی لوکال نصبش کردم ولی امار زیاده نمیشه
فک می کنین مشکل از کجا باشه

masiha68
سه شنبه 15 اسفند 1391, 10:18 صبح
من این امارگیرو استفاده کردم ولی بعد یه هفته دیه چیزی نشون نداد
البته فک کنم امار همون روز رو نشون داد
اینم تصویری از دیتابیس:
http://up.panda98.ir/uploads/13624681131.jpg

MMSHFE
سه شنبه 15 اسفند 1391, 10:24 صبح
count چیه؟ counter کدومه؟ کدی که من گذاشتم فقط یک فیلد تعداد بازدید داشت. اگه تغییرش دادین، کدتون رو بگذارین تا ببینیم چی به چیه. موفق باشید.

masiha68
سه شنبه 15 اسفند 1391, 11:17 صبح
خب مگه نگفتین باید سه تا فیلد درست کنیم به اسم counter , vdate , id
حالا اون یه فیلد اضافه ست که حذفش می کنم
ولی با همینا یه هفته کار کرد
کد ؟ کدوم کد ؟

MMSHFE
سه شنبه 15 اسفند 1391, 12:43 عصر
کد خودتون رو که میگین کار نمیکنه بگذارین.

masiha68
سه شنبه 15 اسفند 1391, 12:48 عصر
<?PHP
//Copyright محمد مصطفي شهركي @ http://www.ncis.ir
class Visits
{
private $now;

public function Visits()
{
$this->Today();
}

private function Today()
{
$this->now = new DateTime('now');
}

private function Connect()
{
mysql_connect('localhost','root','');
mysql_select_db('web');
mysql_query('SET NAMES \'utf8\'');
}

public function Count()
{
$this->Connect();
$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = mysql_query("SELECT * FROM visits WHERE (`vdate`='$now') ORDER BY `id`");
switch(mysql_num_rows($result))
{
case -1:
echo '<P dir="ltr" align="left">'.mysql_error().'</P>'."\n";
break;
case 0:
$result = mysql_query('SELECT * FROM `visits` ORDER BY `id` DESC LIMIT 1');
$id = 0;
if(mysql_num_rows($result) > 0)
{
$id = mysql_result($result, 0, 0);
}
$id++;
mysql_query("INSERT INTO `visits` VALUES ('$id','$now','1')");
break;
default:
while($row = mysql_fetch_assoc($result))
{
$id = $row['id'];
mysql_query("UPDATE `visits` SET `count`=`count`+1 WHERE (`id`='$id')");
}
break;
}
}

public function GetAll()
{
$this->Connect();
$result = mysql_query('SELECT * FROM `visits` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}

public function GetLastDays($days)
{
$this->Connect();
$this->Today();
$now = $this->now;
$result = mysql_query('SELECT * FROM `visits` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = -1;
while($vdate <= $now)
{
$vdate->add(new DateInterval('P1D'));
$interval++;
}
if($interval < $days)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetLastDay($day)
{
$this->Connect();
$this->Today();
$now = $this->now;
$result = mysql_query('SELECT * FROM `visits` ORDER BY `id`');
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$vdate = new DateTime($row['vdate']);
$interval = 1;
while($vdate <= $now)
{
$vdate-> add(new DateInterval('P1D'));
$interval++;
}
if($interval == $day)
{
$visits += $row['count'];
}
}
}
return $visits;
}

public function GetToday()
{
$this->Connect();
$this->Today();
$now = $this->now;
$now = $now->format('Y-m-d');
$result = mysql_query("SELECT * FROM `visits` WHERE (`vdate`='$now') ORDER BY `id`");
$visits = 0;
if(mysql_num_rows($result) > 0)
{
while($row=mysql_fetch_assoc($result))
{
$visits += $row['count'];
}
}
return $visits;
}
}
?>
________


<?php
require_once 'visits.class.php';
$visits = new Visits(true);
$visits->DoCount();
echo '<h3>Visits</h3><br/>' . PHP_EOL;
echo 'Total ' . $visits->GetAll() . '<br/>' . PHP_EOL;
echo 'Today ' . $visits->GetToday() . '<br/>' . PHP_EOL;
echo 'Yesterday ' . $visits->GetLastDay(1) . '<br/>' . PHP_EOL;
echo 'The day before yesterday ' . $visits->GetLastDay(2) . '<br/>' . PHP_EOL;
echo 'Sum of 2 days ago ' . $visits->GetLastDays(2) . '<br/>' . PHP_EOL;
echo 'Last week ' . $visits->GetLastDays(7) . '<br/>' . PHP_EOL;
echo 'Last month ' . $visits->GetLastDays(30) . '<br/>' . PHP_EOL;
echo 'Last year ' . $visits->GetLastDays(365) . '<br/>' . PHP_EOL;
echo 'Maximum visits of all times:<br/>' . PHP_EOL;
$maxVisits = $visits->GetMax();
foreach($maxVisits as $maxVisit) {
echo $maxVisit['vdate'] . ' : ' . $maxVisit['counter'] . '<br/>' . PHP_EOL;
}
echo 'Maximum visits of previous 30 days:<br/>' . PHP_EOL;
$maxVisits = $visits->GetMax(30);
foreach($maxVisits as $maxVisit) {
echo $maxVisit['vdate'] . ' : ' . $maxVisit['counter'] . '<br/>' . PHP_EOL;
}
?>

MMSHFE
سه شنبه 15 اسفند 1391, 12:50 عصر
کد رو بررسی میکنم و اگه لازم باشه، کلاس رو هم یکم تغییر میدم. فکر کنم دیگه وقتشه نسخه جدید رو که روی تمام ورژنهای PHP کار میکنه بنویسم و بگذارم. اگه خدا بخواد تا عصر درستش میکنم. موفق باشید.

masiha68
سه شنبه 15 اسفند 1391, 12:54 عصر
منتظریم و خسته نباشین که واقعا توی برنامه نویس داریم زحمت می کشین

MMSHFE
پنج شنبه 17 اسفند 1391, 10:51 صبح
دوستان الوعده وفا. البته ببخشید که یکم دیر شد. نسخه 2 کلاس آمارگیر رو تهیه کردم. امیدوارم به کارتون بیاد.

masiha68
پنج شنبه 17 اسفند 1391, 11:05 صبح
ممنون
فک کنم اولین کسی هستم که از این امارگیر استفاده می کنم
بازم ممنون
فقط اگه زحمت توضیحات رو هم بکشید دیگه رسما شرمنده مون می کنید
اینکه چه جلدول ها و فیلدهایی لازمه

MMSHFE
پنج شنبه 17 اسفند 1391, 11:07 صبح
یک Export از جدول دیتابیس گذاشتم (با داده های نمونه). توی فایل کلاس هم توضیحات کاملی هست. هم درمورد اینکه متد چه کاری انجام میده و هم اینکه چه پارامترهایی میگیره و خروجی متد چیه.
موفق باشید.

arkia
جمعه 24 خرداد 1392, 01:25 صبح
من از این کلاس استفاده کردم اما مشکل اینجاس که تو لوکال با هر بازدید یک عدد اضافه میشه اما تو سرور با هر رفرش 2تا میره رو عدد قبلی! مشکل از کجاس؟

masiha68
جمعه 24 خرداد 1392, 08:34 صبح
من از این کلاس استفاده کردم اما مشکل اینجاس که تو لوکال با هر بازدید یک عدد اضافه میشه اما تو سرور با هر رفرش 2تا میره رو عدد قبلی! مشکل از کجاس؟

به احتمال زیاد دو بار کد رو توی یک پیج گذاشتین وگرنه سیستم درست کار میکنه

arkia
جمعه 24 خرداد 1392, 12:38 عصر
به احتمال زیاد دو بار کد رو توی یک پیج گذاشتین وگرنه سیستم درست کار میکنه

چک کردم نه تو هر صفحه یکبار اومده. به نظرت ربطی به تغییرات htaccess داره؟

masiha68
جمعه 24 خرداد 1392, 12:50 عصر
چک کردم نه تو هر صفحه یکبار اومده. به نظرت ربطی به تغییرات htaccess داره؟

فک نکنم ... چون من خودم از این کلاس استفاده کردم تنها چیزی که داره یه دیتابیسه ...
راستی اخرین کلاس رو دانلود کنین . کلاس اولی که استاد گذاشت یه کمی مشکلات داشت

arkia
جمعه 24 خرداد 1392, 14:55 عصر
راستی اخرین کلاس رو دانلود کنین . کلاس اولی که استاد گذاشت یه کمی مشکلات داشت

آخرین کلاس رو گذاشتم درست شد.

arkia
چهارشنبه 09 مرداد 1392, 19:59 عصر
از وقتی که آپدیت رو استفاده کردم اینطوری شده. دو تا دابل کوتیشن و چند تا فاصله میندازه که به هم میزنه صفحه رو. تو کلاسش هم چیزی پیدا نکردم که همچین چیزی خروجی بده مشکل از کجاس؟

MMSHFE
پنج شنبه 10 مرداد 1392, 08:17 صبح
باید کد کامل رو ببینیم یا با TeamViewer به سیستم شما وصل بشم و از نزدیک بررسی کنم. درصورت تمایل، اطلاعات RemoteConnection رو برام پیام خصوصی کنید تا ببینم مشکل از کجاست. ضمناً فایلها رو با کدگذاری UTF-8 without BOM ذخیره کنید.

AliRezaPro
پنج شنبه 10 مرداد 1392, 12:35 عصر
بابت unique اقدامی نکردید ؟
کدتون به شکلی هست که اگر بخواید این خاصیت رو اضافه کنید کل ساختارتون باید دست بخوره . از کد بگیرید تا جداول.
سئوال : برای اضافه کردن این خاصیت بلخره همه ی آیپی ها باید جایی ذخیره باشند . اینجوری شاید روزانه و شاید سالیانه اگر سایت پر بازدید باشه شاید چند ملیون آی پی دخیره شده داشته باشیم . در این صورت اگر با فایل کار کنیم بهتر نیست ؟یا خود mysql به خوبی میتونه چند میلیون رکورد رو هندل کنه ؟
بعد اینکه امکان فشره سازی نیست این اطلاعات ؟ یا مثلا اینکه سریالایز و دی سریالایز کنیم ؟
به نحوی کد نوشته بشه که در بهترین حالت قرار بگیره , اوپتیمم حالت
البته اگر یک جدول دیگر درست کنیم و کلید اصلی این جدول رو توش بزاریم و بشه آیپی ها رو اونجا قرار داد میشه این کار رو به درستی پیش برد ولی فطعا نمیشه اوپتیمم حالت رو بدست آورد
به نظرتون چیکار باید کرد ؟

MMSHFE
شنبه 12 مرداد 1392, 08:12 صبح
MySQL توی مدیریت چند میلیون رکورد مشکلی نداره اما همونطور که اشاره کردین، بحث Unique بودن اطلاعات توی بهینگی تأثیر خوبی داره. البته این شمارنده، به IP کاری نداره و فقط بازدیدها رو شمارش و به تفکیک روز، اعلام میکنه.

arkia
شنبه 12 مرداد 1392, 22:40 عصر
مشکل من با راهنمایی مهندس حل شد:



درمورد ذخیره با فرمت UTF-8 without BOM :
توی Dreamweaver توی پنجره Save As نوع Encoding رو UTF-8 بگذارین و تیک گزینه Byte Order Mark یا همون BOM رو بردارین.
توی ++Notepad از منوی Encoding گزینه Convert to UTF-8 without BOM رو انتخاب کنید و فایل رو مجدداً Save کنید.

arkia
شنبه 12 مرداد 1392, 22:52 عصر
MySQL توی مدیریت چند میلیون رکورد مشکلی نداره اما همونطور که اشاره کردین، بحث Unique بودن اطلاعات توی بهینگی تأثیر خوبی داره. البته این شمارنده، به IP کاری نداره و فقط بازدیدها رو شمارش و به تفکیک روز، اعلام میکنه.

اگه توی ورژن جدید Unique بودن ش هم اضافه بشه خیلی ممنون میشیم.

mizbannovin
چهارشنبه 25 تیر 1393, 21:04 عصر
دوستان من مشکلی دارم اینکه این کد ها php هستن و من وقتی میزارم تو html خراب میشه میشه یکم راهنمایی کنید ؟

متشکر - حسینی

vahidqara
چهارشنبه 25 تیر 1393, 22:47 عصر
سلام و درود و خسته نباشی برای جناب شهرکی..
یه سوال.. کلاسی برای تعداد بازدید یک مطلب بخصوص دارین؟ مچکرم :لبخندساده:

alirezaoshz
پنج شنبه 26 تیر 1393, 01:31 صبح
سلام و درود و خسته نباشی برای جناب شهرکی..
یه سوال.. کلاسی برای تعداد بازدید یک مطلب بخصوص دارین؟ مچکرم :لبخندساده:

آقا من تازه واردم نمیدونم درست میگنم یا نه :لبخند: ولی فک کنم میشه به جدول پست هاتون توی دیتابیس یک ستون اضافه کنید به اسم visits و نوع int بعد توی صفحه php پست هاتون بگید که هر بار باز شد ++ بشه دیگه :لبخند: کار خاصی نمیخواد ...

vahidqara
پنج شنبه 26 تیر 1393, 09:46 صبح
آقا من تازه واردم نمیدونم درست میگنم یا نه :لبخند: ولی فک کنم میشه به جدول پست هاتون توی دیتابیس یک ستون اضافه کنید به اسم visits و نوع int بعد توی صفحه php پست هاتون بگید که هر بار باز شد ++ بشه دیگه :لبخند: کار خاصی نمیخواد ...


سلام فدات .. من این چیزو که میخوام نوشتم ولی فک کردم کاملترش هست.... فقط بازدید نیست که صورت بگیره ... آمار بازدید واقعی نمیشه شما تند تند رفرش بزنی همینجوری
++ میشه :لبخند: باید ip کاربرو بگیری درج کنی تو بانک با کد مطلبی که بازدید کرده که اگه یه باره دیگه امد با همون ip برای همون مطلب دیگه ++ نشه عزییییزم :لبخندساده:

MMSHFE
پنج شنبه 26 تیر 1393, 10:03 صبح
بهتره از IP استفاده نکنید. بجاش برای کاربر سشن یا کوکی تعریف کنید چون IP بین خیلیها مشترکه و بعلاوه قابل جعل کردنه یا حتی با قطع و وصل شدن نت، IP جدید اختصاص داده میشه. حداقل دردسر کوکی و سشن بیشتره و ذهن تازه کارها نمیرسه.

mizbannovin
پنج شنبه 26 تیر 1393, 10:26 صبح
درود بر دوستان عزیز !

بنده تازه وارد هستم

این کد ها php هستند ولی برنامه نویسی سایت من html است ؛ چگونه میتوانم ا این کد ها در html استفاده کنم ؟

MMSHFE
پنج شنبه 26 تیر 1393, 10:35 صبح
کدهای PHP بطور پیشفرض توی فایلهای با پسوند html. کار نمیکنن و باید تنظیمات وب سرور رو تغییر بدین که توی هاستهای اشتراکی چنین اجازه ای نمیدن معمولاً. بهتره فایلها رو با پسوند php. ذخیره کنید. صفحات html. ایستا هستن نه پویا

vahidqara
پنج شنبه 26 تیر 1393, 13:28 عصر
بهتره از IP استفاده نکنید. بجاش برای کاربر سشن یا کوکی تعریف کنید چون IP بین خیلیها مشترکه و بعلاوه قابل جعل کردنه یا حتی با قطع و وصل شدن نت، IP جدید اختصاص داده میشه. حداقل دردسر کوکی و سشن بیشتره و ذهن تازه کارها نمیرسه.

درود .. بله شما درست میگید چون من دقیقا این مشکل برام پیش اومده.. :لبخندساده:
حالا در اوایل تاپیک قرار بود همچین کلاسی رو زحمت بکشید بزارید؟! اگه دارید ممنون میشم بزارید تا همه استفاده کنند.

amirmohammad76
جمعه 09 بهمن 1394, 19:55 عصر
دستتون درد نکنه،
میشه با گذاشتن و چک کردن IP تبدیلش کرد به unique visitor
برای گرفتن IP کاربر

$_SERVER['REMOTE_ADDR'];
دوستان من تازه برنامه نویسی php رو دارم یاد میگیرم ، امکانش هست کسی توضیح بده که چجوری میشه از این دستور استفاده کرد؟