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';
}