基于学年的 PHP 和 MySQL 存档
Posted
技术标签:
【中文标题】基于学年的 PHP 和 MySQL 存档【英文标题】:PHP & MySQL Archive based on School Year 【发布时间】:2013-04-12 17:11:01 【问题描述】:我需要帮助创建基于学年的帖子存档。在website 的帮助下,我设法创建了一个普通存档。我仍然是 php 新手,感觉我错过了一些对普通后端开发人员来说可能很明显的东西。
这是我的存档当前外观的树形视图:
2013
April
Post Title
March
Post Title
February
Post Title
Post Title
Post Title
January
Post Title
Post Title
Post Title
2012
December
Post Title
Post Title
Post Title
November
Post Title
Post Title
Post Title
我不禁觉得它快到了,但我不知道如何让网站知道要显示哪些日期范围。我试过的一件事是添加这个查询:
$result = mysql_query("SELECT * FROM table WHERE table_date BETWEEN '2012-08' and '2013-07'") or die(mysql_error());
它奏效了,这几乎是我想要的……但我不想在每个学年结束之前都添加查询!必须有一种比每年手动添加这些范围更好的方法。
编辑:这是我当前的代码。它给了我错误“未定义的索引:hound_date”
$result = mysql_query("SELECT CONCAT( YEAR(hound_date-INTERVAL 7 MONTH),'-',
1+YEAR(hound_date-INTERVAL 7 MONTH)) AS 'academic year',
COUNT(*) AS 'number of events'
FROM hound
GROUP BY CONCAT( YEAR(hound_date-INTERVAL 7 MONTH),'-',
1+YEAR(hound_date-INTERVAL 7 MONTH))") or die(mysql_error());
// An array to store the data in a more managable order.
$data = array();
// Add each entry to the $data array, sorted by Year and Month
while($row = mysql_fetch_array($result))
$hound_date=my_date($row['hound_date']);
list($year,$month)=explode(" ", $hound_date);
$data[$year][$month][] = $row;
// Go through each Year and Month and print a list of entries, sorted by month.
foreach($data as $_year => $_months)
echo '<hr/>';
echo "<h2>$_year</h2>";
foreach($_months as $_month => $_entries)
echo '<hr/>';
echo "<h3>$_month</h3>";
echo "<ul>";
foreach($_entries as $_entry)
echo '<li><a href="/?story='.$_entry["hound_id"].'">'.$_entry["hound_name"].'</a> </li>';
echo "</ul>";
任何帮助将不胜感激!
【问题讨论】:
如何请求限制日期?每年是否有一个页面看起来像这样?:http://example.com/posts/2012/
除了查询之外,我的代码中目前没有开始或结束日期。如何添加一般的开始和结束日期?我的意思是如果学年从八月开始到五月结束,我该如何编写代码来生成每个学年的开始和结束年份?
我明白了,那你得去date();
,我会更新我的答案。
哦,我很傻!是的,我有一个名为 table_date 的变量,它发布每个帖子的日期。
【参考方案1】:
首先要做的是决定如何定义您的学年。它们似乎定义如下:
2012 年 8 月 1 日至 2013 年 7 月 31 日是 2012-2013 学年
也就是说,学年从七月初开始。
如果是这种情况,那么您可以使用这个 MySQL 表达式将任何特定的日期列转换为文本字符串,例如“2012-2013”,表示它发生的学年。
CONCAT(YEAR(datecol-INTERVAL 7 MONTH),'-', 1+YEAR(datecol-INTERVAL 7 MONTH))
例如,您可以编写这样的查询来计算每个学年的行数。
SELECT CONCAT( YEAR(datecol-INTERVAL 7 MONTH),'-',
1+YEAR(datecol-INTERVAL 7 MONTH)) AS 'academic year',
COUNT(*) AS 'number of events'
FROM table
GROUP BY CONCAT( YEAR(datecol-INTERVAL 7 MONTH),'-',
1+YEAR(datecol-INTERVAL 7 MONTH))
关键是,您使用- INTERVAL 7 MONTH
的一点日期算术应该可以很好地将日历年转换为学年。
【讨论】:
谢谢,让我试一试,看看它与我现有的代码的效果如何:D 虽然这似乎是对的(我知道 PHP,但只知道一些基本的 MySQL),但我认为这可能超出了 OP 的当前理解和目标。 我刚刚编辑了我的原始帖子并提供了我的实际代码。奥利,我试图使用你的代码,但它给了我错误“未定义的索引:猎犬日期”。我需要两个查询来调用数据库中的其余表吗?以上是关于基于学年的 PHP 和 MySQL 存档的主要内容,如果未能解决你的问题,请参考以下文章
php 在自定义帖子类型存档和一些自定义分类存档上强制命令到`menu_order`