按日期和主机地址填写SQL

时间:2016-02-23 08:46:50

标签: php sql arrays

我试图在我的网站上每天计算唯一身份访问者。 这是我制作的剧本:

<?php
require_once 'database.php';    

$dateQuery = $db->prepare("SELECT count(*) AS hits FROM tracked GROUP BY DATE(date), hostadrr");
$dateQuery->execute();
$rows = $dateQuery->fetchAll(PDO::FETCH_ASSOC);

$array = array();
foreach ( $rows as $row ) {
  $array[] = [(int)$row['hits']];
}

$json = json_encode($array);

echo $json;
?>

我从json_encode得到的这个数组是这样的: [[3],[1],[1],[2],[10],[3],[1],[2]]

数组中有8个数组是正确的,这代表每一天。但每个数组中的数字只是我网站上点击的总数,而不是按用户的主机地址分组。我在这做错了什么?数组应该是:[[1],[1],[1],[1],[1],[1],[1],[1]](因为我自己测试它电脑;))

1 个答案:

答案 0 :(得分:0)

首先,始终尝试将代码删除到最小的问题。例如,不要混淆JSON编码,PHP和MySQL,并且感到惊讶,结果不是你的样子。

从SQL查询开始:

SELECT count(*) AS hits FROM tracked GROUP BY DATE(date), hostadrr

您是否尝试在控制台或phpMyAdmin中运行该程序?是否显示正确的结果?

我猜不会。为什么?因为此查询仅返回多个匹配而与日期或主机地址无关。因此,即使您说数据在一天中的总点击数是正确的,您甚至无法确定它是否是正确的订单,或者它是否会在没有任何点击的情况下遗漏数天。

由于您没有提供SQL架构,我只能假设一个。但是你的查询至少应该是这样的:

SELECT 
    date AS date,
    hostadrr AS host,
    count(*) AS hits 
FROM 
    tracked 
GROUP BY 
    DATE(date), 
    hostadrr
ORDER BY 
    date ASC

现在,您将获得每个日期/主机组合的一行以及相应的命中数,您可以将其分配给数组,即

$array[$row['date']][$row['host]] = (int) $row['hits'];