SQL Fehler im 'ON DUPLICATE' Befehl (MySQL) finden

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.503
PHP:
$now = time();
	$query = "INSERT INTO logged_in (userID, time) VALUES (?, ?) ON DUPLICATE KEY UPDATE time=?";
	$stmt = $mysqli->prepare($query);
	$stmt->bind_param("iii", $_SESSION['userID'], $now, $now);
	$stmt->execute();
	$stmt->close();

Es geht darum, dass in der Tabelle ein Eintrag für einen user angelegt wird, der sich zum ersten Mal einloggt, sollte er sich ein weiteres mal einloggen, wird jedoch nur die Zeit erneueret.

Leider wird jedes Mal die userID auf den aktuellen Nutzer erneuert und es gibt immer nur einen Eintrag. Der ON DUPLICATE Fall trifft also immer zu.

'userID' ist PRIMARY KEY

Was mache ich falsch?
 
Was macht bind_param?

edit: Vergiss es, mit der PDO verwechselt.
 
Kenne zwar die Lösung nicht aber warum machst Du nicht einfach ein neues Feld in der User Tabelle z.B. "logged_in" und aktualisiert dann mit Where Filter auf die userID?
 
Laut Doku für MySQL:
Wenn Sie ON DUPLICATE KEY UPDATE angeben und ein Datensatz eingefügt wird, der einen doppelten Wert in einem eindeutigen Index oder einem Primärschlüssel erzeugen würde, dann wird für den alten Datensatz UPDATE ausgeführt.

Du müsstest also einen Index auf time setzen wobei ich dieses vorgehen nicht gut finde. Wie Lawnmower geschrieben hat eine neue Spalte mit logged_in oder sowas in der Richtung ist wesentlich sinnvoller...
 
Ich glaube, der Update-teil muss nur noch um eine Where-Klausel vervollständigt werden.
 
Mal ne ganz dumme Frage? Was erwartest du denn?
userId ist PRIMARY und damit UNIQUE, klar hast du daher pro Nutzer immer nur eine Zeit, geht ja nicht anders.

Wenn jetzt der user schon vorhanden ist, wird die Zeit aktualisiert, was genau das Verhalten zeigt, welches du versuchst zu erreichen.

Willst du pro user alle Logins erfassen, musst du den Primary-key auf mehr als nur den User legen, also bspw. auf beide Spalten. Dann brauchst du aber keine ON UPDATE sondern nur ein INSERT IGNORE.
 
Zurück
Oben