Mirja: + PHP: Zitat des Tages

Hallo,

habe eine MySQL-Datenbank im Format

id|zitat|autor

Zufällig ausgeben mache ich mit SELECT * from wn_zitate ORDER BY RAND() LIMIT 0,1. Allerdings wird dann jedes Mal beim Aufrufen ein anderes Zitat angezeit. Ich möchte aber, dass die Anzeige nur täglich wechslet.

Kann mir jemand helfen von Euch?

LG Mirja

  1. Hallo!

    Du kannst ja die Zufallszahl aus dem Datum erechnen. Das ist dann zwar keine Zufallszahl mehr, aber es würde gehen. Oder du lässt den, der zuerst auf die Seite kommt eine Zufallszahl generieren und die in die DB schreiben. Und dann überprüfst du immer, ob schon ein Eintrag im entsprechendem Feld ist.

    Nico

    1. Hi,

      Du kannst ja die Zufallszahl aus dem Datum erechnen. Das ist dann zwar keine Zufallszahl mehr, aber es würde gehen.

      könntest Du mir sagen wue das aussehen würde?

      Oder du lässt den, der zuerst auf die Seite kommt eine Zufallszahl generieren und die in die DB schreiben. Und dann überprüfst du immer, ob schon ein Eintrag im entsprechendem Feld ist.

      Das möchte ich nicht - sonst brauche ich wieder eine DB.

      DAAAAANKE!

      Mirja

      1. Hallo!

        Aber wir sind doch hier im Bereich DB, oder. Du bräuchtst also nur ne Spalte. Aber mit PHP sähe das ungefähr so aus:

        $datum=getdate();
        $datum=$datum[mday];

        Das $datum könntest du dann schon verwenden. Du könntest aber auch noch verschiedene Rechenoperationen ausführen (*10+5-9%3...).

        Nico

  2. hi,

    Zufällig ausgeben mache ich mit SELECT * from wn_zitate ORDER BY RAND() LIMIT 0,1. Allerdings wird dann jedes Mal beim Aufrufen ein anderes Zitat angezeit. Ich möchte aber, dass die Anzeige nur täglich wechslet.

    da computer dumme rechenmaschinen sind, können sie keine "echten" zufallszahlen erzeugen.

    sie gehen immer von einem bestimmten startwert - man nennt den "seed" - aus, rechnen damit ein wenig rum, und präsentieren dir am ende irgendeine pseudo-zufällige zahl.
    wenn dieser startwert der gleiche ist, kommt also auch immer die gleiche "zufallszahl" heraus. um dies zu verhindern, und doch scheinbar zufällige zahlen zu haben, wird beispielsweise der stand der rechnerinternen uhr zum zeitpunkt des funktionsaufrufes der random-funktion als seed genommen - wenn man den fein genug unterteilt, beispielsweise in microsekunden, kommen da halbwegs brauchbare zufallszahlen raus.

    aber noch mal zurück zu der tatsache, dass ein gleicher seed auch immer die gleiche zufallszahl erzeugt - das kannst du dir hier zu nutze machen. auch RAND() in mysql bietet die möglichkeit, einen seed anzugeben - dieser muss lediglich ganzzahlig sein.

    was liegt also näher, als RAND() immer einen tag lang mit dem gleichen seed zu füttern, um jeden tag das gleiche ergebnis ausgewählt zu bekommen?

    wohlgemerkt, wir brauchen eine ganzzahl als seed - woher kriegen wir die?
    recht einfach zum beispiel, in dem wir das aktuelle datum - NOW() - in die anzahl tage umrechnen lassen, die seit dem jahr 0 vergangen sind - TO_DAYS().

    ein einfaches
       ORDER BY RAND(TO_DAYS(NOW())) LIMIT 1
    liefert dir also jeden tag ein neuen, zufällig ausgewählten datensatz zurück - jeweils einen tag lang den selben.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hey super,

      genau das ist es. 1000 MAL DANKE!

      Eine klein Frage noch: in der DB sind über 800 Datensätze, das Jahr hat aber nur 365 Tage - werden jetzt nur die ersten 365 Datensätze berücksichtig? Oder werden bei der Zufallsauswahl alle datensätze berücksichtigt, so dass ich z.B. am 2. Sep 2005 ein anderes Zitat habe als am 2. Sep 2006?

      Nochmals Danke,
      Mirja

      1. hi,

        Eine klein Frage noch: in der DB sind über 800 Datensätze, das Jahr hat aber nur 365 Tage - werden jetzt nur die ersten 365 Datensätze berücksichtig?

        nein, das hat damit überhaupt nichts zu tun.

        Oder werden bei der Zufallsauswahl alle datensätze berücksichtigt, so dass ich z.B. am 2. Sep 2005 ein anderes Zitat habe als am 2. Sep 2006?

        probier's aus:

        ... ORDER BY RAND(TO_DAYS('2005-09-02')) LIMIT 1

        ... ORDER BY RAND(TO_DAYS('2006-09-02')) LIMIT 1

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }