2016-05-02 94 views
2

我试图检索每个月的数据(01,02,03等),但我不知道如何为它做一个循环。现在我每个月都有这个! (如果跳过了其他几个月,所以你不必看到全部)。PHP和MYSQLI循环遍历几个月

$queryJanuary = "SELECT count(*) AS num FROM unique_ip WHERE datum BETWEEN '2016-01-01' AND '2016-01-31'"; 
$queryFebruari = "SELECT count(*) AS num FROM unique_ip WHERE datum BETWEEN '2016-02-01' AND '2016-02-28'"; 


    if ($January = $Connection->query($queryJanuary)) { 
      $Februari = $Connection->query($queryFebruari); 

      $rowJanuari = mysqli_fetch_assoc($January); 
      $rowFebruari = mysqli_fetch_assoc($Februari); 

      $january = $rowJanuari['num']; 
      $februari = $rowFebruari['num']; 

    }else { 
     die(); 
      } 

     $data = array($january, $februari); 

    echo json_encode($data); 

数据库方案:

  1. IP unsigned int - 无PK
  2. 基准日期NOT NULL
  3. 告诉INT NOT NULL - 默认1

    • 数据意味着日期
    • 告诉手段计数

而且,它是方便或至少很好的做法,使查询的到预处理语句?此代码只会在只有我和其他管理员可以访问的私人页面上提供。

+0

显示你的表结构 –

+0

@SunilPachlangia我加入它 – Koenman

回答

-1

我真的不知道你是什么做的意图,只是试试这个为你的SQL:

$queryJanuary = "SELECT count(datum) AS num FROM unique_ip WHERE (datum>='2016-01-01' AND datum<='2016-01-31')"; 
$queryFebruari = "SELECT count(datum) AS num FROM unique_ip WHERE (datum>='2016-02-01' AND datum<='2016-02-28')"; 

$data   = array(); //INITIALIZE DATA TO AN EMPTY ARRAY... 
try{ 
    $January  = $Connection->query($queryJanuary); 
    $Februari = $Connection->query($queryFebruari); 

    $rowJanuari = mysqli_fetch_assoc($January); 
    $rowFebruari = mysqli_fetch_assoc($Februari); 

    $january  = $rowJanuari['num']; 
    $februari = $rowFebruari['num']; 
    $data  = array($january, $februari); 
}catch(Exception $e){ 
    //HANDLE YOUR EXCEPTION HERE... 
    die(); 
} 

echo json_encode($data); 

你可以如做所有这些在一个SQL语句,像这样:

$queryAll  = "SELECT COUNT(datum) AS countJan, 
        (SELECT COUNT(datum) FROM unique_ip WHERE (datum>='2016-02-01' AND datum<='2016-02-28')) AS countFeb 
        FROM unique_ip AS af WHERE (datum>='2016-01-01' AND datum<='2016-01-31')"; 
$data   = array(); //INITIALIZE $data TO AN EMPTY ARRAY... 
$rowAll   = array(); //INITIALIZE $rowAll TO AN EMPTY ARRAY... 

try{ 
    $query  = $Connection->query($queryAll); 
    $rowAll  = mysqli_fetch_assoc($query); 
    $january  = $rowAll['countJan']; 
    $februari = $rowAll['countFeb']; 
    $data  = array($january, $februari); 
    // BUT YOU DON NOT NEED TO PUSH $january & $februari INTO THE $data ARRAY 
    // BECAUSE YOU HAVE THOSE VALUES ALREADY INSIDE THE $rowAll VARIABLE 
    // WHICH SHOULD CONTAIN THESE KEYS: "countJan" & "countFeb" 
}catch(Exception $e){ 
    //HANDLE YOUR EXCEPTION HERE... 
    die(); 
} 

//DUMP THE VALUES TO SEE IF THEY ARE WHAT YOU EXPECTED 
var_dump($data); 
var_dump(rowAll); 
+0

我正在尝试检索我的网站每月访问的数量。数据库中充满了独特的IP地址,并附有访问日期。我正在计算每月唯一ip的总数并将它们添加到数组中 – Koenman

+0

经过一些测试并尝试之后,我更喜欢你的方法!在我的眼睛里工作并且易于阅读更容易。 – Koenman

0

使用查询:

SELECT count(*) AS num, EXTRACT(YEAR_MONTH FROM datum) as yearmonth FROM unique_ip WHERE datum BETWEEN '2016-01-01' AND '2016-05-02' GROUP BY EXTRACT(YEAR_MONTH FROM datum) DESC"; 

这SQL会给你明智的一个月算..

+0

谢谢你,你也知道把输出数组的最佳方式? – Koenman

+0

循环访问结果,并将yearmon作为数组的索引并将计数值指定为数组的值 –

+0

解决了问题,谢谢您的回答 – Koenman

1

请尝试以下查询。这将有助于您在单个查询中统计所有月份。

$queryallmonth = "SELECT MONTHNAME(datum) Month,COUNT(ip) num FROM unique_ip GROUP BY DATE_FORMAT(datum, '%Y%m')"