2013-12-14 44 views
2

我有這樣的腳本:PHP獨特的隨機數,是不是在MySQL的表 - 檢查,然後生成

$rrezervim_id = rand(1, 5); 
$result = mysql_query("SELECT rrezervim_id FROM pax_list WHERE rrezervim_id='$rrezervim_id'"); 
if(mysql_num_rows($result) == 1) 
{ 
$rrezervim_id = rand(1, 5); 
} 
else(mysql_num_rows($result) > 1); 
{ 
    echo "$rrezervim_id"; 
} 

什麼,我試圖做的是要使用PHP,並生成一個唯一的隨機數的MySql 我有表格內的值(rrezervim_id)[Values:1,2,3,5],所以必須生成並且空閒的唯一的隨機數字是Number 4. 但是由於我得到的是隨機的已經插入表中[值:1,2,3,5]。

任何人都可以幫助我,如果已經存在於表中,在生成唯一編號之前進行檢查非常重要。

+3

爲什麼不直接使用內置的'AUTO INCREMENT'?這將確保所有號碼都是唯一的。 –

+0

是否有意義列出所有可能的數字,然後選擇所有未使用的數字?這成爲「有效的ID列表」,然後從中選擇一個隨機的ID。 – Floris

+0

你真的需要自己產生數字嗎?看起來像'AUTO_INCREMENT'會做得很好的工作。 – Jeribo

回答

2

首先,在代碼中直接誤差

if(mysql_num_rows($result) == 1) 
{ 
    $rrezervim_id = rand(1, 5); 
} 

失敗,如果您按取兩次。你需要一個循環,如

while (mysql_num_rows($result) == 1) 
{ 
    $rrezervim_id = rand(1, 5); 
    $result = mysql_query("SELECT rrezervim_id FROM pax_list WHERE rrezervim_id='$rrezervim_id'"); 
} 

這麼說,我懷疑,有更多你的代碼錯誤:

  1. 如果你想用這種「自由」的隨機數,將其插入在稍後的時間點將數據添加到數據庫中,您將面臨競爭條件:兩個進程都選擇相同(仍然是空閒)的數字,但僅在第一個插入時它仍然是唯一的。

  2. 如果你的可能的隨機數字段幾乎滿了,這種方法可能會有非常差的表現:如果你有80%的填充率,比如在你的例子中,你平均有4個「壞」命中,之前獲得「好」的命中。

我建議你考慮使用內置的數據庫,如戰鬥證明AUTO_INCREMENT爲主要手段,然後用一個公式來創建難以猜測僞隨機從它。 A linear feedback shift register可以是一種方法,但將表格中存儲的自動生成的ID和(不一定唯一的)僞隨機密碼組合可能是另一種方法。兩種方法都可以爲您提供線性性能和無比例使用。

0

可以用PHP

<?php 
    echo uniqid(); 
?> 

創造獨特的數字,但你應該使用自動遞增。如果你想知道由哪個號碼插入項時保存使用這樣的事情:

function insertUser(){ 
Global $userName; 
$sqlInsert="INSERT INTO person (e_mail) 
    VALUES ('".$userName."')"; 
if (!mysql_query($sqlInsert)){ 
    die('Error: ' . mysql_error()); 
} 
$userId = mysql_insert_id(); 
return $userId; 
} 

在$ userID是最後插入的值

0

由於您未使用AUTO_INCREMENT,因此建議(速度較慢)是選擇所有有效的數字並隨機選取1。

如果我們有[1,2,3,5,7],我們允許的元素是1..10,那麼我們有5個允許的元素(4,6,8,9,10)。所以我們蘭特(1,5)。如果我們得到「1」,我們的下一個數字是4,如果我們得到「2」,我們的下一個數字是6。爲了更好地解釋這個想法:

Rand(1,5) Our array Value(available) 
      1 
      2 
      3 
1   -   4 
      5 
2   -   6 
      7 
3      8 
4      9 
5      10 

代碼示例:

$max_num = 100; 
$res = mysql_query("SELECT rrezervim_id FROM pax_list ORDER BY rrezervim_id ASC"); 
$nums = []; 
while($row = mysql_fetch_assoc($res)){ 
    $nums[] = $res['rrezervim_id']; 
} 
$numbers_allowed = $max_num - count($nums); // actual number of allowed elements 
$new_num_idx = rand(1, $numbers_allowed); // The selected element's index 
               (skipping all existing elements) 
// in the following loop: $j starts as our lowest options. 
// when $new_num_idx reaches 0 - it means that we have skipped 
// over $new_num_idx elements. The next available element is 
// our choice. $new_num_idx is a countdown 
for($i=0,$j=1, $n=count($nums); $i<$n && $new_num_idx > 0; $i++){ 
    while ($nums[$i]>$i+$j){ 
     $j++; $new_num_idx--; 
    } 
} 
return $i+$j; 
+0

看起來像我需要的,但我得到一個錯誤$ nums = [];解析錯誤:語法錯誤,意外'['在@galchen – user3055639

+0

將其更改爲$ nums = array();那麼,或者更新你的PHP版本 – galchen

+0

請記住 - 我沒有測試它,甚至沒有檢查它的代碼是否可能實際工作。只是寫了幾行來顯示或多或少你可能要找的東西。如果你想讓我幫你測試,請告訴我 – galchen