[PHP/MySQL] Reloadsperre?

Maddin

dev.
ID: 234104
L
24 April 2006
2.951
215
Hallo, also ich saß Gestern 3 Stunden daran und habe verschiedene Kobinationen versucht. Wenn ihr jetzt denkt: Ohh my God! Das ist ja total falsch, dann wundert euch nicht, denn ich war so verzweifelt, dass ich dann ehh nicht mehr wusste was ich mache.

Naja, also folgendes will ich erreichen:
Für jeden User der einen Eintrag macht soll ein eigener Eintrag mit seiner UID in der DB mit der Eintragungszeit + die Reloadzeit gemacht werden.
Sobald dann die aktuelle TIME größer oder gleich ist soll das Script den Eintrag des Users löschen, sodass der User wieder Vergütet wird. Das DELETE wurde so aufgebaut, dass es alle Einträge löscht, bei denen die aktuelle TIME Größer oder gleich ist.
Also: Wenn der Eintrag existiet soll der Nutzer keine lose bekommen...

Hier der Code (die IF Bedingung stimmt nicht...habe es mit einem ECHO getestet):

PHP:
db_query ("INSERT INTO ".$db_prefix."_shoutbox_reload (UID, Reload) VALUES (".$_SESSION['uid'].", ".(time()+30).")");
    
$reload_db = db_query("SELECT * FROM ".$db_prefix."_shoutbox_reload WHERE UID = ".$_SESSION['uid']." and Reload >= ".time()."");
if (!mysql_num_rows ($reload_db)) {
kontobuchung ('+', 1500, $_SESSION['uid']);
db_query ("DELETE FROM ".$db_prefix."_shoutbox_reload WHERE Reload >= ".time()."");
}

Der Codeaufruf erfolgt immer, wenn ein Submit Button geklickt wird.

Vielen Dank
 
Die Funktion mysql_num_rows() gibt doch die Anzahl der gefundenen Sätze zurück. Darf man hier so einfach mit NOT arbeiten ?

Sollte die Abfrage nicht eher
wenn ( mysql_num_rows() == 0 ) dann ( vergüten ) sonst ( nicht vergüten )
lauten ?


Und warum löscht Du die Sätze mit RELOAD >= time () ? Sind das nicht die Sätze, die noch NICHT gelöscht werden sollten ?
 
ausserdem fürchte ich, dass die Abfrage um Mitternacht unerwartete Ergebnisse liefert.
Wenn nämlich jetzt: 23:31 Uhr ist, dann ist Ende der Reloadsperre time() + 30 Minuten = 0:01 Uhr ( und damit bereits seit 23,5 Stunden vorbei ).

Oder kann time auch Tageswechsel verarbeiten ?
 
Jo, der Timestamp gibt die Anzahl der Sekunden seit 1.1.1970 zurück - wie Flaschenkind es schon sagte.

Sämtliche Angaben - wie Reloadlänge und Vergütung - werden später im Admin bestimmt. Mir ist es momentan nur Wichtig, dass es überhaupt läuft :(

Davor hatte ich mysql_fetch_assoc bzw. array verwendet, aber Gremlin hat mir vorgeschlagen es mit mysql_num_rows zu versuchen...
 
Mal ne Frage ?
Wird hier n SELECT * gemacht und dann das Ergebnis nicht mal angesehen ? 8O
 
Wird der Code immer komplett abgearbeitet ?

Das würde bedeuten
1) Der Satz wird eingefügt
2) der Satz wird sofort wieder ausgelesen -> keine Vergütung
3) Der Satz wird sofort wieder gelöscht ...
 
Hää warum?
Wenn Reload GRÖßER ist als die damalig eingetragene Zeit DANN wird gelöscht ;)

Code lesen...^^

Wenn ihr bessere Vorschläge habt - NUR ZU! Ich komme da einfach nicht weiter :(
 
einfach mal durchspielen.

Es ist jetzt 22:00 Uhr

INSERT ...( RELOAD ) VALUES ( 22:00 + 30 Minuten ) = 22:30

SELECT WHERE RELOAD > TIME ()... --> Du findest immer einen Satz, weil Du gerade davor einen eingefügt hast.

DELETE WHERE RELOAD > TIME ()
RELOAD=22:30 , TIME()=22:00 --> Bedingung erfüllt --> Satz wird gelöscht, oder nicht ?


meiner Meinung nach müsstest Du zuerst prüfen, ob ein Satz innerhalb der Reload-Sperre existiert, dann den Delete machen danach den Insert des neuen Satzes

... und, wie TheHacker schon gesagt hat, ist ein SELECT * unnötig, wenn Du nur die Anzahl wissen willst. Da genügt auch schon ein SELECT 1 FROM ...
Damit wird die Anzahl Zeichen minimiert, die das Datenbanksystem an des Programm überträgt )
 
Zuletzt bearbeitet:
So wie ich das sehe, führt euer Ablauf zu 3 DB Anfragen pro Check, wahrscheinlich also pro Seitenaufruf. Das ist für so eine kleine Aufgabe imho eine ganze Menge, da wahrscheinlich noch andere Abfragen stattfinden. Ich würde folgendes Andeneken:

1. Abfrage:
Gibt es einen Datensatz für den User in der Reloadsperre, also grob so:
SELECT 1 FROM Reload-Tabelle WHERE RELOAD > now() AND UIDfeld = UserID

2. Verzweigen
2.a Es gibt einen Datensatz => Der User erhält keinen Bonus oder was auch immer
2.b Es gibt keinen Datensatz => User erhält Bonus oder was auch immer und ein neuer Datensatz wird in der Reload-Tabelle hinzugefügt
Insert INTO Reload-Tabelle SET RELOAD = now() + 30Minutes, UIDfeld = UserID

Dies sind in der RELOADzeit nur eine DB-Abfrage ansonsten derer zwei.

Um die Reload-Tabelle aufzuräumen, würde ich ab und an also z.B. mit einer Wahrscheinlichkeit von 1% oder seltener eine Abfrage ausführen, die alle alten Datensätze löscht
DELETE FROM Reload-Tabelle WHERE now() > RELOAD

Um die Wahrscheinlichkeit hinzukriegen geht in PHP sowas:

$wahr = mtrand(1,100); //1% oder
$wahr = mtrand(1,1000); //0,1%
if($wahr == 20)
{
Aufräumabfrage
}

Das jetzt mal auf die Schnelle, ohne die ganze Sache getestet zu haben.