PHP Count网站视图每天创建一行

时间:2016-06-15 05:02:25

标签: php mysql pdo

问题1:我正在尝试创建一个可以计算页面视图的脚本(在刷新时也是如此)并且每天在db上创建一个新行,我将在我的管理仪表板中计算

这是我的代码:

$today = date("d-m-Y");
$siteViewsPrintSQL = $DB_CON -> query("SELECT * FROM statistics");
$siteViewsPrint = $siteViewsPrintSQL -> fetch(); 

if ($siteViewsPrint['date'] == $today) {
    $updateSiteViewsCount = "UPDATE andreaem.statistics SET site_views = site_views+1 WHERE date = $today";
    $DB_CON ->query($updateSiteViewsCount);
} elseif ($siteViewsPrint['date'] != $today) {
    $createSiteViewsCount = "INSERT INTO `andreaem`.`statistics` (`ID`, `date`, `site_views`, `new_users`) VALUES (NULL, '$today', '0', '0');";
    $DB_CON -> query($createSiteViewsCount);
    $updateSiteViewsCount = "UPDATE andreaem.statistics SET site_views = site_views+1 WHERE date = $today";
    $DB_CON -> query($updateSiteViewsCount);
} else {
    print 'Error while updating siteviews.';
}

我知道可能不是正确的做法(接受任何建议),这会导致每次刷新创建一个新行而不是更新现有行。

问题2:在db中保存这个值之后,我必须从表中获取并在我的仪表板中打印,所以我正在使用PDO连接和array_sum(函数convert_to_unit和bd_nice_number转换n K中的数字if为1000或M if为1000000)

$siteViewsPrintSQL = $DB_CON -> query("SELECT site_views FROM statistics");
$siteViewsPrint = $siteViewsPrintSQL -> fetchAll(PDO::FETCH_ASSOC);
$siteViewsPrintResult = convert_to_unit(bd_nice_number(array_sum($siteViewPrint)));

这返回0而不是总和。

感谢所有可以提供帮助的人!

1 个答案:

答案 0 :(得分:3)

是的,坦率地说,这段代码与正确的代码正好相反。

由于您显然刚刚开始学习数据库,我强烈建议您采用最基本的方式,即存储每个命中。它将使您的代码显着缩短,并让您学习基本的数据库功能。

所以让你的桌子像

dt datetime,
ip varchar(15),

然后在每次点击运行这样的查询

$stmt = $DB_CON->prepare("INSERT INTO stats VALUES (NOW(),?)");
$stmt->execute([$_SERVER['REMOTE_ADDR']]);

要获得计数,您必须运行此代码

$count = $DB_CON->query("SELECT count(*) FROM stats")->fetchColumn();

最后一个查询是最重要的:正如您所看到的,数据库可以为您计算(以及求和,计算平均值或执行其他任何计算)。所以你永远不应该在PHP方面做任何计算,总是从数据库请求最终结果。

使用此数据库设置,您只需按以下方式对结果进行分组即可获得每日流量:

$daily = $DB_CON->query("SELECT count(*), date(dt) FROM stats GROUP BY date(dt)")->fetchAll();

甚至可以吸引新访客。