问题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而不是总和。
感谢所有可以提供帮助的人!
答案 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();
甚至可以吸引新访客。