【问题标题】:News Archive in PHP and MYSQL displaying zero resultsPHP 和 MYSQL 中的新闻存档显示零结果
【发布时间】:2012-03-29 04:25:22
【问题描述】:

我正在尝试列出之前发布的所有帖子并显示帖子的数量,例如

2011
  November (14)
  October (12)
  April (3)
2010
  December (2)

    etc etc

以下代码是我尝试完成这项工作的方式,但它实际上并没有返回任何结果,我似乎无法理解为什么。

$sql = "SELECT nid, ndate FROM weaponsnews
    ORDER BY ndate DESC";
$result = $db->query($sql);

$data = array();

while($row = $result->fetch_assoc())
{
    $year = date('Y', strtotime($row['ndate']));
    $month = date('m', strtotime($row['ndate']));

    $data[$year][$month][] = $row;
}
$result->free();

foreach($data as $_year => $_months)
{
    echo $_year. "<br>";
    foreach($_months as $_month => $_entries)
    {
        $mentries = count ($_entries);
        echo $_month. " (" .$mentries. ")";

    }
}

【问题讨论】:

    标签: php mysql archive


    【解决方案1】:

    如果您在 MySQL 查询中进行计数,会更容易。例如:

    SELECT YEAR(`ndate`) AS 'year', MONTH(`ndate`) AS 'month', COUNT(`nid`) AS 'count'  FROM `weaponsnews ` GROUP BY YEAR(`ndate`), MONTH(`ndate`) DESC
    

    这为您提供了三列,其中第一列是年份,第二列是月份,第三列是该月的项目数。然后,您可以使用 foreach 轻松遍历此列表。比如:

    $data = array();
    while($row = $result->fetch_assoc()) {
        $data[$row['year']][$row['month']] = $row['count'];
    }
    $result->free();
    

    这应该给你一个像这样的数组:

    $data = array(
        '2001' => array(
            '1' => '83',
            '3' => '102'
        ),
        '2012' => array(
            '6' => '43',
            '9' => '33'
        ),
        '2013' => array(
            '7' => '55'
        )
    );
    

    您可以通过遍历数组来打印树:

    foreach ($data as $year => $months) {
        echo $year.'<br>';
        foreach ($months as $month => $count) {
                echo $month.'('.$count.')<br>';
        }
    }
    

    【讨论】:

    • 好的,如何更改它,以便我可以控制它在 PHP 中的显示方式,例如现在它显示以下内容,echo "$record[month] - $record[year] ($record[count])";3 - 2012 (1),这很好,我知道它正在工作,但是如果我想将其显示为 March 2012 (1) 怎么办?我知道我可以使用 strtotime 来做到这一点,但我可以把它放在哪里
    • 扩展了我的答案。还没有尝试过代码,但它应该让你知道如何去做。让我知道它是否有效。
    • 我实际上无法让你编辑的第二部分工作,我已经非常接近我想要的但只是这样做,我只是想改变它的日期格式显示在$rows = $db-&gt;fetch_all_array($sql); foreach($rows as $record){ echo date('F', $record[month]). " " .date('o', $record[year]). "($record[count])"; }
    • 所以您想要 2012 年 3 月 (1) 而不是树?在这种情况下尝试: echo date('F', mktime(0, 0, 0, $record['month'])).' '.$record['year']. ' ('.$record['count'].')'
    • 太好了,我可以处理,希望客户喜欢它的外观,谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多