• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Update, wenn vorhanden, wenn nicht Insert.

aJunkie

Mitglied
Halli Hallo,

Wie ich das locker in zwei Querys bekomme, weiß ich.
Ich wollte es aber elegant in einem Query lösen.

Ich möchte zuerst ein Datensatz in die Datenbank schreiben.

Beim zweiten Aufruf der Seite ist dieser Datensatz ja schon vorhanden. Deshalb soll dieser geupdatet werden. Die alten Daten werden aber mit(!) übernommen.

Beispiel:
Das erste Mal:
"IP Adresse: 127.0.0.1"
"String: irgendein Text"
gespeichert.

Das zweite Mal:
IP Adresse schon vorhanden,
also UPDATE: IP bleibt ja gleich, aber String dann so:
INSERT INTO bla bla (String) VALUES ("Neuer Text \n (SELECT string [alter text])")

Sodass also, wenn die IP Adresse schon vorhanden ist, der neue String ganz oben gespeichert wird und der alte Datensatz per Umbruch darunter. Scheinen 2-3 Befehle auf einmal zu sein.
Insert, Update, if exists, if not exists, etc.

Mag mir jemand helfen?
 
REPLACE INTO wäre das was Du suchst. Mach aus der Spalte noch einen Primärschlüssel und ersetze in deinem INSERT-Statement das INSERT durch REPLACE. Siehe auch MySQL-Manual.
 
So, jetzt habe ich es so gemacht:
PHP:
            mysql_query("INSERT INTO `tabelle` (IP, UserAgent, Datetime, Eingabe) 
            VALUES('".$_SERVER['REMOTE_ADDR']."', '".$_SERVER['HTTP_USER_AGENT']."', NOW(), '$eingabe') 
            ON DUPLICATE KEY UPDATE Datetime = '".date('Y-m-d H:i:s')." \n', Eingabe = '$eingabe'")

Update soll aber so sein:
PHP:
Dateime = '".date('Y-m-d H:i:s')." \n (den Datensatz der bisher in `Datetime` gespeichert war)'

Muss ich da einfach `Datetime` oder eine Unterabfrage schreiben? Habe beides versucht, aber egal, was ich schreibe, es wird in Klartext gespeichert.
 
PHP:
                # Für 'on duplicate key update'
            $q = mysql_query("SELECT UserAgent, Datetime, Eingabe FROM `tabelle` WHERE IP = '".$_SERVER['REMOTE_ADDR']."' LIMIT 1");
            $s = mysql_fetch_array($q);
            
            $nologin_useragent = '*'.$_SERVER['HTTP_USER_AGENT']."\n".$s['UserAgent'];
            $nologin_datetime = date('Y-m-d H:i:s')."\n".$s['Datetime'];
            $nologin_eingabe = $eingabe."\n".$s['Eingabe'];
            
            
            mysql_query("INSERT INTO `tabelle` (IP, UserAgent, Datetime, Eingabe) 
            VALUES('".$_SERVER['REMOTE_ADDR']."', '*".$_SERVER['HTTP_USER_AGENT']."', NOW(), '$eingabe') 
            ON DUPLICATE KEY UPDATE UserAgent = '$nologin_useragent' ,Datetime = '$nologin_datetime', Eingabe = '$nologin_eingabe'");

Wenn jemand eine bessere Idee hat, gerne.
 
Es gibt doch in MySQL CONCAT:
Code:
UPDATE UserAgent = CONCAT(UserAgent, "\n", "Neuer User Agent")

Du bist auch nicht gegen SQL-Injections geschützt. HTTP_USER_AGENT könnte SQL-Code enthalten.
 
In der Zeile oben nicht, aber die Variablen, die in die Datenbank gespeichert werden, gehen durch eine for-Schleife, wo sie escapet werden.
 
Danke. IP ist bei mir Unique, UserAgent nicht.
Ich orientiere mich an IP und bei jedem Seitenabruf, wird der neue UserAgent (falls vorhanden), mit registriert, ohne die alte zu überschreiben.
 
Zurück
Oben