2017-03-25 5 views
0
function randomUnique(){  
     return $randomString =rand(0, 9999); //generate random key  
    } 

    function insert($uid,$name,$email){ 
      $link = mysqli_connect("localhost", "root", "", "dummy");   
      $query = "insert into `usertbl`(`uid`,`name`,`email`) 
         values('".$uid."','".$name."','".$email."');"; 
      if(mysqli_query($link, $query)){   
       return $rval = 1; 
      }else if(mysqli_errno($link) == 1062){   
       insert(randomUnique(),$name,$email); 
      }else if(mysqli_errno($link != 1062)){   
       return $rval = 2;// unsuccessful query   
      } 
     } 


     $uid = randomUnique(); 
     $name = "sam"; 
     $email = "[email protected]"; 
     $msg_code = insert ($uid,$name,$email); 
     echo $msg_code; 

Ich habe 4 Spalten in der Tabelle: id (PK AI), uid (varchar unique), name (varchar), email (varchar). Wenn ich einen neuen Benutzereintrag erstellen will.Ein zufälliger Schlüssel wird mit der Funktion 'randomUnique()' generiert.Und ich habe die Spalte 'id' auf AI gesetzt, so versucht es die Details einzugeben, aber wenn der Schlüssel das wiederholt Die Fehlernummer 1062 wird von mysql zurückgegeben. Alles läuft gut, bis auf die ID-Spalte, die auf AI gesetzt ist. Der Spaltenwert wird einmal übersprungen, wenn ein Schlüssel ein Duplikat ist. Der obige Code ist eine rekursive Funktion, so dass die Anzahl der in der Spalte 'id' übersprungenen Werte direkt proportional zur Häufigkeit ist, mit der die Funktion aufgerufen wird.Mysql Autoinkrement Ausgabe

Beispiel:

id | uid | name | email 
1 | 438 | dan | [email protected] 
2 | 3688 | nick | [email protected] 
4 | 410 | sid | [email protected] 

Hier können wir sehen, Nummer 3 übersprungen bcoz entweder Zufallszahl Funktion hat uns eine Nummer 438 oder 3688, die wieder einen Fehler und unsere rekursive Funktion zu werfen neigt einmal die Anzahl Wiederholungen Skipping 3 und 4 nächste Mal bei erfolgreicher Ausführung eingeben.

Ich muss das automatische Inkrement so festlegen, dass es den Wert in die richtige Reihenfolge eingibt. Ich kann die Struktur der Tabelle nicht ändern.

+2

Hinweis: Warum kümmert es dich, wenn eine ID übersprungen wird? sieht für mich einen Code-Geruch aus. –

+0

Ich würde wetten, dass Sie eine Einfügung haben, die eine Schlüsseleinschränkung fehlschlägt (z. B. eine nicht eindeutige Rückgabe von "uniqid"), die den Autoinkrement-Zähler sowohl in Mariadb als auch in Mysql noch inkrementiert. – Rogue

+0

Wenn Ihre Datenbank innodb ist, beziehen Sie sich auf http://stackoverflow.com/questions/17668369/why-does-mysql-skip-some-auto-increment-ids https://dev.mysql.com/doc/refman /5.7/de/innodb-auto-increment-handling.html#innodb-auto-increment-configurable – Bob

Antwort

1

Sie können prüfen, ob bereits ein Eintrag mit dieser uid existiert, bevor Sie die INSERT-Operation ausführen, z.

SELECT COUNT(*) FROM table WHERE uid = '$uid'; 

Dies Sie die count der Datensätze zurück, die den neu erzeugten uid haben. Sie können dies count überprüfen und die INSERT nur ausführen, wenn count 0 ist. Wenn nicht, können Sie die function erneut aufrufen, um einen zufälligen Wert zu generieren.

0

Verwenden Sie die uniqid-Funktion von PHP, es erzeugt eine richtige einzigartige ist.

http://php.net/manual/en/function.uniqid.php

Was ist das für verwendet wird? Sie können möglicherweise die ID-Spalte verwenden, die viel schneller ausgeführt wird und bereits garantiert eindeutig ist.

1

In jeder Funktion aufrufen Sie neue db Link erstellen, kann für diese Situation php vorgesehen sein mysqli_close($link);

Entweder man enge Verbindung

if(mysqli_query($link, $query)){   
      return $rval = 1; 
     }else if(mysqli_errno($link) == 1062){ 
      mysqli_close($link);   
      insert(randomUnique(),$name,$email); 
     }else if(mysqli_errno($link != 1062)){   
      return $rval = 2;// unsuccessful query   
     } 

oder einfach setzen DB-Verbindung aus Funktion

$link = mysqli_connect("localhost", "root", "", "dummy"); 
function insert($uid,$name,$email){ 
+0

Danke, das hat bei mir funktioniert. Ich habe den $ Link außerhalb der Funktion deklariert. – Francis

+0

@Francis: Sie können diese Antwort akzeptieren, indem Sie auf das grüne Häkchen klicken. –

Verwandte Themen