Gedankenkonflikt zwischen UPDATE und INSERT bei einer MYSQL-DB
Phil
- datenbank
Tachen.
Folgendes Problem.
Die User haben bei mir ein Profil.
Die Datenbank ist z.B. so aufgebaut.
Tabelle User:
id , name
0 - peter
Tabelle Info:
id, info
0 - Herkunft
1 - Religion
Tabelle user_info
userid, infoid, inhalt
0 - 0 - Deutschland
So.
Ich möchte den Usern aber selbst überlassen, was sie angeben wollen und was nicht.
Das heißt aber folgendes:
Entweder ich löse es so das sie beim updaten Ihres Profils überprüft wird, ist folgende Information für den User schon vorhanden? Falls ja - update und falls nein, insert, falls ja aber der neue Wert ist leer - delete. Was also zwei Queries vorraussetzt.
Oder ich mache es so das bei der Registrierung - alle Felder angelegt werden, für jede Information und diese solange leer bleiben, bis der User sie updatet.
Wie würdet ihr das lösen?
Gruß,
Phil
Hallo
Ich möchte den Usern aber selbst überlassen, was sie angeben wollen und was nicht.
Das heißt aber folgendes:
Entweder ich löse es so das sie beim updaten Ihres Profils überprüft wird, ist folgende Information für den User schon vorhanden? Falls ja - update und falls nein, insert, ...
Dafür gibt es eigentlich das INSERT-Statement INSERT ... ON DUPLICATE KEY UPDATE. Eine auf UNIQUE gesetzte Spalte wird als Vergleich herangezogen, existiert der dazugehörige Wert des Statements in der Tabelle, wird die betreffende Zeile aktualisiert (UPDATE), sonst wird eine neue Zeile eingefügt. In deinem Beispiel müsste das die userid in Kombination mit der infoid in der Tabelle iser_info sein (UNIQUE über beide! Spalten).
Wird ein Wert gelöscht, würde ich ihn einfach als Leerstring speichern. Damit bleibt zwar die Zeile (nur noch mit userid und infoid) in der DB, aber du kommst regelmäßig mit einem Query aus, da es immer nur INSERT ... ON DUPLICATE KEY UPDATE gibt. Die könnte man mit einem Extra-Statement mit einer gewissen Regelmäßigkeit entsorgen (z.B. als Admin händisch angefordert oder mit Cronjob).
Oder ich mache es so das bei der Registrierung - alle Felder angelegt werden, für jede Information und diese solange leer bleiben, bis der User sie updatet.
Das wäre die andere Möglichkeit, aber gesetzt den Fall, dass nur wenige deiner User nur wenige Infos raus rücken, hast du jede Menge halbleerer Zeilen in der DB.
Tschö, Auge
echo $begrüßung;
userid, infoid, inhalt
0 - 0 - Deutschland
Entweder ich löse es so das sie beim updaten Ihres Profils überprüft wird, ist folgende Information für den User schon vorhanden? Falls ja - update und falls nein, insert, falls ja aber der neue Wert ist leer - delete. Was also zwei Queries vorraussetzt.
Leg einen Unique Key über userid und infoid (einen über beide Felder, nicht zwei einzelne) und verwende dann
INSERT ... ON DUPLICATE KEY UPDATE ...
echo "$verabschiedung $name";
DEDLFIX - Du bist mein Gott.
Getreu dem Motto - tue jeden Tag eine gute Tat - hättest du wahrscheinlich schon vornem Jahr im Himmel nen Platz buchen können.
Vielen Dank auch an Auge, ihr hattet ja gleichzeitig die selbe Idee, Dedlfix bekommt nur die Huldigung weil er mich jedesmal mit so einer Wucht von Know-How platt macht. Zu jedem Problem ne Lösung...
Gruß
Phil
Eine Frage hätte ich noch.
Kann man das ON DUPLICATE KEY auch irgendwie verneinen?
Also NUR WENN NICHT SCHON VORHANDEN - tue dies...
Hi,
Kann man das ON DUPLICATE KEY auch irgendwie verneinen?
Also NUR WENN NICHT SCHON VORHANDEN - tue dies...
Das ganze ist doch bereits eine WENN-DANN-SONST-Geschichte - wozu willst du das "umdrehen"? Du musst schon genauer beschreiben, was du damit erreichen willst, wenn du dazu eine Antwort bekommen willst.
MfG ChrisB
Hi.
Das ganze ist doch bereits eine WENN-DANN-SONST-Geschichte - wozu willst du das "umdrehen"? Du musst schon genauer beschreiben, was du damit erreichen willst, wenn du dazu eine Antwort bekommen willst.
Ich spreche es mal:
FALLS DER USERNAME UND DIE EMAILADRESSE NOCH NICHT VORHANDN SIND, REGISTRIERE DEN NEUEN BENUTZER.
Ein Query will ich daraus machen.
Bisher schau ich nach username und email adresse und falls nicht vorhanden(PHP, falls kein Ergebnis), dann neuer query, INSERT.
Gruß,
Phil
Hello,
Ich spreche es mal:
FALLS DER USERNAME UND DIE EMAILADRESSE NOCH NICHT VORHANDN SIND, REGISTRIERE DEN NEUEN BENUTZER.
Ein Query will ich daraus machen.
Bisher schau ich nach username und email adresse und falls nicht vorhanden(PHP, falls kein Ergebnis), dann neuer query, INSERT.
Du solltest es anders machen:
Unique Contraint auf username und eventuell auch unique constraint auf eMail
Und dann den neuen User einfach einfügen.
Hinterher den SQL-Status abfragen ob es, oder warum es nicht geklappt hat.
Anderenfalls baust Du Dir ein TOCTOU-Problem:
http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Unique Contraint auf username und eventuell auch unique constraint auf eMail
Und dann den neuen User einfach einfügen.
Hinterher den SQL-Status abfragen ob es, oder warum es nicht geklappt hat.
Wahh mehr Erklärung bitte!
Gruß,
Phil
Hallo
Ich spreche es mal:
FALLS DER USERNAME UND DIE EMAILADRESSE NOCH NICHT VORHANDN SIND, REGISTRIERE DEN NEUEN BENUTZER.
Ein Query will ich daraus machen.
Und wie das geht, haben dedlfix und ich dir explizit geschrieben und in der Anleitung verlinkt. Was verstehst du daran nicht?
Tschö, Auge
Und wie das geht, haben dedlfix und ich dir explizit geschrieben und in der Anleitung verlinkt. Was verstehst du daran nicht?
Ich möchte nicht updaten. Ich möchte wenn der Datensatz vorhanden ist, nichts tun ausser false zurückgeben und wenn er nicht vorhanden ist, eintragen.
echo $begrüßung;
Ich möchte nicht updaten. Ich möchte wenn der Datensatz vorhanden ist, nichts tun ausser false zurückgeben und wenn er nicht vorhanden ist, eintragen.
Dann mach das schon Gesagte, lass aber das ON DUPLICATE KEY UPDATE weg (also Unique-Index und einfach drauf los einfügen). Es gibt dann bei schon vorhandenem Datensatz einen Unique-Constraint-Fehler, auf den du testen musst. Alle anderen Fehler sind wirkliche Fehler, nur eben der eine nicht. Wenn der Datensatz nicht vorhanden ist, findet ein normaler Insert-Vorgang statt.
echo "$verabschiedung $name";
Hallo
»» Und wie das geht, haben dedlfix und ich dir explizit geschrieben und in der Anleitung verlinkt. Was verstehst du daran nicht?
Ich möchte nicht updaten.
Nicht? Im Ausgangsposting schriebst du noch:
"Falls ja - update", ne.
Ich möchte wenn der Datensatz vorhanden ist, nichts tun ausser false zurückgeben und wenn er nicht vorhanden ist, eintragen.
Dann lass bloß niemanden auf die Idee kommen, etwas an den Daten seines Profils zu ändern.
Tschö, Auge
Richtig und nachdem meine Frage diesbezüglich beantwortet wurde, habe ich hier eine neue Frage die aber dazu passte gestellt.