我一直在高低搜索,但无济于事。
我正在尝试在9999,99999999之间为我的用户插入随机ID号。问题是它们必须是独一无二的。我已经设置了所有内容但是为id设置了自动增量。我想我会保留自动增量字段,只为唯一ID添加另一行。
这是我到目前为止所得到的:
$id = mt_rand(9999,99999999);
$query = "SELECT * FROM accounts";
$result = mysql_query($query) or die(mysql_error());
while($account = mysql_fetch_array($result)){
if ($id == $account['id']){
$id = mt_rand(9999,99999999);
} else {
$sql = "INSERT INTO accounts (id, username, email, password, sex)
VALUES ('$id', '$username', '$email', '$password', '$sex')";
mysql_query($sql);}}
现在我想如果我创建一个随机数,检查数据库是否存在创建另一个,否则插入它,但它不起作用,如果它是一个简单的解决方案我道歉。
再次感谢:)
答案 0 :(得分:3)
这似乎是一个愚蠢的答案:
如果您已在唯一键上使用auto_increment
,则无需添加另一个唯一键
答案 1 :(得分:1)
接下来的代码几乎100%肯定你永远不会重复,我用自己,永远不会有任何问题。
function guid(){
if (function_exists('com_create_guid')){
return com_create_guid();
}else{
mt_srand((double)microtime()*10000);
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45); // "-"
$uuid = chr(123) // "{"
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125); // "}"
return $uuid;
}
}
如果您认为这还不够,请尝试在数字之前创建前缀,它可以是年date('Y');
祝你好运
答案 2 :(得分:1)
虽然不是“强大的”PRNG(实际上非常弱),但一种方法是使用one-to-one random mapping中描述的PRNG。 此特定解决方案显示了PRNG解决方案,其周期长度 范围。但是,此解决方案不能“按原样”使用,因为域名不同。
请参阅Random-Order Keys - 间接来自上面的链接 - 以及以下使用附加同余方法/线性反馈移位寄存器PRNG的部分。这是a table showing the tap positions - 使用2 ^ 23将允许在[9999,9999 + 2 ^ 23-1]或[9999,8398606]之间选择保证唯一号码。但是,应考虑其他交易因素,例如“选择ID但不使用它”。
显然这不应该用于 true “security”(即使是“真随机随机”,一个nonce - 它不需要唯一约束! - 和/或其他验证系统应该被雇用,随机ID只是一个“默默无闻” - 这些不是安全! - 层。)
快乐的编码。
答案 3 :(得分:0)
你可以生成一个uid,然后检查它是否被使用。
<?php
do {
$uid = rand(9999,99999999);
$sql = "SELECT * FROM `table` WHERE `uid`=$uid";
$result = mysql_query($sql);
while (mysql_num_rows($result) > 0);
// have $uid
?>
或者因为你有uid,那么你可以在其上运行一个方程来生成一个uid(比如md5或sha256哈希或其他东西)。