Phil: Gedankenkonflikt zwischen UPDATE und INSERT bei einer MYSQL-DB

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

  1. 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

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
    Terry Pratchett, "Wachen! Wachen!"
    Veranstaltungsdatenbank Vdb 0.3
  2. 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";

    1. 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

  3. Eine Frage hätte ich noch.

    Kann man das ON DUPLICATE KEY auch irgendwie verneinen?
    Also NUR WENN NICHT SCHON VORHANDEN - tue dies...

    1. 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

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.
      1. 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

        1. 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

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. 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

        2. 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

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
          Terry Pratchett, "Wachen! Wachen!"
          Veranstaltungsdatenbank Vdb 0.3
          1. 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.

            1. 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";

            2. 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:

              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.

              "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

              --
              Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
              Terry Pratchett, "Wachen! Wachen!"
              Veranstaltungsdatenbank Vdb 0.3
              1. Richtig und nachdem meine Frage diesbezüglich beantwortet wurde, habe ich hier eine neue Frage die aber dazu passte gestellt.