Php 我的页面浏览量计数器在我的页面上递增1个单位,但在辅助页面上递增3个单位

Php 我的页面浏览量计数器在我的页面上递增1个单位,但在辅助页面上递增3个单位,php,Php,我在做一个功能来计算访客,浏览量和页面浏览量 现在我只是想计算页面浏览量,但我有一个奇怪的问题 我有一个包含以下列的统计表:“用户、访问、页面视图” 现在我只想在用户访问某个页面时增加我的页面浏览量 每次我访问我的主页,我的页面浏览量都会增加1个单位,但当我访问第二个页面时,我的专栏页面浏览量会增加3个单位,我只需要1个单位 你知道为什么会这样吗 我认为问题出在我的getHome()函数中,因为如果我在getHome()之前或之后调用我的函数countViews(),我会有不同的行为。但我不知道

我在做一个功能来计算访客,浏览量和页面浏览量

现在我只是想计算页面浏览量,但我有一个奇怪的问题

我有一个包含以下列的统计表:“用户、访问、页面视图”

现在我只想在用户访问某个页面时增加我的页面浏览量

每次我访问我的主页,我的页面浏览量都会增加1个单位,但当我访问第二个页面时,我的专栏页面浏览量会增加3个单位,我只需要1个单位

你知道为什么会这样吗

我认为问题出在我的getHome()函数中,因为如果我在getHome()之前或之后调用我的函数countViews(),我会有不同的行为。但我不知道为什么

当我的getHome()上面有我的countViews()时,我似乎在第二页上调用了3次我的函数countViews

但是我只在index.php文件上调用我的函数countViews(),在这个函数下面我有一个getHome()函数,在这里我可以导航到项目中的所有页面

