Bernd: News auslesen

Hallo,

eine Frage, wie müsste ich folgendes umsetzten?

Auf meiner Startseite lese ich ein paar News aus mit folgender Funktion

function news($mysqli, $filter=false) {

        $select = "SELECT n_id, n_code, n_titel, n_titel_url, n_news, n_bild, n_datum,
                          n_uhrzeit, n_status, n_von, n_bis
                   
                   FROM news WHERE n_status=1 ORDER by n_id DESC ";

        if ($filter) {
            $stmt = $mysqli->prepare($select . "LIMIT ?" );
            $stmt->bind_param("s", $filter);
        }
        else {
            $stmt = $mysqli->prepare($select);
        }

        $stmt->execute();
        $stmt->bind_result($n_id, $n_code, $n_titel, $n_titel_url, $n_news, $n_bild, 
                           $n_datum, $n_uhrzeit, $n_status, $n_von, $n_bis);
        $stmt->store_result();
        
        if($stmt->num_rows() >  0) {     
            
            while ($stmt->fetch()){
            
                $news[] = array( 
                    'n_id'          => $n_id,
                    'n_code'        => $n_code,
                    'n_titel'       => $n_titel,
                    'n_titel_url'   => $n_titel_url,
                    'n_news'        => $n_news,
                    'n_bild'        => $n_bild,
                    'n_datum'       => $n_datum,
                    'n_uhrzeit'     => $n_uhrzeit,
                    'n_status'      => $n_status,
                    'n_von'         => $n_von,
                    'n_bis'         => $n_bis               
                );
            }
            return $news;
            }
    }

Jetzt möchte ich News nur eine bestimmte Zeit anzeigen lassen, dazu nutze ich die Felder n_von und n_bis. Im SELECT müsste ich dazu doch BETWEEN nutzen oder? Ich möchte aber auch alle News angezeigt bekommen die kein von bis haben, in der Datenbank werden die mit 0000-00-00 gelistet, ich habe dazu Date genutzt, warum er da so ein komisches Datum nimmt keine Ahnung.

Wie müsste ich dazu meine Funktion erweitern?

  1. SELECT
        n_id, n_code, n_titel, n_titel_url, n_news, n_bild, datum,
        n_uhrzeit, n_status, n_von, n_bis                    
    FROM
        news
    WHERE
        n_status=1
        AND (
              n_von BETWEEN "2018-01-01" AND "2018-12-31"
           OR n_bis BETWEEN "2018-01-01" AND "2018-12-31"
           OR n_bis="0000-00-00"
        ) 
    ORDER by n_id DESC;
    

    Zeigt alle Datensätze bei denen n_von oder n_bis in diesem Jahr liegt oder das Enddatum NULL (0000-00-00) ist. Du hast Die Aufgabe an der Stelle nicht exakt spezifiert, insbesondere nicht definiert was "nutze ich die Felder n_von und n_bis" bedeuten und wie die Eingrenzung stattfinden soll.

    Der Trick besteht also darin, die logischen Verknüpfungen in der WHERE-Klausel zu klammern.

    Jetzt möchte ich News nur eine bestimmte Zeit anzeigen lassen, dazu nutze ich die Felder n_von und n_bis. Im SELECT müsste ich dazu doch BETWEEN nutzen oder? Ich möchte aber auch alle News angezeigt bekommen die kein von bis haben, in der Datenbank werden die mit 0000-00-00 gelistet, ich habe dazu Date genutzt, warum er da so ein komisches Datum nimmt keine Ahnung.

    Das ist kein komisches, sondern das logische und genormte ISO-Datumsformat. Komisch wäre für deutsche das französische oder für Franzmänner das teutokrautische. "0000-00-00" als Flag für ein nicht erfasstes Datum (NULL) zu nutzen ist wohl eine gute Idee. Denn es ist, als Datum, ungültig.

    1. Hallo,

      danke für dein Beispiel.

      Zeigt alle Datensätze bei denen n_von oder n_bis in diesem Jahr liegt oder das Enddatum NULL (0000-00-00) ist. Du hast Die Aufgabe an der Stelle nicht exakt spezifiert, insbesondere nicht definiert was "nutze ich die Felder n_von und n_bis" bedeuten und wie die Eingrenzung stattfinden soll.

      wenn im Feld n_von der 29.12.2018 bzw. 2018-12-29 steht, dann soll die News erst ab diesem Datum online erscheinen. Wenn im Feld n_bis der 31.01.2018 bzw. 2018-31-01 steht, soll die News am 01.01.2019 nicht mehr online erscheinen.

      Eine News hat also das Datum 29.12.2018 - 31.1.2018 (n_von / n_bis) soll die News nur in diesem Zeit auch online zu sehen sein.

      Das ist kein komisches, sondern das logische und genormte ISO-Datumsformat. Komisch wäre für deutsche das französische oder für Franzmänner das teutokrautische. "0000-00-00" als Flag für ein nicht erfasstes Datum (NULL) zu nutzen ist wohl eine gute Idee. Denn es ist, als Datum, ungültig.

      Wäre nicht besser, wenn die Felder leer wären wenn nicht eingetragen ist?

      1. Hallo Bernd,

        das aktuelle Datum bekommst du mit CURDATE().

        Du willst News deren Gültigkeit das aktuelle Datum einschließt.

        CURDATE() BETWEEN von AND bis geht meines Wissens nicht. Probieren kannst Du es ja mal...

        Aber (von <= aktuell UND aktuell <= bis) ODER von='0000-00-00' sollte akzeptiert werden.

        Rolf

        --
        sumpsi - posui - clusi
      2. wenn im Feld n_von der 29.12.2018 bzw. 2018-12-29 steht, dann soll die News erst ab diesem Datum online erscheinen. Wenn im Feld n_bis der 31.01.2018 bzw. 2018-31-01 steht, soll die News am 01.01.2019 nicht mehr online erscheinen.

        Eine News hat also das Datum 29.12.2018 - 31.1.2018 (n_von / n_bis) soll die News nur in diesem Zeit auch online zu sehen sein.

        Wenn es um ein Datum(hier das aktuelle, DATE(NOW())), geht, dann brauchen wir das BETEWEEN nicht:

        SELECT
            n_id, n_code, n_titel, n_titel_url, n_news, n_bild, datum,
            n_uhrzeit, n_status, n_von, n_bis                    
        FROM
            news
        WHERE
            n_status = 1
            AND (
                   (
                      n_von <= DATE( NOW() )
                      AND n_bis >= DATE( NOW() )
                   )
                   OR n_bis =  DATE( 0 )
            )
        ORDER by n_id DESC;
        

        Beachte bitte, dass die Zeitangaben zonenabhängig sind. Probiere:

        SET time_zone = "+00:00";
        SELECT NOW();
        SET time_zone = "+01:00";
        SELECT NOW();
        

        Das ist natürlich im ostpazifischen Raum interessanter als hier.

        Wäre nicht besser, wenn die Felder leer wären wenn nicht eingetragen ist?

        Wie ist denn Deine Tabelle angelegt?