php_neuling: Duplikate vermeiden

Hallo zusammen

Ich habe ein Problem beim Erstellen einer Fehlermeldung, wenn es einen Eintrag in meiner Datenbank schon gibt. Ich habe schon in einigen Foren nachgeforscht und mir schon etwas zusammengebastelt - aber irgendwie klappt es nicht ganz...

Kann sich das vielleicht mal jemand ansehen und mir weiterhelfen?

Vielen Dank für eure Hilfe.

$result = mysql_query("SELECT count(*) FROM mitarbeiter WHERE pn= '$pn'");
if (mysql_num_rows($result)==0) {

//Daten in DB speichern
$sql_befehl = mysql_query("INSERT INTO mitarbeiter (pn,name,vorname,adresse,ort) VALUES
('".$_POST['pn']."','".$_POST['name']."','".$_POST['vorname']."','".$_POST['adresse']."','".$_POST['ort']."')");

if($sql_befehl)
{ echo "Ihr Eintrag wurde hinzugef&uumlgt."; }

} else {

echo "Der Mitarbeiter mit der Personalnummer $pn existiert bereits in der Datenbank.";

}

  1. Tach!

    Ich habe ein Problem beim Erstellen einer Fehlermeldung, wenn es einen Eintrag in meiner Datenbank schon gibt. Ich habe schon in einigen Foren nachgeforscht und mir schon etwas zusammengebastelt - aber irgendwie klappt es nicht ganz...
    Kann sich das vielleicht mal jemand ansehen und mir weiterhelfen?

    Konkretisiere bitte das Problem. Es ist unerheblich, dass du schon irgendwo geforscht hast. Wichtig ist, dass du das Problem beschreibst, für das du Hilfe haben möchtest.

    [Select und wenn nicht da dann Insert]

    So macht man das nicht, weil bei einem Multi-User-System zwischen Abfrage und Eintragung andere Prozesse die Daten verändert haben können. Selbst wenn das unwahrscheinlich erscheint, ist es wesentlich besser, es gleich richtig zu machen. Leg einen Unique-Index auf - in deinem Fall - die Personalnummer an und dann einfach ohne Prüfung ein Insert probieren. Wenn die Nummer noch nicht vorhanden war, gibts ein OK und wenn doch, wird ein Fehler erzeugt. Den musst du auswerten, ob es ein Unique-Constraint-Error ist und weißt dann, dass die Nummer schon eingetragen war.

    dedlfix.

    1. „Leg einen Unique-Index auf - in deinem Fall - die Personalnummer an und dann einfach ohne Prüfung ein Insert probieren. Wenn die Nummer noch nicht vorhanden war, gibts ein OK und wenn doch, wird ein Fehler erzeugt. Den musst du auswerten, ob es ein Unique-Constraint-Error ist und weißt dann, dass die Nummer schon eingetragen war.“

      Vielen Dank für deine schnelle Antwort. Das mit dem Unique Key habe ich auch schon versucht. Es hat den Eintrag nicht gespeichert, aber ich habe keine Fehlermeldung herbekommen.

      Wie mache ich das?

      1. Tach!

        „Leg einen Unique-Index auf - in deinem Fall - die Personalnummer an und dann einfach ohne Prüfung ein Insert probieren. Wenn die Nummer noch nicht vorhanden war, gibts ein OK und wenn doch, wird ein Fehler erzeugt. Den musst du auswerten, ob es ein Unique-Constraint-Error ist und weißt dann, dass die Nummer schon eingetragen war.“

        Das mit dem Unique Key habe ich auch schon versucht. Es hat den Eintrag nicht gespeichert, aber ich habe keine Fehlermeldung herbekommen.
        Wie mache ich das?

        Definiere "keine Fehlermeldung bekommen"! Wenn mysql_query() gelingt, gibt es beim Insert true zurück, ansonsten false. Es wäre das erste, konkret nachzusehen was man für ein Ergebnis bekommt. Oder du schreibst deinen Code so, dass er diese beiden Zustände in einem if-else behandelt. Auch hier kann man prüfen, was das Ergebnis war, indem man mal zur Kontrolle je eine Ausgabe in die beiden Zweige schreibt.

        Der nächste Punkt ist, wie man nun an die konkrete Fehlermeldung kommt. Dazu gibt es die Funktionen mysql_error() und mysql_errno(). Sie sind im Handbuch beschrieben. Schau dir besonders mysql_errno() an, denn die Fehlernummer ist eindeutig auswertbar. Wenn du nun herausgefunden hast, welche Nummer bei doppelten Schlüsseln kommt, erstellst du ein weiteres if-else mit dieser Nummer. Kommen anderen Nummern, liegt ein anderer Fehler vor.

        Und außerdem: Wenn du im Handbuch nach den erwähnten mysql-Funktionen schaust, wird dich eine große rote Warnung anschreien, dass diese Funktionen veraltet sind. Steig lieber gleich bei Neuentwicklung auf die ebenfalls dort genannten Nachfolger um, sparst du dir später das Umbauen. Am Prinzip der Lösung ändert sich nichts, nur der Code muss geringfügig anders geschrieben werden.

        dedlfix.

  2. Hi,
    doppel - if macht unübersichtlich und macht meist Fehler.

    Kann sich das vielleicht mal jemand ansehen und mir weiterhelfen?

    $result = mysql_query("SELECT count(*) FROM mitarbeiter WHERE pn= '$pn'");

    sollte da nicht ein ; am ende hin?

    $sql = "SELECT * FROM mitarbeiter WHERE pn= '” . $pn . “' ;";  
    $result = mysql_query($sql);  
    $anz = mysql_num_rows($result);  
    if ( $anz > 0) {  
        //Update  
    }else{  
        // insert  
    }
    

    Viele Grüße aus LA

    --
    ralphi
    1. Tach!

      $result = mysql_query("SELECT count(*) FROM mitarbeiter WHERE pn= '$pn'");
      sollte da nicht ein ; am ende hin?

      Nein, sollte nicht und darf nicht. Nicht bei mysql_query(). Das ist auch keine PHP-Eigenheit sondern in der MySQL-API so definiert. Semikolons kommen nur bei Multi-Querys zur Anwendung, und die muss man mit einer eigens dafür vorgesehehen Funktion absenden.

      dedlfix.

      1. Hi dedlfix,

        Nein, sollte nicht und darf nicht. Nicht bei mysql_query(). Das ist auch keine PHP-Eigenheit sondern in der MySQL-API so definiert. Semikolons kommen nur bei Multi-Querys zur Anwendung, und die muss man mit einer eigens dafür vorgesehehen Funktion absenden.

        zB:
        $val = mysql_query("select 1 from " . $table_opt . ";");

        bei mir futz es - nicht erst seit heute. ;-)
        wenn ich den semi weglasse - gehts nicht.
        verwechselst du was ?

        Viele Grüße aus LA

        --
        ralphi
        1. Tach!

          $val = mysql_query("select 1 from " . $table_opt . ";");
          bei mir futz es - nicht erst seit heute. ;-)
          wenn ich den semi weglasse - gehts nicht.

          Im PHP-Handbuch steht "The query string should not end with a semicolon." In der MySQL-API-Dokumentation steht sogar "Normally, the string must consist of a single SQL statement without a terminating semicolon (“;”) or \g." Anscheinend entfernt PHP das Semikolon selbständig, bevor es die Query weitergibt, weil es ja mit selbigem nicht an der MySQL-API vorbei kommt. Wenn du da also ohne Semikolon nichts erreichst, ist irgendwas ganz anders als bei allen anderen.

          dedlfix.

          1. Hi delfix,

            Wenn du da also ohne Semikolon nichts erreichst, ist irgendwas ganz anders als bei allen anderen.

            nutze >= PHP/5.2.8 auf meinen servern.
            wenn du zeit hast probiers doch mal aus, mit und ohne semi - (mysql nicht mysqli !)

            Viele Grüße aus LA

            --
            ralphi
            1. Tach!

              Wenn du da also ohne Semikolon nichts erreichst, ist irgendwas ganz anders als bei allen anderen.
              nutze >= PHP/5.2.8 auf meinen servern.

              Solange ich PHP nutze, war es mindestens üblich, das Semikolon wegzulassen. Ich meine, es war sogar Pflicht, will jetzt aber keine alten Dokumentationen suchen.

              wenn du zeit hast probiers doch mal aus, mit und ohne semi - (mysql nicht mysqli !)

              Geht mit und ohne.

              dedlfix.