PHP/MySQL新闻档案

PHP/MySQL新闻档案,php,mysql,Php,Mysql,我在试图让代码正确输出时遇到了一些困难,请参见下文。它可以正常工作,但不是显示所有的新闻项目,而是每个月只显示一条。我需要做的是将选定月份的所有新闻与该月份的月/年标题进行分组。希望这是有意义的 非常感谢您的帮助。 党卫军 $theQuery=“Select*from isnews WHERE active='1'按年度(日期)说明分组,按年度(日期)说明月份(日期)说明订单”; $newsQuery=mysql\u query($theQuery); 如果(mysql_num_rows($ne

我在试图让代码正确输出时遇到了一些困难,请参见下文。它可以正常工作,但不是显示所有的新闻项目,而是每个月只显示一条。我需要做的是将选定月份的所有新闻与该月份的月/年标题进行分组。希望这是有意义的

非常感谢您的帮助。 党卫军

$theQuery=“Select*from isnews WHERE active='1'按年度(日期)说明分组,按年度(日期)说明月份(日期)说明订单”;
$newsQuery=mysql\u query($theQuery);
如果(mysql_num_rows($newsQuery)>0{
而($newsResult=mysql_fetch_数组($newsQuery)){
$newDate=$newsResult['date'];
回显“”。日期('fy',strottime($newDate))。';
echo'
    ; 回声'
  • .substr($newsResult['descrip'],0100)。'

  • '; } 回声“
”; }否则{ echo“我们目前没有可用的新闻稿”; }
它每个月只显示一个

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

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


你可以考虑,这有助于防止奇怪/错误的结果。

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

更好的解决方案是收集所有活动的新闻项目(不使用
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';
}
$query=“选择*
来自isnews
其中活动='1'
按年份(日期)描述、月份(日期)描述的订单”;
$resultSet=mysql\u query($query);
if(mysql_num_行($resultSet))
{
$newsArray=array();
而($newsResult=mysql\u fetch\u数组($resultSet))
{
//时间段是您将输出为标题的时间段
$timePeriod=intval(日期(“fy”),$newsResult['date']);
如果(!isset($newsArray[$timePeriod]))
{
//如果需要,创建子阵列
$newsArray[$timePeriod]=array();
}
$newsArray[$timePeriod][]=$newsResult;
}
foreach($newsArray作为$timePeriod=>$newsItems)
{
回显“.$timePeriod.”;
echo'
    ; foreach($newsItems作为$item) { 回音“
  • ”; //…进行新闻项目输出 回音“
  • ”; } 回音“”; 回声'; } } 其他的 { echo“我们目前没有可用的新闻稿”; }
非常感谢您的帮助

我试着对Daniel的代码进行一些修改,以创建一个侧栏类型的存档列表,显示年份、月份及其相应的新闻结果。最终的结果是一个手风琴式菜单,其中年份下拉显示月份,然后月份下拉显示新闻项目。我可以让它工作到几年前,但似乎不能让几个月正常工作

非常感谢任何指点/帮助。(代码如下) 党卫军

$query=“SELECT*FROM isnews WHERE active='1'按年份(日期)说明、月份(日期)说明排序”;
$resultSet=mysql\u query($query);
if(mysql_num_行($resultSet))
{
$newsArray=array();
echo'
    ”.PHP_EOL; echo'
  • 新闻稿:
  • '.PHP\u EOL; 而($newsResult=mysql\u fetch\u数组($resultSet)) { $newDate=$newsResult['date']; $timePeriod=date('fy',strottime($newDate)); $timePeriodY=日期('Y',strottime($timePeriod)); $timePeriodM=日期('F',strottime($timePeriod)); if(!isset($newsArray[$timePeriodY])) { $newsArray[$timePeriodY]=array(); } $newsArray[$timePeriodY][]=$newsResult; } foreach($newsArray作为$timePeriodY=>$newsItems) { echo“
  • ”.$timePeriodY.''.PHP_EOL; echo'
      ”.PHP_EOL; foreach($newsItems作为$item) { 回音“
    • ”; 回声'; echo'
    • '。PHP_EOL; } echo'
    '。PHP_EOL; echo'
  • '。PHP_EOL; } echo'
'。PHP_EOL; } 其他的 { echo“我们目前没有可用的新闻稿”; }
在这种情况下,按他想要收集的所有列分组是没有帮助的,因为除非有重复的记录,否则它将返回每一行……当然是我
$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';
}
$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';
                        }