+ PHP: Zitat des Tages
Mirja
- datenbank
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
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
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
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
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
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
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