function countViews(){
    $pdo = start();
    //if Im not logged as admin
    if(!isset($_SESSION['admin'])){
        //So at first I read my table stats, if my table dont have any row,
        // I create a row with my columns with value of '0'.
        $readStats= $pdo->prepare("SELECT * FROM stats"); 
        $readStats->execute();  

        if($readStats->rowCount()<1){
            $insStats= $pdo->prepare("INSERT INTO stats(users, views, page_views) VALUES (?,?,?)");
            $insStats->bindValue(1,'0');
            $insStats->bindValue(2,'0');
            $insStats->bindValue(3,'0');
            $insStats->execute();
        }
       //If my table stats already have one row, I want to increment page_views.  
        else{
            $resultStats= $readStats->fetch(PDO::FETCH_ASSOC);
            $incrementPageViews = $resultStats['page_views'] + 1;
            $updatePageViews =  $pdo->prepare("UPDATE stats set page_views = ?");
            $updatePageViews ->bindParam(1,$incrementPageViews);
            $updatePageViews ->execute();
        }

    }
}
函数countview(){
$pdo=start();
//如果我没有以管理员身份登录
如果(!isset($\u会话['admin'])){
//因此,首先我阅读我的表格统计数据,如果我的表格没有任何行,
//我用值为“0”的列创建一行。
$readStats=$pdo->prepare(“从统计中选择*);
$readStats->execute();
如果($readStats->rowCount()准备(“插入统计(用户、视图、页面视图)值(?,,?)”;
$insStats->bindValue(1,'0');
$insStats->bindValue(2,'0');
$insStats->bindValue(3,'0');
$insStats->execute();
}
//如果我的表统计已经有一行,我想增加页面视图。
否则{
$resultStats=$readStats->fetch(PDO::fetch_ASSOC);
$incrementPageViews=$resultStats['Pageu views']+1;
$updatePageViews=$pdo->prepare(“更新统计设置页面\视图=?”);
$updatePageViews->bindParam(1,$incrementPageViews);
$updatePageViews->execute();
}
}
}
My index.php类似于:

<?php
  ob_start(); session_start();
  require_once('dts/db.php');
  $pdo = start();
  countViews();
 ?>
 <!DOCTYPE>
 <!-- here I have my css and js imports -->

<?php getHome(); ?>

我的第二页:

<title>Untitled Document</title>
 </head> 
 <body>
 <!-- here I have my html -->
 </body>
无标题文档
getHome()函数:

<?php
function getHome(){
    $url = $_GET['url'];
    $url = explode('/', $url);
    $url[0] = ($url[0] == NULL ? 'index' : $url[0]);

    if(file_exists('project/'.$url[0].'.php')){
        require_once('project/'.$url[0].'.php');
    }
    elseif(file_exists('project/'.$url[0].'/'.$url[1].'.php')){
        require_once('project/'.$url[0].'/'.$url[1].'.php');
    }
    else{
        require_once('project/404.php');
    }
}

?>

我的桌子是这样的:


我可以想到两种可能性

  • 您的一个
    require\u once
    文件中有countview
  • 在辅助页面中有一些重定向代码

  • 我想说的是,我肯定这不是魔法。

    我不知道为什么会发生这种情况,但我可以帮你找到

    在CountView()中执行以下操作:

    echo”“;
    var\u dump(“从以下位置调用的计数视图:”。\uuuuu FILE\uuuuuuu);
    回声“;
    
    如果您仍然找不到为什么要使用它,请告诉我,我将帮助您设置xdebug和profiling,它将准确地告诉您包含的文件以及按调用/包含顺序调用的函数

    像这样:

    您所能做的就是将您的函数更改为更简单的函数,并检查此问题是否仍然存在

    function countViews(){
        $tmp = $_SERVER["REQUEST_URI"]; // huge logging: $tmp = print_r($_SERVER, 1);
        file_put_contents($_SERVER['DOCUMENT_ROOT'].'/viewslog.txt', $tmp, FILE_APPEND | LOCK_EX );
    
        $pdo = start();
    

    如果仍然不起作用,您应该向我们展示您的
    stats
    表中有哪些数据。

    您将所有404个请求路由到index.php。看起来您在辅助页面上缺少了2个资源。 尝试修改countview()函数,如下所示:


    我会开始查看您的服务器日志,它会告诉您有哪些文件被请求,似乎有些文件被多次请求。

    问题可能在于函数的调用方,而不是函数定义。我不知道您希望我们如何告诉您为什么要多次调用函数。顺便说一句,您应该这样做了解如何在重复密钥更新时使用
    INSERT…以便您不需要
    SELECT
    查询。您仍然没有提供足够的信息。问题在于辅助页面,对吗?请向我们展示它们的外观。感谢您的帮助Barmar!抱歉,但我不理解您的“您应该学习如何使用INSERT…”。我仍然是php的初学者,我通常会像我在问题中那样进行插入。我会用我在第二页中的内容更新我的问题,但我认为他们没有任何可能导致此问题的内容。你应该在
    stats
    表中添加主键。然后执行
    插入到stats(stats\u id、用户、视图、页面视图)重复键更新页面上的值(1、、?、?)\u views=page\u views+1
    。感谢您的回答Chibueze Opata。但现在,我只计算index.php文件的视图。在我的第二个页面中,我没有ant重定向代码。my getHome()在我的index.php文件中调用的函数,执行所有导航,我只在index.php文件中调用它。谢谢你的回答。我得到以下信息:string(74)“Count Views being being being called from:F:\Xampp\htdocs\website\code\functions.php”。这个functions.php是我拥有所有函数的地方。当你放置countViews()时,他会转储它3次吗回家后和访问辅助页面?不,只转储一次!您还可以使用此技术在整个应用程序生命周期中跟踪指向
    countview
    的所有调用路径。谢谢您的帮助。但我仍然有相同的问题。我真的能理解发生了什么。可能是因为我的.htaccess文件?@Marby不是,但很难说。我认为最好是将你的小应用程序放到github上,我们可以在我们的PC上运行它并测试正在发生的事情。
    function countViews(){
        $pdo = start();
        //if Im not logged as admin
        if(!isset($_SESSION['admin'])){
            //So at first I read my table stats, if my table dont have any row,
            // I create a row with my columns with value of '0'.
            $sth= $pdo->query("SELECT * FROM stats LIMIT 1"); 
            $result = $sth->fetchAll(PDO::FETCH_ASSOC);
    
            if(!$result){
                $pdo->exec("INSERT INTO stats(users, views, page_views) VALUES (0,0,0)");
    
            }
           //If my table stats already have one row, I want to increment page_views.  
            else{
                $pdo->exec("UPDATE stats set page_views = page_views + 1");
    
            }
    
        }
    }
    
    function countViews(){
        $tmp = $_SERVER["REQUEST_URI"]; // huge logging: $tmp = print_r($_SERVER, 1);
        file_put_contents($_SERVER['DOCUMENT_ROOT'].'/viewslog.txt', $tmp, FILE_APPEND | LOCK_EX );
    
        $pdo = start();