Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 将空值设置为不在MySQL中的日期_Php_Mysql_Date Formatting - Fatal编程技术网

Php 将空值设置为不在MySQL中的日期

Php 将空值设置为不在MySQL中的日期,php,mysql,date-formatting,Php,Mysql,Date Formatting,因此,我使用该代码从MySQL获取一些数据: <? $query=mysql_query("SELECT date,COUNT(*) as num FROM downloads WHERE prjID='".$_GET['id']."' GROUP BY date ORDER BY date ASC"); $num=mysql_num_rows($query); $res=''; $i=0; while($row=mysql_fetch_array(

因此,我使用该代码从MySQL获取一些数据:

<?
$query=mysql_query("SELECT date,COUNT(*) as num FROM downloads WHERE prjID='".$_GET['id']."' GROUP BY date ORDER BY date ASC");
$num=mysql_num_rows($query);
$res='';
$i=0;
while($row=mysql_fetch_array($query)){

$i++;
$date=date("d.m.Y", strtotime($row['date']));

$dan=date("d", strtotime($row['date']));
$mesec=date("m", strtotime($row['date']));
$leto=date("Y", strtotime($row['date']));

if($i=1){
$danPrvi=$leto.", ".($mesec-1).", ".$dan;
$dan1=date("d", strtotime(time()));
$mesec1=date("m", strtotime(time()));
$leto1=date("Y", strtotime(time()));
$danZadnji=$leto1.", ".($mesec1-1).", ".$dan1;
}

$numb=1;

if($row['num']!=1){
$res.="[Date.UTC(".$leto.",".($mesec-1).",".$dan."),".$row['num']."], ";
}
else{
if($i!=$num){
$res.="[Date.UTC(".$leto.",".($mesec-1).",".$dan."),".$numb."], ";
}
else{
$res.="[Date.UTC(".$leto.",".($mesec-1).",".$dan."),".$numb."]";
}
}
}
?>
但我希望得到这样的结果:

1.3.2013 - 1
6.3.2013 - 5
1.3.2013 - 1
2.3.2013 - 0
3.3.2013 - 0
4.3.2013 - 0
5.3.2013 - 0
6.3.2013 - 1
我也使用Highcharts,所以日期值的格式必须像date.UTCyear、month-1、day

编辑:
我的数据库中没有所有日期。在我的示例中,只有1.3.2013和6.3.2013,因此,我如何检测并设置值为0的所有日期,这些日期之间没有值>=1?

假设您有所有日期的数据,而不是特定id的数据,您可以进行条件和:

SELECT date, sum(case when prjID='".$_GET['id']."' then 1 else 0 end) as num
FROM downloads
GROUP BY date
ORDER BY date ASC

我想您需要做的是设置一个结构来保存您感兴趣的日期,并在查询中使用它,或者对查询数据进行后处理。例如:

<?php
$query=mysql_query("SELECT date,COUNT(*) as num FROM downloads WHERE prjID='".$_GET['id']."' GROUP BY date ORDER BY date ASC");
$num=mysql_num_rows($query);

// Get the first and last dates in the result set
$firstRow = mysql_result($query, 0);
$lastRow = mysql_result($query, $num-1);

// Now make thos the begin and end dates
$beginDate = new DateTime(strtotime($firstRow['date']));
$endDate = new DateTime(strtotime($lastRow['date']));
$currentDate = $beginDate;
$interestingDates = array();

// Populate our interestingDates array with all counts set to 0
while ($currentDate <= $endDate){
    $interestingDates[$currentDate->format('d.m.Y')] = 0;
    $currentDate->add(new DateInterval('P1D'));
}

// Reset the data result for looping over
mysql_data_seek($query,0);
while($row=mysql_fetch_array($query)){
    // Go ahead and format the string
    $formatedString = date("d.m.Y", strtotime($row['date']));

    // If the string is in our interestingDates array, update the count
    if (array_key_exists($formatedString, $interestingDates)){
        $interestingDates[$formatedString] = $row['num'];
    }
}

// Print it out
foreach ($interestingDates as $key=>$value){
    print "$key - $value\n";
}
免责声明-我并没有实际运行这段代码,我只是在脑海中写下了它。您可能需要测试/调试它。

警告!在SQL中执行此操作是一种非常糟糕的方式,但如果您愿意,可以:


2.3.2013实际上不存在于表中,是吗?我的意思是,如果是的话,你会数到1,对吗?我的观点是,如果数据库中不存在,你需要在其他地方找到日期。。i、 在你的代码中。数据库不会知道它不知道的内容-你永远不会得到不存在的结果。不,它不在数据库中,但如果它在数据库中,结果将是错误的,或者我应该为每一个空下载做-1。但是在PHP中如何实现呢?我提供了一个示例来回答这个问题。好吧,有一个问题,我只有很少的日期,我应该检测哪些日期缺失,并为它们指定一个值0。例如,我在MySQL中有:1.3.2013-1、3.3.2013-2、6.3.2013-5,我应该检测日期2.3、4.3。我认为上面的代码是最简单的方法。选择开始日期和结束日期,然后用所有感兴趣的日期填充数组,然后获取查询并使用返回的计数更新数组。最后,对完成的数组执行所需操作。我不明白你为什么觉得这是个问题?在查询之后试着猜测日期会被抬高。假设您对2013年3月1日至2013年3月20日期间的所有内容都感兴趣。。。但数据库中的第一个日期是2013年3月5日。。。您如何知道返回到2013年3月1日并填写日期?我更新了代码示例以自动生成感兴趣日期的白名单。在这里,他也不知道开始/完成日期-只知道项目id。@gaRex他知道开始和完成日期。他是否只想从数据库中的第一个日期开始,然后以数据库中的最后一个日期结束?在这种情况下。。他知道开始和结束日期!我不理解你的否决票和评论。你认为他怎么会不知道或无法发现开始和结束日期?他没有db中的所有日期-例如只有两个月。@gaRex。对于给定的pid,他只有两个月的时间。该表可能包含其他ID的所有日期。问题中的SQL在where子句中进行过滤。将条件转移到案例中,使其更有可能工作,这是最简单的解决方案。请参见他的,但我希望得到这样的结果:@gaRex。您似乎真的不理解where子句中的条件和case语句之间的区别。假设在任何一天都有某个id,尽管不一定是感兴趣的id,那么我的声明是有效的。他只有两个日期来处理这个问题:我的数据库中没有所有的日期。在我的例子中,只有1.3.2013和6.3.2013。因此,即使他在其他prjId有其他日期,也不能保证所有日期都是。例如,假设没有人在2013年3月2日下载任何东西。那么案例解决方案将有一个缺口。我完全理解您在技术层面上的解决方案。它在algoryhtm级别上有问题。请重新阅读OP要求。所以他现在只需要通过项目id var。
$sth = $dbh->prepare('SELECT date,COUNT(*) as num FROM downloads WHERE prjID= :prjID GROUP BY date ORDER BY date ASC');
$sth->bindParam(':prjID', $_GET['id'], PDO::PARAM_INT);
$sth->execute();
SELECT dynamic_date AS date, COUNT(downloads.date) AS num FROM (
    SELECT DATE_ADD(start, INTERVAL i - 1 DAY) AS dynamic_date, prjID FROM
      (
        SELECT @i := @i + 1 AS i FROM 
        (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
        (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
        (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
        (SELECT @i:=0) init
      ) i_sequence,
      (SELECT MIN(date) start, MAX(date) finish, prjID FROM downloads WHERE prjID=5 GROUP BY prjID) minmax
    WHERE DATE_ADD(start, INTERVAL i - 1 DAY) <= finish
) date_sequence
LEFT JOIN downloads ON dynamic_date = downloads.date and downloads.prjID=date_sequence.prjID
GROUP BY dynamic_date
;