Duplicate Entry mit NULL

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Duplicate Entry mit NULL

    'n abend @ all,

    wie vermeide ich geschickt "Duplicate Entry" wenn ein Attribut UNIQUE sein soll, ich aber keine Pflichteingabe habe, es also zu NULL-Einträgen kommt,
    die somit "duplicate" sind.

    also angenommen das feld email muss nicht ausgefüllt sein, ist aber auf unique gesetzt.... dann dopeln sich leere einträge und das eben führt zur fehlermeldung.

    Danke inkognitus

  • #2
    macht es wirklich sinn, spalten die keine pflichtangaben sind auf unique zu setzen?

    ansonsten bleibt dir nichts anderes übrig hinterher zu testen, ob der "NULL" eintrag schon vorhanden ist.

    Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
    sondern mit den Augen das Manual zu lesen.

    Kommentar


    • #3
      @ xManUx
      email-Adressen von Usern sollten eindeutig sein, sonst bekommt ein eingetragener irgendetwas mehrmals (newsletter z.B.)
      oder ich meine an den einen zu senden und der andere liest zumindest mit, weil er die gleiche adresse eingetragen hat
      das lässt sich also leider nicht vermeiden.

      aber hier MUSS nun leider NICHT die email-adresse eingegeben werden.

      NULL ist also auf jeden Fall irgendwann in der spalte vorhanden

      gibt es eine elegante Möglichkeit, NULL von Unique auszuschließen oder ähnliches (also: WENN eintrag, dann aber bitte unbedingt eindeutig)???

      Zuletzt geändert von inkognitus; 28.11.2004, 18:25.

      Kommentar


      • #4
        email-Adressen von Usern sollten eindeutig sein, sonst bekommt ein eingetragener irgendetwas mehrmals (newsletter z.B.)
        oder ich meine an den einen zu senden und der andere liest zumindest mit, weil er die gleiche adresse eingetragen hat
        das lässt sich also leider nicht vermeiden.
        Mein Vorschlag wäre, nach der Eingabe zu manuell via PHP zu überprüfen, ob eine Email-Adresse schon vorhanden ist. Wenn die Email-Adresse keine Pflichtangabe ist, bleibt Dir nichts anderes außer:

        1. Unique zu entfernen oder
        2. etwas anderes eindeutiges zu darin zu verfrachten. ( Z.B. Nickname ) und beim versenden vorher prüfen, ob es sich um eine Email-Adresse handelt. z.B. mit

        PHP-Code:
        if (!eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$",$email)) { 

        echo 
        "keine gültige email"; } 

        aber hier MUSS nun leider NICHT die email-adresse eingegeben werden.
        Wieso nicht, wenn man fragen darf? Vielleicht ist es ja auch einfacher, daraus eine Pflichtangabe zu machen. Sehr empfehlenswert für Registrierungen.

        gibt es eine elegante Möglichkeit, NULL von Unique auszuschließen oder ähnliches (also: WENN eintrag, dann aber bitte unbedingt eindeutig)???
        Nicht das ich wüsste.

        Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
        sondern mit den Augen das Manual zu lesen.

        Kommentar


        • #5
          @ xManUx

          dein erster vorschlag erscheint mir am plausibelsten:
          per "php-mysql"-Mix auf duplikat prüfen VOR eintrag.

          die anderen beiden ideen:
          1) unique schließt sich damit aus (leider, weil nicht gerade elegant das)
          2) an einen anderen (!) unique-string dachte ich auch schon z.B. benutzername, das wäre aber am umständlichsten, zusätzlich zum benutzername-email-tausch im Vorfeld nachher zu prüfen, ob es sich um eine Mailadresse handelt. Riecht auch schwer nach Workaround uns eigentliche Problem.

          Zu deiner Frage: Die email-Adresse soll hier kein Pflichtfeld sein, weil es darum geht möglichst keine Leute auszuschließen, es soll sich jeder (mit Anschrift, Telefon o.ä.) verewigen können - typisch für Portale, die Kunden binden wollen.

          Aber vielleicht fällt dir oder jemand anderem ja noch etwas ein zum Umgang mit "NULL-Werten" in Unique-Feldern.


          Danke bis hierhin...


          PS: Primary keys erlauben ja eh keine NULL werte, Unique schon, nur einen in der gesamten spalte, übersehen wir da was oder wie???
          Zuletzt geändert von inkognitus; 28.11.2004, 19:07.

          Kommentar


          • #6
            2) an einen anderen (!) unique-string dachte ich auch schon z.B. benutzername, das wäre aber am umständlichsten, nachher zu prüfen, ob es sich um eine Mailadresse handelt.
            Du hast mich nicht ganz verstanden?

            was spricht dagegen so etwas in verbindung zu 1. dies zu benutzen:

            PHP-Code:

            function checkrightemailsyntax($email) {

             if (!
            eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email)) { 
               
            $x 0;
               }
             
               else {
             
              
            $x 1;  
             
             }

             return 
            $x;
            }


            // und später beim auslesen der daten:

             
            If ( checkrightemailsyntax($email) == ) { mail(); } 
            Zuletzt geändert von xManUx; 28.11.2004, 19:13.

            Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
            sondern mit den Augen das Manual zu lesen.

            Kommentar


            • #7
              @ xManUx

              ah, du meinst, zu checken, ob überhaupt eine adresse eingetragen ist,
              das täte ich sowieso, da ja hier kein Pflichtfeld gegeben
              die email-"syntax" überprüfe ich allerdings vor eintrag, wenn gegeben
              und auch die existenz der domain.
              Also WENN eintrag, dann handelt es sich auf jeden fall um eine email-Adresse, deshalb reicht nachher
              Code:
              if ($ds['email']) ...
              wobei $ds = mysql_fetch_assoc(..) und 'email' eben die Spalte

              Kommentar


              • #8
                nein, ob es sich um eine emailadresse oder um etwas anderes handelt,
                falls du unique benutzt, und statt NULL etwas anderes eindeutiges einträgst wie z.b. benutzername ( sofern er auch wirklich eindeutig ist, sprich: nicht mehrfach benutzbar ist, also einmalig zu verwenden ist. )

                so kannst du später prüfen, ob es sich tatsächlich um eine emailadresse halt, wenn ja, verschickst du sie, wenn nicht, dann eben nicht. ( zb bei newslettern )

                Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
                sondern mit den Augen das Manual zu lesen.

                Kommentar


                • #9
                  Zeig mal deine DB Struktur scheint mir nicht wirklich koscha zu sein....
                  [color=blue]MfG Payne_of_Death[/color]

                  [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                  [color=red]Merke:[/color]
                  [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                  Murphy`s Importanst LAWS
                  Jede Lösung bringt nur neue Probleme
                  Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                  In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                  Kommentar


                  • #10
                    @ Payne_of_Death

                    CREATE TABLE therapeuten (
                    id bigint(20) NOT NULL auto_increment,
                    benutzer varchar(12) NOT NULL default '',
                    kennwort varchar(12) NOT NULL default '',
                    ************ enum('w','m') NOT NULL default 'w',
                    vorname varchar(30) NOT NULL default '',
                    nachname varchar(55) NOT NULL default '',
                    beruf varchar(55) NOT NULL default '',
                    str varchar(55) NOT NULL default '',
                    plz int(5) NOT NULL default '0',
                    ort varchar(55) NOT NULL default '',
                    fon varchar(20) NOT NULL default '',
                    mobil varchar(20) default NULL,
                    fax varchar(20) default NULL,
                    email varchar(55) default NULL,
                    www varchar(100) default NULL,
                    grundbildung varchar(55) NOT NULL default '',
                    ausfortbildg1 varchar(55) default NULL,
                    ausfortbildg2 varchar(55) default NULL,
                    erlaubnis set('a','b','c') NOT NULL default '',
                    qualifikation varchar(55) NOT NULL default '',
                    abrechnung set('d','e','f') NOT NULL default '',
                    schwerpunkte tinytext NOT NULL,
                    zielgruppen set('g','h','i','j','k','l') default NULL,
                    persoenlich text,
                    andere varchar(55) default NULL,
                    bild blob,
                    anmeldung date NOT NULL default '0000-00-00',
                    aenderung timestamp(14) NOT NULL,
                    aktiv enum('','on') NOT NULL default '',
                    PRIMARY KEY (id),
                    UNIQUE KEY kennwort (benutzer,kennwort),
                    UNIQUE KEY email (email),
                    KEY ort (ort)
                    ) TYPE=MyISAM AUTO_INCREMENT=1 ;


                    Fehlermeldung bei eintrag eines neuen ds mit leerem email-feld:
                    Duplicate entry '' for key 3

                    die db-Struktur scheint also in Ordnung zu sein und die Fehlermeldung richtig.

                    Was ist also Dein Gedanke???

                    Kommentar

                    Lädt...
                    X