Benny: if Bedingung: Keine gleich ausgefüllten Felder

Hi,

folgendes Problem:

Ich habe eine Benutzereingabe mit Name, Straße, PLZ, und Ort. Straße ist optional, das habe ich wie folgt gelöst:

if (!Post::val('owner_name') || !Post::val('plz_name')  
            || !Post::val('loc_name'))  
        {  
            // Feldermeldung  
            echo('Fehler');  
            break;  
        }  
  
Post::val('street_name');  
  
....  
....
  • owner_name = Name
  • plz_name = PLZ
  • loc_name = Ort
  • street_name = Straße

Funktioniert auch soweit.

Nur möchte ich jetzt nicht, dass genau der gleiche Name mit PLZ, Ort und Straße vorkommt.

Beispiel:

Name: Hans
Straße: Musterstr. 30
PLZ: 12345
Ort: Musterhausen

Wenn alle Felder identisch ausgefüllt sind, soll ein Fehler kommen, oder wenn eben genau die Felder so in der Zusammensetzung in der Datenbank bereits vorkommen.

Hat jemand einen Ansatz für mich?

LG Benny

  1. Nur möchte ich jetzt nicht, dass genau der gleiche Name mit PLZ, Ort und Straße vorkommt.

    Beispiel:

    Name: Hans
    Straße: Musterstr. 30
    PLZ: 12345
    Ort: Musterhausen

    Wenn alle Felder identisch ausgefüllt sind, soll ein Fehler kommen,

    Hat jemand einen Ansatz für mich?

    Ja, laß es. hier werden bestimmt gleich welche aufschlagen, die Dir reale Beispiele nennen, die Du ausschließen würdest.

    oder wenn eben genau die Felder so in der Zusammensetzung in der Datenbank bereits vorkommen.

    Das geht grundsätzlich indem man das vor dem Speichern abfragt oder indem man einen Index setzt, der keine gleichen Datensätze zuläßt.

    1. Nur möchte ich jetzt nicht, dass genau der gleiche Name mit PLZ, Ort und Straße vorkommt.

      Beispiel:

      Name: Hans
      Straße: Musterstr. 30
      PLZ: 12345
      Ort: Musterhausen

      Wenn alle Felder identisch ausgefüllt sind, soll ein Fehler kommen,

      Hat jemand einen Ansatz für mich?

      Ja, laß es. hier werden bestimmt gleich welche aufschlagen, die Dir reale Beispiele nennen, die Du ausschließen würdest.

      oder wenn eben genau die Felder so in der Zusammensetzung in der Datenbank bereits vorkommen.

      Das geht grundsätzlich indem man das vor dem Speichern abfragt oder indem man einen Index setzt, der keine gleichen Datensätze zuläßt.

      Wie frage ich das denn vor dem Speichern ab?

      1. Wie frage ich das denn vor dem Speichern ab?

        Die Frage ist nicht dein Ernst oder?

        Wenn doch: wie speicherst du sie denn?

      2. Hello,

        Wie frage ich das denn vor dem Speichern ab?

        genaugenommen gar nicht, sondern es wird erst beim Speicherversuch durch die Datenbank abgefangen, damit keine Nebenläufigkeitslücke entsteht. Prüfung und Datenmanipulation/-Ergänzung müssen in einem atomistischen Prozess zusammengefasst sein. Das erledigt die Datenbank durch einen passenden Unique-Index als Constraint.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hello,

          Wie frage ich das denn vor dem Speichern ab?

          genaugenommen gar nicht, sondern es wird erst beim Speicherversuch durch die Datenbank abgefangen, damit keine Nebenläufigkeitslücke entsteht. Prüfung und Datenmanipulation/-Ergänzung müssen in einem atomistischen Prozess zusammengefasst sein. Das erledigt die Datenbank durch einen passenden Unique-Index als Constraint.

          und konkret? hast du da ein beispiel für mich?

          1. Hello,

            und konkret? hast du da ein beispiel für mich?

            Hier ist ein Beispiel
            http://www.java2s.com/Code/SQL/Select-Clause/SettingaUniqueConstraint.htm

            Versuche dann mal in der MySQL-Konsole (oder im phpmyadmin) einen Datensatz einzufügen, und dann noch einen mit dem gleichen Namen.

            Lass Dir auch mal das Create-Table-Statement anzeigen.

            MySQL rationalisiert das Wort CONSTRAINT einfach weg :-))

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hello,

              und konkret? hast du da ein beispiel für mich?

              Hier ist ein Beispiel
              http://www.java2s.com/Code/SQL/Select-Clause/SettingaUniqueConstraint.htm

              Versuche dann mal in der MySQL-Konsole (oder im phpmyadmin) einen Datensatz einzufügen, und dann noch einen mit dem gleichen Namen.

              Lass Dir auch mal das Create-Table-Statement anzeigen.

              MySQL rationalisiert das Wort CONSTRAINT einfach weg :-))

              Hi, also das mit CONSTRAINT habe ich gelöst, jetzt kommt eben die Fehlermeldung sqlseitig, dass eben der datensatz schon vorhanden ist:

                
              Query {INSERT INTO `flyspray_locations` ( owner_name, street_name, plz_name, loc_name) VALUES ( ?, ?, ?, ?)} with params {Trabold,Hauptstraße 10,95447,Bayreuth} Failed! (Duplicate entry 'Trabold-95447-Bayreuth-Hauptstraße 10' for key 2)  
              
              

              Nur wie kann ich daraus eine "brauchbare" Fehlermeldung erzeugen, die ich im Programm anzeigen lassen kann?

              1. Hello,

                Hi, also das mit CONSTRAINT habe ich gelöst, jetzt kommt eben die Fehlermeldung sqlseitig, dass eben der datensatz schon vorhanden ist:

                Query {INSERT INTO flyspray_locations ( owner_name, street_name, plz_name, loc_name) VALUES ( ?, ?, ?, ?)} with params {Trabold,Hauptstraße 10,95447,Bayreuth} Failed! (Duplicate entry 'Trabold-95447-Bayreuth-Hauptstraße 10' for key 2)

                
                >   
                > Nur wie kann ich daraus eine "brauchbare" Fehlermeldung erzeugen, die ich im Programm anzeigen lassen kann?  
                  
                  $res = mysqli\_query($con, ... );  
                  if ( ($error = mysqli\_errno) > 0 )  
                  {  
                      ## Fehlerbehandlung durchführen  
                  }  
                  else  
                  {  
                      ## alles OK.  
                  }  
                  
                Duplicate Key hat eine eindeutige Fehlernummer in MySQL.  
                <http://dev.mysql.com/doc/refman/5.1/en/error-handling.html>  
                <http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html>  
                  
                Es müsste der Error 1062 sein.  
                  
                  
                  
                Liebe Grüße aus dem schönen Oberharz  
                  
                  
                Tom vom Berg  
                ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                  
                
                -- 
                 ☻\_  
                /▌  
                / \ Nur selber lernen macht schlau  
                <http://bergpost.annerschbarrich.de>
                
    2. Ja, laß es. hier werden bestimmt gleich welche aufschlagen, die Dir reale Beispiele nennen, die Du ausschließen würdest.

      Ja, mich z.B. - ich heiße genauso wie mein Vater. Wir wohnen beide im selben Haus (sprich, er wohnt "bei mir"). Das Mehrfamilienhaus hat zwar getrennte Eingangstüren, dennoch ist es dieselbe Hausnummer ohne Unterscheidung "a" oder "b" oder "Top1"/"Top2".