首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何查看数据库中是否已经存在随机数?

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

Stack Overflow用户
提问于 2018-10-30 04:49:37
回答 5查看 810关注 0票数 0

我希望我的页面创建一个随机数(只有数字)。这需要是唯一的数字。因此,在创建数字之后,如果这个数字还不存在,代码应该检查数据库。如果是这样的话,它应该生成一个新的数字并重复检查。如果号码是唯一的,代码就可以继续。我所拥有的东西会导致页面崩溃。我做错了什么?

$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();
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-11-05 03:36:21

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

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);
票数 0
EN

Stack Overflow用户

发布于 2018-10-30 09:59:09

我在我的一个项目中使用它来生成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);
票数 1
EN

Stack Overflow用户

发布于 2018-10-30 06:08:28

我不认为您需要为此准备好语句。只需将随机数转换为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一些东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53053589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档