Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP计数每天创建一行的站点视图_Php_Mysql_Pdo - Fatal编程技术网

PHP计数每天创建一行的站点视图

PHP计数每天创建一行的站点视图,php,mysql,pdo,Php,Mysql,Pdo,问题1:我正在尝试制作一个脚本,该脚本可以计算页面视图(也可以在刷新时)并每天在db上生成一行,我将在我的管理仪表板中计算 这是我的密码: $today = date("d-m-Y"); $siteViewsPrintSQL = $DB_CON -> query("SELECT * FROM statistics"); $siteViewsPrint = $siteViewsPrintSQL -> fetch(); if ($siteViewsPrint['date'] == $

问题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连接和数组求和(函数将_转换为_单位,bd _nice _number转换为n K中的数字,如果是1000,则转换为m,如果是1000000)

这将返回0而不是总和


感谢所有能帮忙的人

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

由于您显然刚刚开始学习数据库,我强烈建议您采用最基本的方法,即存储每一次点击。它将使您的代码大大缩短,并使您能够学习基本的数据库功能

所以把你的桌子做成

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();

甚至还可以获得新的访客。

嗨,谢谢你的回复,现在的问题是:使用第一个代码,它是否每次都会生成一行新的内容?为什么在执行查询时要传递远程地址?(取而代之的是,我不想为了隐私而存储IP),所以我必须删除所有代码,只使用这两行?当我使用查询进行计数时,它是只对行数进行计数还是对行中的所有值进行求和?是的,它每次都对每一行进行计数。这就是重点。每个命中计数器都应该存储IP。不,这绝对与隐私无关。您不仅要更改代码,还要更改表结构。当您使用查询进行计数时,它确实会对行进行计数,正如您可能猜到的那样。好的,我已经更改了表并删除了所有代码,在主页中我粘贴了前两行,在我的仪表板中粘贴了$count行,但它没有插入,因为我看到了确实是的,我尝试使用这个$ip=$\u服务器['REMOTE\u ADDR',使它更具noob proof$现在=日期(“Y-m-d h:m:s”)$stmt=$DB_CON->prepare(“插入统计值($now,$ip”);$stmt->execute();但仍然不工作,在$stmt return object(PDOStatement)#2(1){[“queryString”]=>string(58)“插入统计值”(2016-06-15 05:06:41,10.240.0.195)}因此,这是正确的,但我看不到表中的值。这段代码肯定不会工作,因为它完全错误。如果插入失败,那么您必须获得错误消息并修复错误。有关详细信息,请参阅此答案:请注意,您必须修复我上面发布的代码,而不是您自己的错误方法。
$daily = $DB_CON->query("SELECT count(*), date(dt) FROM stats GROUP BY date(dt)")->fetchAll();