2016-07-10 11 views
1

私はシリアルとランダムなPINをmysqlデータベースに書き込もうとしていますが、いくつかのPIN値は複数回書き込まれます。PHP:データベースにユニークな乱数を書く

ピン列に$ pinを書き込むのをスキップするにはどうすればいいですか?

スニペットは、次のとおりです(これは一例であり、ON DUPLICATE KEY UPDATE serial_pin = VALUES(serial_pin)一部の点に注意してください

INSERT INTO pin_serial (serial, pin) VALUES('$f_serial', '$pin') 
    ON DUPLICATE KEY UPDATE serial_pin = VALUES(serial_pin) 

にクエリを変更すると

ALTER TABLE `pin_serial` ADD UNIQUE INDEX (`pin`) 

<?php 

for($serial = 1000; $serial <= 1600; $serial++) { 
    $serial_prefix = "HCIS"; 

    //generate random figures. 
    $rand_pin1 = rand(10599, 99999); 
    $rand_pin2 = rand(22222, 89898); 
    $pin = $rand_pin1 . $rand_pin2; 
    $f_serial = $serial_prefix . $serial; 

    $check = "SELECT pin FROM pin_serial WHERE pin = '$pin'"; 
    $check_query = mysqli_query($connection, $check); 
    if(mysqli_num_rows($check_query) > 0){ 
     // how do I skip writing $pin into pin column if it already exist here 

    } 
    elseif(mysqli_num_rows($check_query) == 0){ 
     //inserting a generated figure and $serial into serial and pin column. 
     $pin_serial_query = "INSERT INTO pin_serial (serial, pin) VALUES('$f_serial', '$pin')"; 
     mysqli_query($connection, $pin_serial_query); 
    } 
} 

答えて

1

を動作するはずです。 do..whileループは問題を解決するはずです:

for ($serial = 1000; $serial <= 1600; $serial++) { 

    $serial_prefix = "HCIS"; 

    do { 

    // generate random figures 
    $rand_pin1 = rand(10599, 99999); 
    $rand_pin2 = rand(22222, 89898); 
    $pin = $rand_pin1 . $rand_pin2; 
    $f_serial = $serial_prefix . $pin; 

    $check = "SELECT pin FROM pin_serial WHERE pin = '$pin'"; 
    $check_query = mysqli_query($connection, $check); 

    } while (mysqli_num_rows($check_query) >0); 

    //inserting a generated figure and $serial into serial and pin column. 
    $pin_serial_query = "INSERT INTO pin_serial (serial, pin) VALUES ('$f_serial', '$pin')"; 
    mysqli_query($connection, $pin_serial_query); 

} 

これはすぐに問題を解決しますが、行数が増えると、未使用のPINが見つかるまで、ますますSQLリクエストが送信されるようになります。 mySQLが新しい行ごとに一意のPINを生成できるようにすると、結果がより喜ばれることになります。

+0

私はあなたのソリューションを試してみましたが、ほとんどのピンの値は同じです。それは私のために働かなかった。私は間違って何をしていますか? – Abk

+0

申し訳ありません...私の部分で愚かな間違い。 "$ f_serial = $ serial_prefix。$ serial;"を変更してください。 "$ f_serial = $ serial_prefix。$ pin;"に変更してください。それは動作します。私は答えでこれを修正しました。 –

+0

それが問題を解決しました。ありがとうございます – Abk

3

pin列に一意のインデックスを作成します。 、pin = skipにするだけです)。そのピン値は既に存在しているか、新しい行を挿入してください。

INSERT IGNOREステートメントを使用することもできます。重複は無視されます。 MySQL docs

More about INSERTトピック

上のあなたの例では、スクリプトがSql injection攻撃に対して脆弱であることに注意してください。これを避けるには、最初にパラメータをmysqli_real_escape_string関数に渡して、ピンを生成したピンが既に存在する行にシリアルを書き込む場合は、(安全でない文字をエスケープすることによって)sqlセーフでデータを作成する必要があります。

+0

良い考えですが、** SQLインジェクションのリスク**についての警告を追加します(Pi/arduinoローカルコードのようでも) – Blag

+0

@Blag良い点、答えにSQLインジェクションについての注釈を追加しました。 – baldrs

+0

ピンとシリアル列はすでに一意のキーです。あなたが提供したソリューションを試しましたが、まだ複数のピンが書かれています。 – Abk

0

そこに既にある古いシリアルを上書きするには、UPDATEステートメントを使用します。

... "UPDATE pin_serial SET serial='$serial'"; 

あなたはちょうど私がヨーヨーはすでに答えを得たと思います。このピン/シリアルコンボをスキップしたい場合はあなたのコードが

関連する問題