我正在开发一个mysql数据库。
我“需要”每个用户的唯一ID,但它不能自动递增!至关重要的是它不是自动增量。
所以我想在用户注册我的网站时,在我的mysql表中插入一个类似mt_rand(5000,1000000)的随机数。这是我被困的地方?!
id是我的mysql表上特定于每个用户的唯一键,因为我无法100%保证为用户id插入mt_rand(5000,1000000)不会与其他用户的id语言发生冲突。
有没有办法我可以使用mt_rand(5000,1000000)并扫描mysql数据库,如果它返回true它是唯一的,那么在返回false时将其插入为用户的新ID(某人已经有id)生成一个新的id,直到它变为唯一,然后将其插入到mysql数据库中。
我知道这是可能的,我已经多次看过了,我尝试过while循环和所有种类,所以这个地方是我最后的选择。
由于
答案 0 :(得分:4)
最好使用此功能:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid
或使用此:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
但如果你真的想做你所说的话,你可以这样做:
$x;
do {
$x = random_number();
"SELECT count(*) FROM table WHERE id = $x"
} while (count != 0);
// $x is now a value that's not in the db
答案 1 :(得分:0)
你可以使用guid。当你不能使用自动编号时,这就是我所看到的。
答案 2 :(得分:0)
此功能是否符合您的要求(未经验证):http://www.php.net/manual/en/function.uniqid.php?
答案 3 :(得分:0)
随机字符串生成...字母,数字,有8个字符的218 340 105 584 896组合。
function randr($j = 8){
$string = "";
for($i=0;$i < $j;$i++){
srand((double)microtime()*1234567);
$x = mt_rand(0,2);
switch($x){
case 0:$string.= chr(mt_rand(97,122));break;
case 1:$string.= chr(mt_rand(65,90));break;
case 2:$string.= chr(mt_rand(48,57));break;
}
}
return $string;
}
...循环
do{
$id = randr();
$sql = mysql_query("SELECT COUNT(0) FROM table WHERE id = '$id'");
$sql = mysql_fetch_array($sql);
$count = $sql[0];
}while($count != 0);
答案 4 :(得分:0)
我认为你需要从不同的方向来解决这个问题,特别是为什么不需要一系列递增数字。
如果它需要是一个“不透明”的标识符,你可以做一些事情,比如从一个简单的递增数字开始,然后在它周围添加一些东西,使它看起来不是,例如最后三个随机数。您可以更进一步,并在前面放置一些生成的字母(随机或基于其他算法,例如他们首次注册的月份,或者他们点击的服务器),然后执行一个简单的校验算法来制作另一个信的结尾。现在有人不能轻易猜出一个ID,你有办法在它到达数据库之前拒绝一种ID。您还需要在ID的某处存储附加数据。
如果它需要是一个随机且唯一的数字,那么在告诉新用户之前,您需要使用生成的ID检查数据库。在这里你会遇到规模问题,因为数字空间太小,你会在检查运气之前得到太多的碰撞。如果可能的话,那么您需要将ID生成分为两部分:第一部分将用于查找具有该前缀的所有ID,然后您可以生成一个在该集合中不存在的新ID来自DB。
答案 5 :(得分:0)
对于初学者,我总是喜欢在php中进行所有随机化。
function gencode(){
$tempid=mt_rand(5000, 1000000);
$check=mysql_fetch_assoc(mysql_query("SELECT FROM users WHERE id =$tempid",$link));
if($check)gencode();
$reg=mysql_query("INSERT INTO users id VALUES ('$tempid')",$link);
//of course u can check for if $reg then insert successfull