我希望我的页面创建一个随机数(只有数字)。这需要是唯一的数字。因此,在创建数字之后,如果这个数字还不存在,代码应该检查数据库。如果是这样的话,它应该生成一个新的数字并重复检查。如果号码是唯一的,代码就可以继续。我所拥有的东西会导致页面崩溃。我做错了什么?
$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();
发布于 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);
发布于 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);
发布于 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
一些东西。
https://stackoverflow.com/questions/53053589
复制相似问题