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