如何查看数据库中是否已经存在随机数?

时间:2018-10-29 20:49:37

标签: php

我希望页面创建一个随机数(仅数字)。这必须是一个唯一的数字。因此,在创建该号码之后,代码应检查数据库(如果该号码尚不存在)。如果是这样,它将生成一个新的数字并重复检查。如果数字是唯一的,则代码可以继续。我的结果导致页面崩溃。我在做什么错了?

$randomNR = mt_rand(10000,1000000000);

function newRandNR() {
    $randomNR = mt_rand(10000,1000000000);
}

function checkRandNR() {
    $stmt = $mysqli->prepare("SELECT * FROM accounts WHERE uid = ?");
    $stmt->bind_param("i", $randomNR);
    $stmt->execute();
    $stmt->store_result(); 
    if ($stmt->num_rows != 0) {
        newRandNR();
    }
    $stmt->close();

}

checkRandNR();

5 个答案:

答案 0 :(得分:0)

我认为您不需要为此准备一份声明。只需将随机数转换为int即可,查询将是稳定/安全的。

function checkRandNR($mysqli, $randmNR) {
    if ($mysqli->query("SELECT COUNT(*) FROM accounts WHERE uid = " . (int)$randmNR)->fetch_row()[0]) {
        // random number already exists.  Do what you wish.
        // newRandNR();
    } else {
        // you have a unique random number
    }
}

不幸的是,这种单一服务的“猜测和检查”方案很适合进行迭代查询,通常应该避免这种情况。

也许最好用WHERE uid IN (...)或类似的东西发送一批随机数,以使您不太可能多次访问数据库。

**由于我不鼓励声明全局变量,因此我会将变量作为参数传递到自定义函数范围中。请确保从您的功能中return

答案 1 :(得分:0)

我在一个项目中使用它来生成ID:

$id_exists = TRUE;
$uniqid = null;
do 
{
    $length = 10;
    $min = 1 . str_repeat(0, $length-1);
    $max = str_repeat(9, $length);

    $uniqid = date('Ymd') . mt_rand($min, $max); // YYYYMMDD0123456789

    $uniq_id_check = $mysqli->query("SELECT COUNT(*) FROM accounts WHERE uid = ". $uniqid);
    if (!$uniq_id_check)
        $id_exists = FALSE;
}
while ($id_exists);

答案 2 :(得分:0)

我建议使用此代码:

function checkRandNR() {
    do{
        $randomNR = rand(10000, 1000000000);
        $exist = $mysqli->query("SELECT COUNT(*) FROM accounts WHERE uid = '{$randomNR}'");
    }while(!$exist);
        return $code;
      }
}

答案 3 :(得分:0)

根据给出的答案,这就是我所做的,并且有效!

do {
$randomNR = mt_rand(10000,1000000000);
$stmt = $mysqli->prepare("SELECT * FROM accounts WHERE uid = ?");
$stmt->bind_param("i", $randomNR);
$stmt->execute();
$stmt->store_result();
} while ($stmt->num_rows != 0);

答案 4 :(得分:-1)

$stmt = $mysqli->prepare("SELECT MAX(*) as cnt FROM accounts")->execute;
$uid = $row ['cnt'] + 1;

为什么不想使用AUTOINCREMENT字段?