[英]While loop for mysql database with php?
我正在開發一個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循環和所有種類,所以這個地方是我最后的選擇。
謝謝
你最好使用它: 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
你可以使用guid。 當你不能使用自動編號時,這就是我所看到的。
這個功能不能做你想要的(沒有驗證): http : //www.php.net/manual/en/function.uniqid.php ?
隨機字符串生成...字母,數字,有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);
我認為你需要從不同的方向解決問題,特別是為什么不需要一系列遞增數字。
如果它需要是一個“不透明”的標識符,你可以做一些事情,比如從簡單的遞增數字開始,然后在它周圍添加一些東西,使它看起來不是,例如最后的三個隨機數。 您可以更進一步,並在前面放置一些生成的字母(隨機或基於其他算法,例如他們首次注冊的月份,或者他們點擊的服務器),然后執行一個簡單的校驗算法來制作另一個信的結尾。 現在有人不能輕易猜出一個ID,你有辦法在它到達數據庫之前拒絕一種ID。 您還需要在ID處存儲附加數據。
如果它需要是一個隨機且唯一的數字,那么在告訴新用戶之前,您需要使用生成的ID檢查數據庫。 在這里你會遇到規模問題,因為數字空間太小,你會在檢查運氣之前得到太多的碰撞。 如果可能的話,那么您需要將ID生成分為兩部分:第一部分將用於查找具有該前綴的所有ID,然后您可以生成一個在該集合中不存在的新ID從DB獲得。
對於初學者,我總是喜歡在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.