Update, wenn vorhanden, wenn nicht Insert.

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.

Ip müsste UNIQUE sein, dann geht folgendes besser: MySQL :: MySQL 5.1 Reference Manual :: 12.2.5.3 INSERT … ON DUPLICATE KEY UPDATE Syntax

Danke Euch beiden.
‚On Duplicate Key Update‘ gefällt mir da besser. =)

Frohes Neues! :slight_smile:

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‘")[/PHP]

Update soll aber so sein:
[PHP]Dateime = ‚„.date(‚Y-m-d H:i:s‘).“ \n (den Datensatz der bisher in Datetime gespeichert war)‘[/PHP]

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'");[/PHP]

Wenn jemand eine bessere Idee hat, gerne.

Es gibt doch in MySQL CONCAT:

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.

Danke sehr.
Aber doch, bin geschützt. ^^ function, etc.

$_SERVER[‚HTTP_USER_AGENT‘] ist oben nicht escaped.

In der Zeile oben nicht, aber die Variablen, die in die Datenbank gespeichert werden, gehen durch eine for-Schleife, wo sie escapet werden.

Du könntest deine Tabelle noch normalisieren, wenn du UNIQUE über IP und UserAgent legst.

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.