MYSqL doppelter eintrag verhindern.


Andrin.Spitzer

Erfahrenes Mitglied
Hay.

Ich möchte für mein prüf Formular eine Funktion einbauen die bevor das Formular abgeschickt wurde in der Datenbank sicher stellt das die eingetragene serien nummer nicht bereits vorhanden ist.

Mein bisheriger code:

PHP:
$db = new mysqli('localhost','root','','protokol');
    
    if($db->connect_error):
        echo 'Verbindung Fehlgeschlagen';
    endif;
    
    if(isset($_POST['submit'])):
        $seriennummer     = $_POST['Serial-number-Text'];
        $object         = $_POST['Object'];
        $user             = $_POST['User'];
        $creator         = $_POST['Creator'];

    $absenden = $db->prepare("INSERT INTO kontrolliert (seriennummer,type,kontrolliert,gebaut,datum) Values(?,?,?,?,NOW())");
    $absenden->bind_param('iiss',$seriennummer,$object,$user,$creator);
    

    $absenden->execute();
        
    endif;

Grüsse
 

basti1012

Erfahrenes Mitglied
Habe mal gegoogelt für dich
// Zitat
Gibt 2 Möglichkeiten:
  1. du kümmerst dich selber darum dass nix doppelt eingefügt wird. D.h. du machst vor dem Insert eine Abfrage ob dein Wert schon drin ist und wenn ja, lässt du das mit dem Insert sein
  2. du lässt MySQL das übernehmen mit dem UNIQUE Key. Eine Spalte die den Unique-Key hat kann jeden Wert nur einmal einfügen und du bekommst eine Fehlermeldung wenn du es dennoch versuchst Duplikate einzufügen. Du kannst Unique auch auf Spaltenkombinationen anwenden, dann muss die Kombination der Werte einmalig sein
 

Andrin.Spitzer

Erfahrenes Mitglied
Hay

das hatte ich auch gefunden. so wie ich das verstehe wird mit unique der neue Eintrag einfach nicht erfasst, habe es ein paar mal getestet habe dann weder eine Fehlermeldung noch ein neuer Eintrag sehen können.

Aber ich will eigentlich das ich bevor das Formular abgesendet wurde ich schon sehen kann dass diese Nummer bereits eingetragen wurde.
 

basti1012

Erfahrenes Mitglied
Wenn du es vorher sehen willst mußt du wohl erst eine SELECT Abfrage machen ob dein Eintrag schon vorhanden ist.
Wenn nein dann speichern und wenn ja gibst du dir einen eigenen Fehler raus.

Wie sieht den deine Tabellen Struktur aus ?
Hast du das unique auf der Spalte mit der Seriennummer gesetzt oder wie ?
 

Zvoni

Erfahrenes Mitglied
Hay

das hatte ich auch gefunden. so wie ich das verstehe wird mit unique der neue Eintrag einfach nicht erfasst, habe es ein paar mal getestet habe dann weder eine Fehlermeldung noch ein neuer Eintrag sehen können.

Aber ich will eigentlich das ich bevor das Formular abgesendet wurde ich schon sehen kann dass diese Nummer bereits eingetragen wurde.
Und wo bitte schön frägst du den Fehler ab?
MySQL erzeugt nämlich ganz sicher einen Fehler, nur ist das eine Hol-Schuld.
Müsste Fehler-Code 1062 sein.

Hier mal ein Link zum Duplicate-Handling:

Mit INSERT IGNORE könntest du dann z.B. per Records-Affected prüfen, ob es geklappt hat.
 

basti1012

Erfahrenes Mitglied
Zwischenfrage, wenn ich versuche ( direkt bei Phpadmin ) die Spalte "seriennummer" ein umique zu geben , bekomme ich diesen Fehler .
Code:
#1170 'seriennummer' wird in der Schlüsseldefinition ohne Schlüssellängenangabe verwendet
Gibt es dafür eine erklärung ?
In seinen Bild geht es ja, und wenn ich die soweit abschreibe bekomme ich den Fehler.
( mediumtext in varchar ändern behebt das problem )
 

basti1012

Erfahrenes Mitglied
google -> mysql error 1170
Soweit verstehe ich es ja.
Bei mir macht phpadmin dicht und erlaubt es nicht.

Bei ihn ( laut Bild ) , scheint es ja geklappt zu haben.
Das verstehe ich noch nicht ganz.Ich kriegte es nicht hin die Tabelle bei Phpadmin nachzubauen weil Phpadmin das blockt .
Da er aber im anderen Forum mitlerweile noch mehr Spalten brauch ist das erstmal hier auch nicht mehr wichtig
 

ComFreek

Mod | @comfreek
Moderator
du kümmerst dich selber darum dass nix doppelt eingefügt wird. D.h. du machst vor dem Insert eine Abfrage ob dein Wert schon drin ist und wenn ja, lässt du das mit dem Insert sein
Ohne Transaktionen bekommst du hier Race Conditions. Die einfachere Möglichkeit hier wäre einfach UNIQUE zu nutzen und den Fehlercode abzufragen.
 

Neue Beiträge

Forum-Statistiken

Themen
272.360
Beiträge
1.558.622
Mitglieder
187.832
Neuestes Mitglied
SirrDansen