PHP / MySQL新闻档案

时间:2010-08-17 16:47:46

标签: php mysql

我试图让我的代码正确输出有点困难,见下文。一切正常,但不是显示所有新闻项目,而是每月只显示一个。我需要做的是将选定月份的所有新闻与该月的月/年标题分组。希望这是有道理的。

任何帮助非常感谢。 SS

$theQuery="Select * from isnews WHERE active = '1' GROUP BY YEAR(date) DESC, MONTH(date) ORDER BY YEAR(date) DESC, MONTH(date) DESC";       
   $newsQuery=mysql_query($theQuery);      
   if(mysql_num_rows($newsQuery)>0) {      
   while ($newsResult=mysql_fetch_array($newsQuery)) {        
     $newDate =  $newsResult['date'] ;             
     echo '<div class="date">' . date('F  Y ',strtotime($newDate)) . '</div>';         
     echo '<ul class="press">';        
     echo '<li>
     <img src="'.$wwwUrl.'images/news/'.$newsResult['image'].'" width="'.$newsResult['tnWidth'].'" height="'.$newsResult['tnHeight'].'" title="'.$newsResult['title'].'" alt="'.$newsResult['title'].'" />
     <h3><a href="press-releases/'.$newsResult["id"].'/'.$newsResult["title"].'.php">'.$newsResult["title"].'</a></h3>         
     '.substr($newsResult['descrip'],0,100).'
     <p><a href="press-releases/'.$newsResult["id"].'/'.$newsResult["title"].'.php">Read more</a></p> 
     </li>';
   }
   echo '</ul>';
   } else {
   echo 'We currently have no press releases available';
   }  

3 个答案:

答案 0 :(得分:2)

我可以看到两个问题。首先,GROUP BY是一个聚合函数,因此它用于将多行组合成结果中的一行(例如,如果您想查看为给定月份和年份编写了多少新闻项) 。其次,即使您在每个时间段内获得多个记录,您也要为从数据库中提取的每条记录输出日期标题(例如,如果您有来自同一月份和年份的多个新闻项,则会获得重复的标题)。

更好的解决方案是收集所有活动新闻项(没有GROUP BY子句),然后构建一个数组,然后您可以迭代输出页面:

$query = "SELECT *
  FROM isnews
  WHERE active = '1'
  ORDER BY YEAR(date) DESC, MONTH(date) DESC";
$resultSet = mysql_query($query);

if (mysql_num_rows($resultSet))
{
  $newsArray = array();
  while ($newsResult = mysql_fetch_array($resultSet))
  {
    // The time period is what you will output as your header
    $timePeriod = intval(date("F Y", $newsResult['date']));

    if (!isset($newsArray[$timePeriod]))
    {
      // Create a subarray if needed
      $newsArray[$timePeriod] = array();
    }

    $newsArray[$timePeriod][] = $newsResult;
  }

  foreach ($newsArray as $timePeriod => $newsItems)
  {
    echo '<div class="date">' . $timePeriod . '</div>';         
    echo '<ul class="press">';

    foreach ($newsItems as $item)
    {
     echo '<li>';
     // ... do your news item outputting
     echo '</li>';
    }

    echo '</li>';
    echo '</div>';
  }
}
else
{
  echo 'We currently have no press releases available';
}

答案 1 :(得分:1)

非常感谢你的帮助。

为了创建一个显示年份的侧边栏类型的存档列表,然后是月份及其相应的新闻结果,我尝试稍微调整Daniel的代码。最终结果是手风琴式菜单,其中年份下拉显示月份,然后是月份下拉显示新闻项目。到目前为止,我可以让它工作,但似乎无法让这几个月正常工作。

任何指针/帮助都非常感激。 (以下代码) SS

$query = "SELECT * FROM isnews WHERE active = '1' ORDER BY YEAR(date) DESC, MONTH(date) DESC";
                        $resultSet = mysql_query($query);

                        if (mysql_num_rows($resultSet))
                        {
                        $newsArray = array();

                        echo '<ul>' . PHP_EOL;
                        echo '<li><strong>Press releases:</strong></li>' . PHP_EOL; 

                        while ($newsResult = mysql_fetch_array($resultSet))
                        {                                   
                        $newDate =  $newsResult['date'] ;   
                        $timePeriod = date('F  Y ',strtotime($newDate));
                        $timePeriodY = date('Y',strtotime($timePeriod));
                        $timePeriodM = date('F',strtotime($timePeriod));

                        if (!isset($newsArray[$timePeriodY]))
                        {
                        $newsArray[$timePeriodY] = array();
                        }
                        $newsArray[$timePeriodY][] = $newsResult;                           
                        }
                        foreach ($newsArray as $timePeriodY => $newsItems)
                        {                                                                                           
                        echo '<li><em>' . $timePeriodY . '</em>' . PHP_EOL;  
                        echo '<ul>' . PHP_EOL;

                        foreach ($newsItems as $item)
                        {
                        echo '<li>';
                        echo '<a href="press-releases/'.$item["id"].'/'.$item["title"].'.php">'.$item["title"].'</a>';
                        echo '</li>' . PHP_EOL;
                        }                           
                        echo '</ul>' . PHP_EOL; 
                        echo '</li>' . PHP_EOL;             
                            }
                            echo '</ul>' . PHP_EOL; 
                        }
                        else
                            {
                        echo 'We currently have no press releases available';
                        }

答案 2 :(得分:0)

  

每月仅显示一个

这是正确的,你的GROUP BY不正确。所有列(请参阅*)都应该在GROUP BY中,因为它们都在SELECT中,并且您不使用任何聚合函数。 MySQL有非常奇怪的行为,现在只返回它能找到的第一条记录。

如果您想要所有记录,只需删除整个GROUP BY和ORDER BY月份和年份即可获得正确的排序顺序。在你的PHP中你可以创建一些组,但这与SQL无关。

你可能会考虑ONLY_FULL_GROUP_BY,这有助于防止出现奇怪/错误的结果。