PHP:将唯一的随机数写入数据库

时间:2016-07-10 17:56:05

标签: php mysql database random

我正在尝试将一个串行和随机的PIN写入mysql数据库,但是有些PIN值被写入多次。

如果已经存在,我如何跳过将$ pin写入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);
    }
}

3 个答案:

答案 0 :(得分:3)

pin列创建唯一索引:

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

然后将您的查询更改为

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

(注意ON DUPLICATE KEY UPDATE serial_pin = VALUES(serial_pin)部分,这只是示例,您可以将pin = pin跳过)如果具有该引脚值的行已经存在,或者插入新行,它将更新查询。

您也可以使用INSERT IGNORE语句,这将忽略重复项。

关于主题

More about INSERT中的

MySQL docs

请注意,在您的示例中,该脚本容易受到 Sql injection 攻击。为避免这种情况,您应首先将参数传递给mysqli_real_escape_string函数以使数据在sql-safe内部(通过转义模糊字符)

答案 1 :(得分:1)

do..while循环可以解决您的问题:

textareas[i].onkeypress

虽然这可以解决您的直接问题,但随着行数的增加,您最终会发送越来越多的SQL请求,直到找到未使用的PIN。如果允许mySQL为每个新行生成唯一的PIN,您可能会对结果感到满意。

答案 2 :(得分:0)

如果你想将串行写入引脚生成引脚所在的行(有效地覆盖已经存在的旧串行,你将使用UPDATE语句:

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

如果你只是想跳过这个pin / serial组合,我想你已经得到了答案。你的代码应该可行