1

最近、私のWebサイトで、データベース内のすべての「5月」のニュース記事がニュースページで繰り返されていることに気付きました(www.darlingtontowntwinning.co.uk/news_&_eventsを参照してください) 。

コーディングが面倒で古くなっている可能性があることは知っていますが、Webサイトは私たちのために構築されたものであり、現時点ではWebサイト全体を変更するスキルがありません(まだ学習中です!)。

これが発生しないようにする方法はありますか?表示する各レコードの制限がすでに1つあると思うので、次のようにします。

<div id="right" class="news">
<h3>Archive</h3>
<? $news=$session->getNews("","","",1);?>
<? while($article=mysql_fetch_array($news)){?>
<? 
$date = $article['thedate'];
$year = date('Y', $date);
$month = date('F', $date);
?>
<h4><?=$month." - ".$year;?></h4>
<nav class="small">
<? $innernews=$session->getNews("",$month,$year);?>
<? while($innerarticle=mysql_fetch_array($innernews)){?>
<a href="/news/<?=$innerarticle['ftitle']?>" <? if($title==$innerarticle['ftitle']){?> class="active"<? }?>><?=$innerarticle['title']?></a>
<? }?>
</nav>
<? }?>
</div>

ニュースの取得機能は次のとおりです。

function getNews($title,$month,$year,$group){
global $database;
return $database->getNews($title,$month,$year,$group);}

$database->getNews関数は次のとおりです。

//get news
function getNews($title,$month,$year,$group){
   if($title){
       $q=$this->query("SELECT * FROM ".TBL_NEWS." WHERE ftitle = '$title'" );
       return mysql_fetch_array($q);
   }else if($year && $month){
     $q=mysql_query("SELECT * FROM ".TBL_NEWS." WHERE (FROM_UNIXTIME(thedate, '%Y') = '$year') AND (FROM_UNIXTIME(thedate, '%M') = '$month') ORDER BY thedate DESC");
     return $q;
     }else if($group){
         $q=$this->query("SELECT * FROM ".TBL_NEWS." GROUP BY (FROM_UNIXTIME(thedate, '%Y')),(FROM_UNIXTIME(thedate, '%M')) ORDER BY thedate DESC" );
       return $q;
     }else{
       $q=$this->query("SELECT * FROM ".TBL_NEWS." ORDER BY thedate DESC" );
       return $q;
   }

}

4

2 に答える 2

0

コードは機能しているようです

//get news from group 1

$news=$session->getNews("","","",1);

// for each article work out the date

while($article=mysql_fetch_array($news))
    $date = $article['thedate'];
    $year = date('Y', $date);
    $month = date('F', $date);
...

// then select everything again after working out the date (odd way of doing it)

$innernews=$session->getNews("",$month,$year);

// and output each 

5月はイベントが2回あるので、ヘッダーを2回出力しています。それについて説明させてください...

  • 日付ごとにグループ化されたニュースを取得します (伝えられるところによると)
    • 6月、たった1記事
    • 1:
      • ヘッダーを出力する
      • 記事を選択
    • 記事を出力する
    • 5月 2記事
    • 1:
      • ヘッダーを出力する
      • 記事を選択
      • 記事を出力する
    • 2:
      • ヘッダーを出力する
      • 記事を選択
      • 記事を出力する

この group bySELECT * FROM ".TBL_NEWS." GROUP BY (FROM_UNIXTIME(thedate, '%Y')),(FROM_UNIXTIME(thedate, '%M')) ORDER BY thedate DESCは期待どおりに動作しておらず、5 月に 2 つの結果を返しています

このコードを試してください

<div id="right" class="news">
<h3>Archive</h3>
<? 
$news=$session->getNews();
$bydate=array(); // articles by date
while($article=mysql_fetch_array($news)){
    $k=date('YF', $date);
    if (!isset($bydate[$k])) $bydate[$k]=array(); // create sub array
    $bydate[$k][]=$article; // push article to this sub array
}
foreach ($bydate as $date->$articles){ // run through top array
    ?><h4><?= substr($date,4) . " - " . substr($date,0,4); ?></h4><nav class="small"><? 
    foreach ($articles as $innerarticle){ // now each article within this date
        ?><a href="/news/<?=$innerarticle['ftitle']?>" <? if($title==$innerarticle['ftitle']){?> class="active"<? }?>><?=$innerarticle['title']?></a><?
    }
    ?></nav><?
}
?></div>

そして変更してください

function getNews($title,$month,$year,$group){

function getNews($title=NULL, $month=NULL, $year=NULL, $group=NULL){
于 2013-01-03T04:22:44.210 に答える
-2

ああ。問題があります。

あなたの関数は、if($title) と言います。$title は関数の必須パラメーターとして入ってくるので、PHP はそれを、はい、設定された変数として登録していると思います。したがって、基本的に何が起こるかというと、mysql_fetch_array の結果が返され、それを再度 mysql_fetch_array を実行するということです。

試す:

//in your function getNews()
if($title){
   $q=$this->query("SELECT * FROM ".TBL_NEWS." WHERE ftitle = '$title'" );
   return $q;
}
//rest of function down here

それはうまくいくかもしれません。私が見る問題は、それを行うと、関数が呼び出された他の場所で問題が発生することです。ので注意してください!上記の修正は、コードをより良い状態にするための修正です。ハックが必要な場合は、これを試してください:

<? $innernews=$session->getNews("",$month,$year);?>
<? foreach($innernews as $innerarticle) {?>
<a href="/news/<?=$innerarticle['ftitle']?>" <? if($title==$innerarticle['ftitle']){?> class="active"<? }?>><?=$innerarticle['title']?></a>
<? }?>

foreach ループは、あなたが望むものを与えるはずです!

于 2013-01-03T03:44:42.743 に答える