【发布时间】:2012-02-07 06:46:06
【问题描述】:
假设我们有一个名为visits 的表,它有两个字段id 用于页面ID,ip 用于用户的IP 地址。
我已经编写了这段代码,我想知道这是否是最好的方法?
$ip=$_SERVER['REMOTE_ADDR'];
$id=$_GET['id'];
$query = "SELECT
(SELECT COUNT(ip) FROM visits WHERE id = '{$id}' AND WHERE ip ='{$ip}') as visited,
(SELECT COUNT(ip) FROM visits WHERE id = '{$id}') as pageHits";
$result=mysql_query($query, $connection);
$row=mysql_fetch_array($result);
$pageHits=$row['pageHits'];
$visited=$row['visited']; //it's either 0 or 1;
if($visited==0){
$query ="INSERT INTO visits (ip , id) VALUES ('{$ip}', {$id})"
$result=mysql_query($query, $connection);
$pageHits++;
}
echo $pageHits;
【问题讨论】:
-
一旦用户访问了任何页面,它会将访问标志设置为 1 ,因此命中计数器将来不会跟踪任何其他页面。因为所有页面的 IP 地址都相同
-
你最好只在
(ip, id)上添加一个UNIQUE约束 - 否则你会遇到竞争条件。 -
确保清理 GET 参数。就目前而言,它是您代码中的一个开放漏洞