我知道这个很奇怪。我有一个名为schedule
的表,其中有一个名为Date
的列,列类型为DATE
。我在本栏中有日期(YYYY-MM-DD格式)从2012-11-01到2013-01-02。如果我输入一个日期,任何一个日期,在2012-12-01之间的任何地方,它就会重新启动循环。因此,如果我选择2012-11-15至2012-12-15,它将从11月15日至12月1日打印,但在12月1日之后,它将在11月15日再次开始打印。如果我选择2012年11月15日至2012年11月30日或2012年12月02日至2012年12月30日,一切正常,只是当涉及到特定日期时,才会导致问题。这是我的代码:
<?php
////////////////////////////////////////////////////////
//////First set the date range that we want to use//////
////////////////////////////////////////////////////////
if(isset($_POST['from']) && ($_POST['from'] != NULL))
{
$startDate = $_POST['from'];
echo "<script>alert (\"startDate: " . $startDate . "\")</script>";
}
else
{
//Default date is Today
$startDate = date("Y-m-d");
echo "<script>alert (\"startDate: " . $startDate . "\")</script>";
}
if(isset($_POST['to']) && ($_POST['to'] != NULL))
{
$endDate = $_POST['to'];
echo "<script>alert (\"endDate: " . $endDate . "\")</script>";
}
else
{
//Default day is one month from today
$endDate = date("Y-m-d", strtotime("+1 month"));
echo "<script>alert (\"endDate: " . $endDate . "\")</script>";
}
//////////////////////////////////////////////////////////////////////////////////////
//////Next calculate the total amount of days selected above to use as a limiter//////
//////////////////////////////////////////////////////////////////////////////////////
$dayStart = strtotime($startDate);
$dayEnd = strtotime($endDate);
$total_days = abs($dayEnd - $dayStart) / 86400 +1;
echo "<script>alert (\"Total Days: " . $total_days . "\")</script>";
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////Then we're going to get the date range specified from the schedule table and print the results//////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//Select the dates from the schedule table, limited to the total amount days.
$sql = ("SELECT Date FROM schedule WHERE Date BETWEEN '$startDate' AND '$endDate' LIMIT $total_days");
//Run a check on the query to make sure it worked. If it failed then print the error.
if(!$result_date_query = $mysqli->query($sql))
{
die('There was an error getting the date from the schedule table [' . $mysqli->error . ']');
}
//Loop through the results while a result is being returned.
while($row = $result_date_query->fetch_assoc())
{
//First format and then print the all the dates selected.
echo "<td class=\"schedule_date_cell\">" . date('M j', strtotime($row['Date'])) . "</td>";
}
//Free the result.
$result_date_query->free();
?>
我不知所措。我添加了一些echo语句来显示正在发生的事情,并且一切都如预期的那样。我只是不明白之前和之后的所有日期是如何完美工作的,但是任何包含12月1日的内容都会使循环重新开始。我不确定它是否相关,但列中有相同日期的倍数,这就是我在查询中设置
LIMIT
的原因。我很想知道答案,希望有人能破案!
**编辑:**我在PHPmyadmin中尝试了注释中建议的相同查询,结果相同。我还尝试删除
LIMIT
并从单引号'2012-11-01'
更改为双引号"2012-11-01"
,结果仍然相同。**EDIT2:**对于
Date
列中的每个日期,每个日期有92个实例。例如,2012-12-01有92条记录,2012-12-02有92条记录等等。有趣的是,当我从查询中删除LIMIT
并使用2012-11-30到2012-12-15(11月30日到12月15日)的日期范围时,将打印11月29日、11月30日和12月1日,然后一次又一次重复这三个日期,92次!然后,它开始打印12月2日,12月3日,12月4日…12月15日的剩余时间,然后一次又一次地重复这些日期,92次!这只是证明了,由于某种原因,循环在12月1日重新启动,因为如果我输入的日期范围是11月1日到11月3日,它会在重复92次之前打印该范围内的所有日期。这个LIMIT
的原因是为了阻止它返回每个日期的所有实例,所以我只得到11月1日到11月3日的一次,而不是92次,但是当这个限制被删除时,我们可以看到12月1日导致了一些奇怪的问题。**EDIT3:**我创建了一个新表
schedule2
与schedule
相同,并输入了2012-11-01到2013-01-02的相同日期范围,但这次每个表只有一个实例。然后我再次运行我的查询,它在任何日期组合中都工作得很好。很明显,问题是schedule
表中有不止一个这个日期的实例,但我不明白为什么会有问题。我不明白这个日期对循环有什么影响。在您提出建议之前,是的,我确实需要在表中包含同一日期的多个实例;) 最佳答案
它在12月1日循环的事实在很大程度上只是一个巧合。我不知道MySQL在内部是如何工作的,但是如果您不给它一个命令,那么当您请求它时,它将对数据应用它感觉到的任何命令。
结合这个事实,你有重复的日期,然后你结束的情况,你描述了自发发生没有明显的原因。
因为每个日期只需要一次,并且希望它们按时间顺序显示,所以在进行查询时,需要告诉MySQL需要这两个东西。因此,添加DISTINCT
和ORDER BY
命令:
SELECT DISTINCT(Date) FROM schedule WHERE Date BETWEEN '$startDate' AND '$endDate' ORDER BY Date ASC
关于php - 为什么日期“2012-12-01”会导致打印表一遍又一遍地重复?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13522899/