PHP和MYSQL中的新闻档案显示零结果

I am trying to list all the previous months in which posts have been made and display the number of posts, for example

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

    etc etc

The following code is how I am attempting to make this work however it doesnt actually return any results and I cannot seem to wrap my head around why.

$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. ")";

    }
}

It's easier if you do the count in the MySQL query. For example:

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

This gives you three columns, where the first is the year, the second is the month, and the third is the number of items in that month. You can then easily iterate through this list with foreach. Something like:

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

This should give you an array like:

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

You can print the tree by iterating through the array:

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