我有一个计数器,它应该递增1,但它却递增2。我有控制器和视图。这是一个简单的练习,但我不知道为什么它会增加2。有人有什么想法吗?
http://screencast.com/t/w9w7GndQK
控制器
function setCount($fileName = 'counter.txt') {
if (file_exists($fileName)) {
//read the value
$handle = fopen($fileName, 'r');
// increment it by one
$count = (int) fread($handle, 20) + 1;
// write the new value
$handle = fopen($fileName, 'w');
fwrite($handle, $count);
// close the file
fclose($handle);
} else {
// create the file
$handle = fopen($fileName, 'w+');
$count = 1;
// set a default value of 1
fwrite($handle, $count);
fclose($handle);
}
return $count;
}
$count = setCount();
require('index.tmpl.php');
视图:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Counter</title>
<link rel="stylesheet" href="#">
</head>
<body>
<p>You are the <?php echo $count; ?>visitor to this website.</p>
</body>
</html>
为此使用文本文件是不好的做法,可能会导致不受尊重的行为。例如,当两个访问者同时访问网站时:访问者1打开文件,将存储的值增加到5到6,在保存更改之前,另一个访问者打开文件并执行相同操作。现在一个访问者被丢弃了,因为在这两种情况下,计数器只会在认为有两个访问者的地方出现。
相反,您应该使用MySQL这样的数据库来存储数据。这也使得构建更详细的计数器变得容易。例如,您可以获得每天访问页面的人数或访问频率最高的时间的统计数据。还可以跟踪用户系统的详细信息(例如,显示用户拥有的浏览器+版本和操作系统的useragent),或记录refer,以了解访问者从哪些页面来找你。
一个简单的计数器表可以由访问者的时间戳和ip地址组成。
CREATE TABLE pageviews(
datetime INT UNSIGNED NOT NULL,
ip VARCHAR(15) NOT NULL
);
要跟踪访问者,您需要运行以下查询:
INSERT INTO pageviews
SET datetime = UNIX_TIMESTAMP(),
ip = "' . $db->escape( $_SERVER['REMOTE_ADDR'] ) . '"
现在,您可以随心所欲地提取数据。对于一个总计数器,你只需在表上做一个COUNT(*):
SELECT COUNT(*) AS totalViews
FROM pageviews
你可以自由地展示你想要的东西,例如我之前提到的按天分组。