MySQL Eintrag vorhanden, neuen wählen und nochmal prüfen

Boostergermany

Erfahrenes Mitglied
Hey liebe Tutorianer, ich hab eine Frage bezüglich PHP und MySQL:

Nämlich würde ich gerne meinen Usern einen Text anzeigen, nachdem sie ihn gesehen haben bzw. nach abschluss der aufgabe wird in einer anderen Tablle abgespeichert dass User X Text X um X Uhr gesehen hat, nun will ich dass der User diesen Text nichtmehr zu gesicht bekommt bis 24 Stunden rum sind...meine eigentliche Frage bei dem ganzen ist jetzt, wie kann ich es mit PHP lösen, dass wenn in der Tabelle wo die daten zum gelesen gespeichert werden bereits ein eintrag ist der nicht älter als 24 stunden ist, er einen anderen Text erhält ohne dass er die Seite neu laden muss...?

Ich hol mir die Texte per zufall aus der DB:
PHP:
$zufall = @mysql_fetch_array(mysql_query("SELECT * FROM code_wort WHERE typ = 1 ORDER BY RAND() limit 1"));

Und hier wird habe ich eine Reloadsperre die überprüft ob der Text bereits gelesen wurde, was allerdings erst nach beendigung der dazugehörigen Aufgabe geprüft werden kann:
PHP:
$reload = @mysql_fetch_array(mysql_query("SELECT * FROM code_gelöst WHERE code = '".$_GET["id"]."' and user = '".$_SESSION["user"]."'"));
				if($reload["time"]>=time()-3600*24) {...


Ich habe mir gedacht dass evtl per While abfrage zu machen, hab aber kein klares Bild davon, wie ich das lösen kann...könnt Ihr mir helfen?
 
Hi

wenn ich Dein Problem richtig verstanden habe, sollte das so funktionieren:
1. Du holst dir alle IDs die er in den letzten 24h stunden gelesen hat und schreibst sie in ein array.
2. Du erstellst eine Dynamische AND abfrage (nach der 1. Where bedingung) die überprüft, ob die ID ungleich einer gelesenen id ist
3. Zufälligen Text ausgeben.
 
naja wenn eintrag vorhanden dann Zeige Text nicht.
Sprich nach lösen der Aufgabe setzt du einen Eintrag in der DB und ist der vorhanden wird der Text nicht angezeigt.

EDIT: mh vielleicht hab ichs auch nicht verstanden was gemeint war?
 
Hallo,

speicherst du die Lesezeiten in MySQL? Wenn ja kannst du das direkt in das Query schreiben:
 
Hi

das war jetzt vielleicht missverständlich ausgedrückt:
PHP:
$read = array(1,4,214);
$and = "";
foreach($read as $r){
  $and .= " AND id != ".$r;
}
mysql_query("SELECT * FROM table WHERE typ = 1".$and." ORDER BY RAND() LIMIT 0,1");
 
Hi

das war jetzt vielleicht missverständlich ausgedrückt:
PHP:
$read = array(1,4,214);
$and = "";
foreach($read as $r){
  $and .= " AND id != ".$r;
}
mysql_query("SELECT * FROM table WHERE typ = 1".$and." ORDER BY RAND() LIMIT 0,1");

jetz weiß ich wies aussehen soll, aber so richtig klar komm ich damit nicht, daher ein paar fragen:

was macht foreach und ...ich weiß das klingt doof, wie fülle ich den array, bzw. mit was ?


zu der andren lösungsmethode...da blick ich genauso wenig durch...ich bin n kleines licht was php und mysql angeht, ich kenn mich zwar so n bisschen aus kann auch schon standardsachen coden, aber bei sowas hörts dann auf...und ja ich speicher in mysql den timestamp -> time()
 
Foreach wäre gleich bedeutend mit
PHP:
for( $i = 0; $i < count($array); $i++ )
  $temp = $array[$i];

bei foreach($read as $r) ist $read = $array und $r = $temp.
Das array befüllst du mit den IDs, die der User schon gelesen hat.
 
...und ja ich speicher in mysql den timestamp -> time()

Du müsstest nur prüfen, ob diese Zeit kleiner als die jetzige Zeit - 24 Stunden ist.
Da time() mit Sekunden rechnet, musst du alles in Sekunden rechnen ==>Ein Tag (24 Stunden) hat 86400 Sekunden
PHP:
$sql = "... WHERE zeit_gelesen<(UNIX_TIMESTAMP(now())-86400)
 
Zurück