ilch Forum » Allgemein » HTML, PHP, SQL,... » News gruppiert nach Datum

Geschlossen
  1. #1
    User Pic
    sladee Mitglied
    Registriert seit
    19.01.2010
    Beiträge
    55
    Beitragswertungen
    1 Beitragspunkte
    Hallo Leute

    Als php und sql "Neuling" quäle ich mich jetzt schon einige Stunden mit dem versuch rum, eine Last News Ausgabe hin zu bekommen, welche die News Gruppiert nach datum ausgeben soll.

    Soweit bin ich mal ohne grössere Probleme gekommen und kann das ganze sauber via {lastnews} platzieren:

    $lastnews_query = "SELECT news_id,news_title,DATE_FORMAT(news_time,'%d.%m.%Y') as datum,DATE_FORMAT(news_time,'%W') as dayofweek,DATE_FORMAT(news_time,'%H:%i') as zeit FROM prefix_news WHERE (((" . pow(2, abs($_SESSION['authright'])) . " | news_recht) = news_recht) OR
             (news_groups != 0 AND ((news_groups ^ $groups) != (news_groups | $groups)))) AND $news_kat
           `show` > 0 AND `show` <= UNIX_TIMESTAMP() AND news_id != $tn_id AND `archiv` != 1 AND
           (endtime IS NULL OR endtime > UNIX_TIMESTAMP()) ORDER BY news_time DESC LIMIT ".$xlastnews;
    $newsres = @db_query($lastnews_query);
    while ($newsrow = db_fetch_assoc($newsres)) {
    	$lastnews .= '<div>'.$lang[$newsrow['dayofweek']] . ', '.$newsrow['datum'].'</div>&raquo; <a href="index.php?news-'.$newsrow['news_id'].'">'.$newsrow['news_title'].'</a><br>'.$newsrow['zeit'].' Uhr<br><br>';
    }


    Nun ist es aber mein Ziel, die Ausgabe folglich zu erhalten:

    Sonntag, 11.08.2013
    20:44 Uhr - Titel...
    20:08 Uhr - Titel...
    ...

    Samstag, 10.08.2013
    20:44 Uhr - Titel...
    20:08 Uhr - Titel...
    ...
    usw.

    Nach einiger google recherche bin ich auf folgenden Ansatz gestossen:

    // Select-Statement zum Auslesen der Daten
      // Im Beispiel soll die Spalte kat (Kategorie) immer nur einmal erstellt werden
      
      $sql = "SELECT kat, kursid, beginn from Tabelle order by kat";
      $rs = mysql_query($sql);
      
      // Variablenstandardwert festlegen 
     $strVar = "";
      echo "<table border>";
      while($row = mysql_fetch_object($rs)) {
    
          // vergleichen des Spaltenwertes mit dem Wert der Variablen
        if ($strVar == "" || $strVar != $row->kat) {
        echo "<tr><td colspan=\"3\">";
        echo $row->kat;
        echo "</td></tr>";
    
        // Variablen den Wert des Datenfeldes geben
        $strVar = $row->kat;
        }
        echo "<tr><td>".$row->kursid."</td><td>".$row->beginn."</td><td>".$row->kat."</td></tr>";
        }
        echo "</table>";


    Leider bekomme ich es doch nicht ganz hin, diese Methode funktionierend auf meinen Code anzuwenden grumml

    Jemand eine Lösung oder Hilfestellung für mich?

    Thx und Gruss

    Sladi

    betroffene Homepage: externer Link
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    Revolution Hall Of Fame
    Registriert seit
    14.08.2006
    Beiträge
    1.688
    Beitragswertungen
    109 Beitragspunkte
    Der Trick ist nun um die Ausgabe $lastnews eine if abfrage zu machen.
    Damit deine Überschrift "Sonntag, 11.08.2013" immer nur beim ersten mal gesetzt wird.

    Sprich du machst eine weitere Variable davor, z.B. $datum = $newsrow['datum']
    da anch fragst du bei der ausgabe ab, ob das Datum noch das selbe wie zuvor ist, wenn ja
    - keine Ausgabe der Datumszeile
    wenn nein
    - Ausgabe erzeugen


    oder

    du machst es über ein Array,
    hier bei wird in einem Array immer das Datum angehängt und zuvor geprüft ob es es bereits einen Eintrag gibt.

    Das ist aber das selbe wie (1) lachen nur halt mit einem Array statt einer Varaible. Kann Sinnvoll sein wenn man alle Daten später nochmal braucht

    if(!in_array($newsrow['datum'], $ch)){
    				$newsrow['datum']= '<b>'.$newsrow['datum'].'</b>';
    				array_push($ch, $newsrow['datum']);
    			}else{
    				$newsrow['datum'] = '';
    			}




    oder, zwei Datenbank Abfragen
    Einmal mir den Daten und dann zu jedem Datum die passenden News



    Es gibt noch viele Varianten zur Umsetzung lachen
    Du kannst auch mal schauen wie das in der allg.php im Adminbereich gelöst wurde, hier wird das selbe mit den Config-Überschriften gemacht.

    Ab Zeile 107 (Das ist Variante 1)
    Variablen
    $ch und $row['kat']



    Zuletzt modifiziert von Revolution am 12.08.2013 - 15:14:06
    Kreativ, modern, Conversion und Usability optimiert
    individuelles Webdesign für ein optimales Erscheinungsbild
    404studios
    1 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    sladee Mitglied
    Registriert seit
    19.01.2010
    Beiträge
    55
    Beitragswertungen
    1 Beitragspunkte
    Thx Revolution

    Yep, bin auch bei meiner Recherche auf einige Lösungsvarianten gestossen, nur hab ich keine sauber zum laufen gebracht ^^

    Werde mich mal nochmals ne Weile daran versuchen, ansonsten melde ich mich gerne nochmals hier zwinker
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Revolution Hall Of Fame
    Registriert seit
    14.08.2006
    Beiträge
    1.688
    Beitragswertungen
    109 Beitragspunkte
    Wie gesagt das Beispiel ist in der allg.php
    dort wird in Zeile 107-109 per IF Abgefragt ob die aktuelle Kat != der in $ch ist.

    Das kopierst du einfach, statt kat dann bitte datum
    In die Schleife kommt deine Überschrift ausgabe.

    Nach der Schleife die Einträge der news

    und am ende
    $ch = $newsrow['datum']

    um im CH wieder das Datum im ch zu haben lachen fertig


    $lastnews_query = "SELECT news_id,news_title,DATE_FORMAT(news_time,'%d.%m.%Y') as datum,DATE_FORMAT(news_time,'%W') as dayofweek,DATE_FORMAT(news_time,'%H:%i') as zeit FROM prefix_news WHERE (((" . pow(2, abs($_SESSION['authright'])) . " | news_recht) = news_recht) OR
             (news_groups != 0 AND ((news_groups ^ $groups) != (news_groups | $groups)))) AND $news_kat
           `show` > 0 AND `show` <= UNIX_TIMESTAMP() AND news_id != $tn_id AND `archiv` != 1 AND
           (endtime IS NULL OR endtime > UNIX_TIMESTAMP()) ORDER BY news_time DESC LIMIT ".$xlastnews;
    $newsres = @db_query($lastnews_query);
    
    while ($newsrow = db_fetch_assoc($newsres)) {
    	
    	 if ( $ch != $newsrow['datum'] ) {
    		 $lastnews .=  '<div>'.$lang[$newsrow['dayofweek']] . ', '.$newsrow['datum'].'</div>&raquo;';
    		}
    		
        $lastnews .= ' <a href="index.php?news-'.$newsrow['news_id'].'">'.$newsrow['news_title'].'</a><br>'.$newsrow['zeit'].' Uhr<br><br>';
    	$ch = $newsrow['datum'];
    	
    	
    	
    }

    nicht getestet lachen

    Zuletzt modifiziert von Revolution am 12.08.2013 - 15:36:45
    Kreativ, modern, Conversion und Usability optimiert
    individuelles Webdesign für ein optimales Erscheinungsbild
    404studios
    1 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    sladee Mitglied
    Registriert seit
    19.01.2010
    Beiträge
    55
    Beitragswertungen
    1 Beitragspunkte
    Vielen vielen Dank!!!

    War schon wieder fast am durchstarten - es funktioniert ^^

    noch eine kleine Zusatzfrage, wenn wir schon dabei sind - wenn ich jetzt zB. die ersten fünf News davon ein wenig anders darstellen wollte, könnte man dies im gleichen "Lauf" bewerkstelligen?


    Zuletzt modifiziert von sladee am 12.08.2013 - 16:10:40
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    Revolution Hall Of Fame
    Registriert seit
    14.08.2006
    Beiträge
    1.688
    Beitragswertungen
    109 Beitragspunkte
    na klar,

    mach einfach vor der DB Ausgabe eine Zählvariable
    z.b $counter = 0;

    dann Fragst du in der DB Abfrage
    IF $counter <= 5

    dann deine anpassung dafür, gg. dann noch den else zweig für die anderen

    und dann nachd er Schleife $counter++;


    Zuletzt modifiziert von Revolution am 12.08.2013 - 16:16:26
    Kreativ, modern, Conversion und Usability optimiert
    individuelles Webdesign für ein optimales Erscheinungsbild
    404studios
    1 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    sladee Mitglied
    Registriert seit
    19.01.2010
    Beiträge
    55
    Beitragswertungen
    1 Beitragspunkte
    Perfekt hab's hinbekommen lachen

    Aus reiner neugier aber doch noch ne Frage, irgendwie od. wo ist jetzt ein Logikfehler oder so drin. Um das erste "Ausgabe-Template" auf die ersten fünf News Beiträge angewendet zu haben, musste ich jetzt die Zählabfrage auf "if $counter <= 4" setzen. - Muss ich das verstehen, oder hab ich was falsch gesetzt? ^^

    $lastnews_query = "SELECT news_id,news_title,DATE_FORMAT(news_time,'%d.%m.%Y') as datum,DATE_FORMAT(news_time,'%W') as dayofweek,DATE_FORMAT(news_time,'%H:%i') as zeit FROM prefix_news WHERE (((" . pow(2, abs($_SESSION['authright'])) . " | news_recht) = news_recht) OR
             (news_groups != 0 AND ((news_groups ^ $groups) != (news_groups | $groups)))) AND $news_kat
           `show` > 0 AND `show` <= UNIX_TIMESTAMP() AND news_id != $tn_id AND `archiv` != 1 AND
           (endtime IS NULL OR endtime > UNIX_TIMESTAMP()) ORDER BY news_time DESC LIMIT ".$xlastnews;
    $newsres = @db_query($lastnews_query);
    $counter = 0;
    while ($newsrow = db_fetch_assoc($newsres)) {
     if ( $ch != $newsrow['datum'] ) {
    		  $lastnews .= '<div class="Cdark"><b>'.$lang[$newsrow['dayofweek']] . ', '.$newsrow['datum'].'</b><hr></div>';
    		}
    if ($counter <= 4){
    	$lastnews .= '<div>'.$newsrow['zeit'].' Uhr | <a href="index.php?news-'.$newsrow['news_id'].'">'.$newsrow['news_title'].'</a><br><br></div>';
    }else{
    	$lastnews .= '<div>'.$newsrow['zeit'].' Uhr - <a href="index.php?news-'.$newsrow['news_id'].'">'.$newsrow['news_title'].'</a><br><br></div>';
    }
     $counter++;
     $ch = $newsrow['datum'];
    }
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Revolution Hall Of Fame
    Registriert seit
    14.08.2006
    Beiträge
    1.688
    Beitragswertungen
    109 Beitragspunkte
    Das ist völlig klar, war mein fehler.
    Erklärung
    Beim ersten durchlauf ist der $counter = 0;

    NewsNummer | Counter
    1 | 0
    2 | 1
    3 | 2
    4 | 3
    5 | 4
    6 | 5

    Damit der Counter und die Newsnummer gleich sind, müsstest du den counter mit = 1 starten und nicht mit = 0,
    Kreativ, modern, Conversion und Usability optimiert
    individuelles Webdesign für ein optimales Erscheinungsbild
    404studios
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    sladee Mitglied
    Registriert seit
    19.01.2010
    Beiträge
    55
    Beitragswertungen
    1 Beitragspunkte
    achso - kay, hätte ich ja auch selbst drauf kommen können zwinker

    nochmals besten Dank für die super Hilfe!!!
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten