PHP专柜问题

时间:2015-06-24 20:24:12

标签: php counter

我有一个计数器应该递增1但是它递增2.我有控制器和视图。这是一个简单的练习,但我不确定为什么它会增加2.任何人都有任何想法?

http://screencast.com/t/w9w7GndQK

CONTROLLER

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 个答案:

答案 0 :(得分:0)

使用文本文件是不好的做法,可能会导致行为不一致。例如,当两个访问者同时访问该站点时:访问者1打开该文件,增加存储值,例如5到6,并且在它可以保存其更改之前,另一个访问者打开文件并执行相同操作。现在一个访问者被删除了,因为在这两种情况下,只有两个访问者认为计数器才会被激活。

相反,您应该使用像MySQL这样的数据库来存储数据。这使得构建更详细的计数器也变得容易。例如,您可以获取有关每天访问该页面的人数或最常访问时间的统计信息。还可以跟踪有关用户系统的详细信息(例如,显示用户具有的浏览器+版本和操作系统的用户)或记录引用者以获取访问者访问您的页面的信息。

简单的计数器表可以包含访问者的时间戳和ip-adress。

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

您可以自由显示您想要的内容,例如正如我之前提到的那样,按天分组。