用于跟踪唯一页面视图的PHP会话

时间:2017-05-15 19:10:49

标签: php sql session mysqli

我想使用会话来跟踪唯一的网页浏览量。我知道,这不是一种非常强大的方法,但足以满足我的目标。

在第一页加载时,会话变量已设置,并且数据库中的字段会递增。在后续页面视图中,它不会递增,因为增量是以未设置的会话变量为条件的。

这是我的代码:

$pagenumber = 1;

//other stuff here...

session_start();

if (!isset($_SESSION[$pagenumber])) {
    $storeview = mysqli_query($dbconnect, "UPDATE tblcount SET views=views+1 WHERE id='$pagenumber'");
    $_SESSION[$pagenumber] = $pagenumber;
}
echo $_SESSION[$pagenumber];

$Recordset1 = mysqli_query($dbconnect, "SELECT views FROM tblcount WHERE id = '$pagenumber'");
$row_Recordset1 = mysqli_fetch_assoc($Recordset1);

echo "Viewed ".$row_Recordset1['views']." times";

第一个回声仅用于测试。它回显了页面刷新时的正常值,并且第一次增量工作,但视图计数在每次页面刷新时继续递增,这不应该是。我不明白为什么。

我发现了一个类似的问题: PHP: Unique visits/hits to specific items using cookies/ip但我遇到了与此处提供的解决方案类似的问题。

帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

问题:

  1. 您每次tblCount更新时间,因为每次脚本完成时您的会话都会关闭。 因此:将session_start()电话号码作为第一行置于代码中。
  2. 不允许将整数设置为$_SESSION变量。因此,如果您设置$_SESSION[$pagenumber] = 'something',则会收到以下通知:
  3.   

    (!)注意:未知:在第0行的“未知”中跳过数字键1

    相当......不可理解。有关详细信息,请参阅this answer

    解决方案:

    $pagenumber作为索引添加到数组(此处为pagenumbers),将该数组添加到$_SESSION变量中。没有通知了。

    session_start();
    
    $pagenumber = 1;
    
    if (!isset($_SESSION['pagenumbers'])) {
        $_SESSION['pagenumbers'] = array();
    }
    
    if (!isset($_SESSION['pagenumbers'][$pagenumber])) {
        updateViews($pagenumber);
        $_SESSION['pagenumbers'][$pagenumber] = $pagenumber;
    }
    
    echo 'Page number: ' . $_SESSION['pagenumbers'][$pagenumber] . '<br/>';
    $views = getViews($pagenumber);
    echo '<pre>Viewed ' . print_r($views, true) . ' times</pre>';
    

    注意:我用我的函数进行测试。他们只是替换你的db处理代码。

答案 1 :(得分:0)

刚刚测试过。这也有效。

在session_start();

//获取页面名称
$ page_url = $ _SERVER [&#39; REQUEST_URI&#39;];

//创建会话ID。将充当访客用户名
如果(isset($ _ SESSION [&#39; ID&#39;]!)){

$ _ SESSION [&#39; id&#39;] = session_id();

//访问第一页
$ visit_id = $ _SESSION [&#39; id&#39;];

}否则{

//后续访问任何页面
$ visit_id = $ _SESSION [&#39; id&#39;];

}

/ ******************
查询DB。每个会话每页只插入一次访问。 这意味着我们需要为每个页面计数以获得其总访问量。 或计算所有记录以获得网站总访问次数 ************** /
$ query_visits_table = mysqli_query($ db_connect,&#34; SELECT * FROM tblcount WHERE(visit_id =&#39; $ visit_id&#39;)AND(page_name =&#39; $ page_url&#39;)&#34;);

if(mysqli_num_rows($ query_visits_table)&gt; 0){

//如果在此会话期间访问过此页面,则不执行任何操作

}否则{

mysqli_query($ db_connect,&#34; INSERT INTO tblcount(visit_id,page_name,visit)VALUES(&#39; $ visit_id&#39;,&#39; $ page_url&#39;,&#39; 1&# 39)&#34);

}

//获取网站总访问次数 $ query_site_visits = mysqli_query($ db_connect,&#34; SELECT * FROM tblcount&#34;);

//对于特定页面
$ query_specific_page_visit = mysqli_query($ db_connect,&#34; SELECT * FROM tblcount WHERE page_name =&#39; $ page_url&#39;&#34;);

if(isset($ query_site_visits)&amp;&amp; isset($ query_specific_page_visit)){

$ site_total_visits = mysqli_num_rows($ query_site_visits);
$ specific_page_visit = mysqli_num_rows($ query_specific_page_visit);

回复&#39;网站总访问量为&#39;。 $ site_total_visits。 &#39;&lt; br /&gt;&#39;;

回声&#39;总访问量为&#39; 。 $ page_url。 &#39;是&#39; 。 $ specific_page_visit;

出口();

}