Hello,
Hi, ich überprüfe mit folgender Funktion, ob ein User schon etwas gepostet hat, und verhindere so Spamming:
public function CompareIP() {
$IP = $_SERVER['REMOTE_ADDR'];
$IP = ip2long($IP);
$Date = time();$DB_IP = mysql_query("SELECT IP,Date FROM test WHERE IP = '$IP'");
if(mysql_affected_rows() == 1) {
while($Row = mysql_fetch_assoc($DB_IP)) {
$CompareDate = $Row['Date'] + 300; // 5min
}
if($Date >= $CompareDate) {
return TRUE;
}
else {
return FALSE;
}
}
else {
// NOCH NICHT ENDGÜLTIG
return TRUE;
}
}
Unabhängig von dem, was Vinzenz & Co. Dir schon geschrieben haben, ist das ja wohl nicht der vollständige Code?
Ich sehe hier nur ein Select-Statement. Wie kommen denn die Daten in die DB?
Du schreibst selber "... wenn Fehler auftreten ...". Ich bin der Meinung, den Fehler machst Du.
Eine Überprüfung per Select ist nicht möglich, wenn man die Tabelle nicht für das Select und das anschließende vermutlich notwendige Update/Insert (Replace) sperren will, sodass die beiden Operationen atomar gebunden werden.
Siehe: http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Ohne Locks musst du also mit einem updatenden Statement mit geeigneter Where-Klausel abfragen, ob schon ein Eintrag vorhanden ist.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg