2017-03-25 22 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; 

私はテーブル内の4列があります。 id(PK AI)、uid(varchar型のユニークな)、name(varchar型)、email(varchar型)を。 新しいユーザエントリを作成したいときランダムキーは関数 'randomUnique()'を使用して生成され、カラム 'id'はAIに設定されているので詳細を入力しようとしますが、エラー番号1062がmysqlから返されます。AIに設定されているidカラム以外はすべて正常に実行されます。 1つのキーが重複している場合、列の値は1回スキップされます。 上記のコードは再帰関数なので、列 'id'でスキップされた値の数は、関数が呼び出された回数に正比例します。MySQLの自動インクリメント問題

例:

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

ここでは、乱数の機能のいずれかが、私たちにエラーを投げ返す傾向があり、私たちの再帰関数は一度番号をスキップ繰り返し、数438または3688を与えたbcoz数3はスキップした見ることができます成功した実行時に3を入力して次回に4を入力します。

私はそれが適切な順序に値を入力するように、自動インクリメントを修正する必要があります。 テーブルの構造を変更することはできません。

+2

注:IDをスキップするとどうして気になるのですか?私にはコードの匂いがする。 –

+0

私はmariadbとmysqlの両方で自動インクリメントカウンタをインクリメントするキー制約(uniqidからのユニークでない戻り値など)に失敗していることを確信しています。 – Rogue

+0

データベースがinnodbの場合 を参照してください。http://stackoverflow.com/questions/17668369/why-does-mysql-skip-some-auto-increment-ids https://dev.mysql.com/doc/refman /5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-configurable – Bob

答えて

1

あなたは、例えば、エントリがすでにINSERT操作を実行する前に、そのuidに存在するかどうかを確認することができます

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

これにより、新しく生成されたuidを持つレコードのcountが返されます。あなたはこのcountをチェックしない場合は、あなたがanoterランダムな値を生成するために、再度functionを呼び出すことができますINSERTのみ0のcount場合に実行することができます。

0

使用PHPのuniqid関数は、それが適切なユニークですが生成されます。

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

これは何に使用されていますか?より速く実行され、既に一意であることが保証されているid列を使用することができます。新しいDBリンクを作成している呼び出す各関数で

1

は、このような状況のPHP用mysqli_close($link);

どちらかお近くに接続

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   
     } 

または単に機能

$link = mysqli_connect("localhost", "root", "", "dummy"); 
function insert($uid,$name,$email){ 
のうち、DB接続を置くを提供することができます
+0

ありがとう、これは私のために働いた。私は関数の外に$リンクを宣言しました。 – Francis

+0

@Francis:緑の右目盛りをクリックすることで、この回答があなたのために働いたとして受け入れることを検討できます。 –

関連する問題