Counter mit ON DUPLICATE KEY UPDATE

Parantatatam

mag Cookies & Kekse
Hallo,

ich habe gerade einen kleinen Denkfehler und verstehe deshalb nicht, warum meine MySQL-Abfrage nicht so läuft wie ich es gerne hätte:
Code:
INSERT INTO `ips` (`ip`) VALUES ('11.111.111.11') ON DUPLICATE KEY UPDATE `counter` = `counter` + 1

Ich bastle gerade an einem Counter (mit PHP) der IP-Adressen in eine Datenbank lädt. Dabei gibt es folgende Spalten: id, ip, timestamp, counter - aber das ist eigentlich unwichtig. Problem ist nur, dass er bei mir jedes mal einen neuen Datensatz anlegt, wenn die Anfrage oben ausgeführt wird. Dabei sollte es doch eigentlich im Falle, dass schon ein Datensatz zu der IP existiert nur die Spalte "counter" um eins erhöhen. Wo liegt mein Denkfehler?

// EDIT: Die Spalte "id" ist natürlich auto_increment und UNSIGNED ZEROFILL, die Spalte "counter" ist standardmäßig als 1 festgelegt und die Spalte "timestamp" hat als Standardwert den CURRENT_TIMESTAMP.
 
Zuletzt bearbeitet:
Ich habe mir jetzt eine neue Tabelle angelegt und tatsächlich: dort wo auch Primärschlüssel auszuwählen ist, da gibt es auch UNIQUE. Danke!
 
Ich habe jetzt noch eine Frage: wenn ich jetzt z.B. eine Zeitsperre einrichten will, dass z.B. nur aller fünf Minuten ein Klick als Klick gezählt wird, wo müsste ich den dann die WHERE Anweisung anfügen? An das Ende des INSERT's ist es nicht sinnvoll und am Ende der UPDATE Anweisung wird mir immer ein Fehler ausgegeben. Müsste man das dann mit einer IF Anweisung in MySQL lösen oder geht das noch anders? Ich habe nämlich mit dem IF Anweisungen in MySQL so meine Verständnisprobleme.
 
Hi,

ja, das geht mit IF:

SQL:
insert ...
   on DUPLICATE key update spalte = if(<bedingung>, wert_true, wert_false)

Schau mal in die User Comments, da gibt's Beispiele.

LG
 
Ich habe jetzt mal das probiert:
SQL:
INSERT INTO `dat_counter_website` (`ip_address`) VALUES ('XX.XX.XX.XX')
ON DUPLICATE KEY UPDATE
`counter` = IF(TIME_TO_SEC(TIMEDIFF(NOW(), `timestamp`)) >= 300, `counter` + 1, `counter`) AND
`timestamp` = IF(TIME_TO_SEC(TIMEDIFF(NOW(), `timestamp`)) >= 300, NOW(), `timestamp`)

Das Kuriose daran: wenn die Bedingung wahr ist, dann wird der Counter auf 0 gesetzt und der Zeitstempel verändert sich nicht. Wo bitte ist der Fehler? Ich finde das gerade unlogisch.
 
Hi,

dann überlege Dir mal, wie man in der Regel Zuweisungen auflistet und was AND in MySQL für eine Bedeutung hat.

SQL:
INSERT ...
   ON DUPLICATE KEY UPDATE 
      spalte1 = wert1,
      spalte2 = wert2,
      ...

LG
 
Zurück