【问题标题】:PHP session for tracking unique page views用于跟踪唯一页面视图的 PHP 会话
【发布时间】:2017-10-14 16:30:38
【问题描述】:

我想使用会话来跟踪独特的页面浏览量。我知道,这不是一个非常强大的方法,但足以满足我的需求。

在第一个页面加载时,会话变量被设置并且数据库中的一个字段递增。在随后的页面浏览中,它不会增加,因为增加的条件是会话变量没有被设置。

这是我的代码:

$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 但我遇到了与那里提供的解决方案类似的问题。

帮助表示赞赏!

【问题讨论】:

  • $pagenumber ??你从哪里得到这个变量?
  • 对不起,我应该提到这一点。 $pagenumber 是前面定义的。例如。 index.php 有 $pagenumber = 1;在开始时定义。
  • 所以显示所有代码。或者展示一个实际正确演示真实代码的示例
  • @RiggsFolly 感谢您的关注。我编辑了这篇文章,以展示更多围绕相关代码发生的事情。这有帮助吗?

标签: php sql session mysqli


【解决方案1】:

问题:

  1. 您每次都在tblCount 更新,因为每次脚本完成时您的会话都会关闭。 所以:将session_start()call 作为代码中的FIRST LINE
  2. 不允许将整数设置为$_SESSION 变量。所以如果你设置$_SESSION[$pagenumber] = 'something',那么你会得到如下通知:

( ! ) 注意:未知:在第 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>';

注意:我用我的函数来测试。它们只是替换了您的数据库处理代码。

【讨论】:

  • 优秀。谢谢@aendeerei
  • 不客气! Apropos:今天,你的一小段代码告诉我永远(不再)低估显示通知的力量。所以我们都学到了一些东西。祝你好运!
【解决方案2】:

刚刚测试过。这也有效。

session_start();

// 获取页面名称
$page_url = $_SERVER['REQUEST_URI'];

// 创建会话 ID。将作为访客用户名
if(!isset($_SESSION['id'])){

$_SESSION['id'] = session_id();

// 用于访问第一页
$visit_id = $_SESSION['id'];

}其他{

// 用于后续访问任何页面
$visit_id = $_SESSION['id'];

}

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

if(mysqli_num_rows($query_visits_table) > 0){

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

}其他{

mysqli_query($db_connect, "INSERT INTO tblcount (visit_id, page_name, visit) VALUES('$visit_id', '$page_url', '1')");

}

// 获取网站总访问量
$query_site_visits = mysqli_query($db_connect, "SELECT * FROM tblcount");

// 针对特定页面
$query_specific_page_visit = mysqli_query($db_connect, "SELECT * FROM tblcount WHERE page_name='$page_url'");

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

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

echo '网站总访问量是'。 $site_total_visits 。 '
';

echo '总访问次数' 。 $page_url 。 ' 是 ' 。 $specific_page_visit;

退出();

}

【讨论】:

  • 谢谢@Hans。我想记录每个页面、每个访问者、每个会话的一次访问。所以基本上我只想排除页面重新加载。关于您的建议,我看不出它与我的代码有何不同。
  • 好的。我有一个主意。我只是需要一些时间,比如 15 分钟来整理。
  • 我想出了一些不同的东西。希望你试一试。这有点棘手,因为我们正在处理一个没有注册用户名用作过滤器的案例。这就是我引入那个 session-id 想法和 page_name 的原因。这意味着你必须调整你的数据库表来尝试这个。
  • 非常感谢 Hans 的努力,但我得到了 aendeerei 的建议。看起来像 $_SESSION 变量的整数是主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2012-01-05
相关资源
最近更新 更多