counter สถิตินับคนเข้าเว็บมันนับแค่ ip เดียวต่อวันช่วยดูหน่อยครับ
counter มันนับแค่ ip เดียวต่อวัน ผมเอาลงมาได้เว็บ 7 วันแล้ว สถิติก็มีแค่ 7 คนคือ 1วันต่อคนเท่านั้นเอง ผมลงสถิติของเว็บนอก histats.com ไว้เปรียบเทียบด้วย ซึ่งของ histats มันประมาณ 30 คน/วันครับ ช่วยดูหน่อยครับ
เอาโค้ดมาจาก https://www.thaicreate.com/php/forum/097888.html (ในหัวข้อตอบ No.2)
DB
Code (SQL)
CREATE TABLE `tb_counter` (
`date_visit` varchar(30) NOT NULL,
`ip_visit` varchar(30) NOT NULL,
`agent_visit` varchar(30) NOT NULL,
`count_visit` int(12) NOT NULL default '1'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Code (PHP)
//Check IP on DATE//
date_default_timezone_set("Asia/Bangkok");
$date = date("Y-m-d");
$ip = $_SERVER["REMOTE_ADDR"];
$agent = getenv("HTTP_USER_AGENT");
$sql_ctime ="SELECT * FROM tb_counter WHERE date_visit ='$date'";
$result_ctime = mysql_query($sql_ctime);
$row_ctime = mysql_fetch_array($result_ctime);
if ($row_ctime <= 0) {
$sql_counter = "INSERT INTO tb_counter (date_visit, ip_visit, agent_visit, count_visit) VALUES('$date', '$ip', '$agent', '1')";
mysql_query($sql_counter);
}
Tag : PHP, MySQL
Date :
2015-12-09 10:43:09
By :
Meen2007
View :
3472
Reply :
16
คุณก็ไม่ต้องไป select
ให้ insert ไปอย่างเดียว
เพราะ select มันเจอ มากกว่า 0 มันก็ไม่เข้าเงื่อนไข insert
Date :
2015-12-09 10:59:27
By :
progamer2000
ต้องแก้ออกมาเป็นยังไงครับ
Date :
2015-12-09 11:53:32
By :
Meen2007
ผมลองเอาออกเหลือเพียงเท่านี้
Code (PHP)
$sql_counter = "INSERT INTO tb_counter (date_visit, ip_visit, agent_visit, count_visit) VALUES('$date', '$ip', '$agent', '1')";
mysql_query($sql_counter);
ปรากฏว่า คลิกรีเฟรชครั้งหนึ่งมันก็นับไปครั้งหนึ่งตลอด คือมันนับซ้ำนั่นเอง ต้องทำแบบใดครับ
(นับซ้ำตัวเลขเพิ่มขึ้นเฉพาะตรงช่องรวม Total visit: ) ส่วนช่อง Today : เพิ่มขึ้นเป็น 2 คน
เข้าไปดูในฐานข้อมูล มีเรคคอร์ด วันที่ กับ ไอพี ของผมซ้ำๆกัน ตามจำนวนรีเฟรช
ประวัติการแก้ไข 2015-12-09 12:31:12
Date :
2015-12-09 12:09:09
By :
Meen2007
ตรง select น่าจะต้องเพิ่มเงื่อนไข AND ip_visit = '$ip' รึเปล่าครับ
Date :
2015-12-09 12:50:52
By :
eiei
Code (PHP)
date_default_timezone_set("Asia/Bangkok");
$date = date("Y-m-d");
$ip = $_SERVER["REMOTE_ADDR"];
$agent = getenv("HTTP_USER_AGENT");
$sql_ctime ="SELECT * FROM tb_counter WHERE date_visit ='$date' AND ip_visit = '$ip'";
$result_ctime = mysql_query($sql_ctime);
$row_ctime = mysql_fetch_array($result_ctime);
if ($row_ctime <= 0) {
$sql_counter = "INSERT INTO tb_counter (date_visit, ip_visit, agent_visit, count_visit) VALUES('$date', '$ip', '$agent', '1')";
mysql_query($sql_counter);
}else{
$sql_counter = "update tb_counter set count_visit = count_visit + 1 where date_visit ='$date' AND ip_visit = '$ip'";
mysql_query($sql_counter);
}
มั้งงงงง!
Date :
2015-12-09 13:01:14
By :
eiei
มันบวกไปครั้งละ 7 เลยครับ ทุกๆรีเฟรช
Code (PHP)
date_default_timezone_set("Asia/Bangkok");
$date = date("Y-m-d");
$ip = $_SERVER["REMOTE_ADDR"];
$agent = getenv("HTTP_USER_AGENT");
$sql_ctime ="SELECT * FROM tb_counter WHERE date_visit ='$date' AND ip_visit = '$ip'";
$result_ctime = mysql_query($sql_ctime);
$row_ctime = mysql_fetch_array($result_ctime);
if ($row_ctime <= 0) {
$sql_counter = "INSERT INTO tb_counter (date_visit, ip_visit, agent_visit, count_visit) VALUES('$date', '$ip', '$agent', '1')";
mysql_query($sql_counter);
}else{
$sql_counter = "update tb_counter set count_visit = count_visit + 1 where date_visit ='$date' AND ip_visit = '$ip'";
mysql_query($sql_counter);
}
มันบวกเพิ่มเฉพาะตรง This month: กับ Total visit: ครั้งละ 7 ทุกๆรีเฟรช ส่วน Today: 2 คนเท่าเดิม
*แต่ในฐานข้อมูลไม่มีอะไรเพิ่มเลยเท่าเดิม
ประวัติการแก้ไข 2015-12-09 13:25:14 2015-12-09 13:27:04
Date :
2015-12-09 13:22:18
By :
Meen2007
echo ตัวไหนมาอ่ะครับ ใช่ $row_ctime['count_visit'] รึเปล่า
Date :
2015-12-09 13:29:47
By :
eiei
ของเดิมผมตามนี้ครับ
Code (PHP)
<?php
//Page View//
$sql = "SELECT * FROM tb_pageview";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$view = $row[view];
//Update Pageview//
$view_new = $view +1;
$sqlview = "UPDATE tb_pageview SET view='$view_new'";
$resultview = mysql_query($sqlview);
$pageview = str_pad($view,12);
//Check IP on DATE//
date_default_timezone_set("Asia/Bangkok");
$date = date("Y-m-d");
$ip = $_SERVER["REMOTE_ADDR"];
$agent = getenv("HTTP_USER_AGENT");
$sql_ctime ="SELECT * FROM tb_counter WHERE date_visit ='$date'";
$result_ctime = mysql_query($sql_ctime);
$row_ctime = mysql_fetch_array($result_ctime);
if ($row_ctime <= 0) {
$sql_counter = "INSERT INTO tb_counter (date_visit, ip_visit, agent_visit, count_visit) VALUES('$date', '$ip', '$agent', '1')";
mysql_query($sql_counter);
}
//Today Page//
$today = date("Y-m-d");
$sql = "SELECT count(DISTINCT(ip_visit)) AS visit FROM tb_counter WHERE date_visit = '$today'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$visit = $row[visit];
$today = str_pad($visit,12);
//Yesterday Page//
$yestday = date("Y-m-d",strtotime("-1 day"));
$sql = "SELECT SUM(count_visit) AS visit FROM tb_counter WHERE date_visit = '$yestday'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$visit = $row[visit];
$yesterday = str_pad($visit,12);
//Thismonth Page//
$thismon = date("Y-m");
$sql = "SELECT SUM(count_visit) AS visit FROM tb_counter WHERE DATE_FORMAT(date_visit, '%Y-%m') = '$thismon'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$visit = $row[visit];
$thismonth = str_pad($visit,12);
//Lastmonth Page//
$lastmon = date("Y-m",strtotime("-1 month"));
$sql = "SELECT SUM(count_visit) AS visit FROM tb_counter WHERE DATE_FORMAT(date_visit, '%Y-%m') = '$lastmon'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$visit = $row[visit];
$lastmonth = str_pad($visit,12);
//Total Visit//
$sql = "SELECT SUM(count_visit) AS visit FROM tb_counter";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$visit = $row[visit];
$total = str_pad($visit,12);
//Close MySQL//
mysql_close();
?>
<div class="counter_stat">สถิติเว็บไชต์
<table width="" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="vstats-vlweek"></td>
<td class="countext">Page view:</td>
<td class="stat"><?=$pageview;?></td>
</tr>
<tr>
<td class="vstats-vtoday"></td>
<td class="countext">Today:</td>
<td class="stat"><?=$today;?></td>
</tr>
<tr>
<td class="vstats-vyesterday"></td>
<td class="countext">Yesterday:</td>
<td class="stat"><?=$yesterday;?></td>
</tr>
<tr>
<td class="vstats-vxmonth"></td>
<td class="countext">This month:</td>
<td class="stat"><?=$thismonth;?></td>
</tr>
<tr>
<td class="vstats-vlmonth"></td>
<td class="countext">Last month:</td>
<td class="stat"><?=$lastmonth;?></td>
</tr>
<tr>
<td class="vstats-vall"></td>
<td class="countext">Total visit:</td>
<td class="total_visit"><?=$total;?></td>
</tr>
</tbody>
</table>
</div>
แก้ไขเพิ่มเติมนิดนึง คือที่บอกว่า...แต่ในฐานข้อมูลไม่มีอะไรเพิ่มเลยเท่าเดิม มันเพิ่ม เข้ามาเป็นเลข 5 ห้าตัวสุดท้ายเป็น IP ของผมคนเดียว ตามรูป ปกติ count_visit จะเป็นครั้งละ1 แต่พอเปลี่ยนเป้นโค้ดของท่าน มันก้เปลี่ยนเป้นเลข5ครับผม
ประวัติการแก้ไข 2015-12-09 13:38:15 2015-12-09 13:38:45
Date :
2015-12-09 13:37:30
By :
Meen2007
มีท่านใดทราบใหมครับ ว่าต้องแก้แบบใด ให้มันนับ IP หลายๆ IP ลงเรคคอร์ดใหม่เสมอๆ ที่เป็นอยู่คือมันไม่ยอมลงเรคคอร์ดใหม่ มันลงครั้งเดียว แล้วเลิกเลย มันก็ได้เพียงวันละ 1 คนเท่านั้น
Date :
2015-12-09 17:43:34
By :
Meen2007
กำหนด uniquekey ให้กับ date_visit, ip_visit ห้ามซ้ำวัน + ip
แล้ว insert โดยไม่ต้องตรวจเช็คอะไรทั้งสิ้น
error ก็ไม่ต้องสนใจโดยใส่ @ หน้าคำสั่งคิวรี่ @mysql_query( '....' );
ถ้ามันซ้ำมันจะไม่เข้าให้ เอวังด้วยประการฉะนี้
Code (PHP)
date_default_timezone_set("Asia/Bangkok");
$date = date("Y-m-d");
$ip = $_SERVER["REMOTE_ADDR"];
$agent = getenv("HTTP_USER_AGENT");
$sql_counter = "INSERT INTO tb_counter (date_visit, ip_visit, agent_visit, count_visit) VALUES('$date', '$ip', '$agent', '1')";
@mysql_query($sql_counter);
ประวัติการแก้ไข 2015-12-09 20:07:18 2015-12-09 20:07:45
Date :
2015-12-09 20:05:20
By :
NewbiePHP
ถ้า unique key ให้กับ date_visit มันก็ได้แค่วันเดียว คนเดียว ส่วนคนอื่นๆ มาในวันเดียวกันหลายๆคนก็ไม่อาจลงได้ ผมเข้าใจถูกใหมครับ
ส่วน uniquekey ให้กับ ip_visit ห้ามซ้ำ IP ผมทดลองข้ามวันดู หลังเที่ยงคืนไปแล้ว ผมเข้าเว็บใหม่มันก็ไม่นับให้ผมเป็นคนเข้าเว็บในวันใหม่ สรุปคือ unique key ให้กับ ip_visit มันได้แค่ครั้งเดียวจริงๆ เหมือนกับวันที่ เคยใช้ IP นี่เข้าแล้ว วันอื่นๆมาเข้าอีก มันก็ห้ามซ้ำ มันก็ไม่เก็บเข้าเรคคอร์ด เงิบครับ มันจะไม่นับคนที่เคยเข้ามาแล้วอีกเลย
ประวัติการแก้ไข 2015-12-10 00:26:08
Date :
2015-12-09 23:17:00
By :
Meen2007
unique key เดียว แต่รวม 2 field ครับ ไม่ใช่ 2 unique key ครับ
เวลากำหนด มันจะมีให้เรา add field ที่ 2 3 4 ลงไปครับ
Date :
2015-12-10 16:32:17
By :
NewbiePHP
Code (PHP)
$sql_ctime ="SELECT * FROM tb_counter WHERE date_visit ='$date' AND ip_visit = '$ip'";
$result_ctime = mysql_query($sql_ctime);
$row_ctime = mysql_fetch_array($result_ctime);
if ($row_ctime <= 0) {
$sql_counter = "INSERT INTO tb_counter (date_visit, ip_visit, agent_visit, count_visit) VALUES('$date', '$ip', '$agent', '1')";
mysql_query($sql_counter);
}
Date :
2015-12-10 17:55:45
By :
noMerzy
ขอบคุณ ทุกคำตอบครับ ขอทดลองดู สัก 1วัน
Date :
2015-12-10 18:24:13
By :
Meen2007
ควรใช้ cookie unique_timestamp เข้าไปด้วย
set_cookie('machine_id', time().rand(0,100000), time()+(3650*24*60*60));
เขาอยากจะรีเซท cookie เป็นคนใหม่ก็ชั่งเขา คงไม่ทุกคนหรอกที่ทำ
แต่ถ้าอยากเก็บ เป็น ip มันจะเห็น router เป็นบ้านหลังเดียว
หลัง rounter เป็นหลายห้อง แต่ บ้านเลขที่เดียว (ip)
หรือจะทำรวมกันทั้งหมดเพื่อดูสถิติการใช้อย่างอื่นด้วยก็แล้วแต่ความต้องการ
ส่วนการทำ unique key
[visit_date + visit_ip + visit_machine ] 3 field นี้เป็น unique key เดียว
จะเป็นการเอา 3 field มาต่อกันทำเป็น index ชนิดซ้ำกันไม่ได้
ดังนั้นถ้า
2015-10-01,127.0.0.1,14444444
2015-10-02,127.0.0.1,14444444
2015-10-01,127.0.0.2,14444444
2015-10-02,127.0.0.2,14444444
ทั้ง 4 ตัวนี้สามารถ insert เข้าได้หมด
ส่วนวิธีการคิวรี่
Code (PHP)
$sql = "replace into table
select d, ip, ck, ag, sum(s)
from (
select '$date' as d, '$ip' as ip, '$_COOKIE[machine_id] as mc, '$agent' as ag, 1 as s
union all
select * from table where visit_date='$date' and visit_ip='$ip' and visit_machine='$_COOKIE[machine_id]'
) as t
";
เมื่อใช้วิธีการนี้ ก็ผ่านขั้นตอนการร้องขอข้อมูล-และส่งกลับ จาก database ไป 1 รอบ 2 ขั้นตอน
คำสั่ง replace จำทำการลบข้อมูลที่มี unique key เหมือนกัน
แล้วถึงค่อย insert ข้อมูลเข้าไปใหม่
ประวัติการแก้ไข 2015-12-11 08:56:22
Date :
2015-12-11 08:53:44
By :
NewbiePHP
เยี่ยมครับ ขอบคุณมากครับ
Date :
2015-12-12 00:45:22
By :
Meen2007
Load balance : Server 01