php唯一的随机数,不在mysql表中 - 检查然后生成

时间:2013-12-14 00:11:25

标签: 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)[值:1,2,3,5]所以必须生成并且是免费的唯一随机数是4号。 但是使用这个脚本有些东西不起作用,因为我甚至已经随机插入了表中[值:1,2,3,5]。

任何人都可以帮助我,如果已经存在于表中,那么在生成唯一编号之前检查mysql是非常重要的。

3 个答案:

答案 0 :(得分: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次“坏”命中,在获得“好”的打击之前。

  3. 我建议您考虑使用内置的数据库,例如经过战斗验证的AUTO_INCREMENT作为主要方法,然后使用公式从中创建难以猜测的伪随机数。 A linear feedback shift register可以是一种方法,而加密组合自动生成的ID和存储在表中的(不一定是唯一的)伪随机可能是另一种方法。这两种方法都可以为您提供线性性能和无种族使用。

答案 1 :(得分:0)

你可以在php中创建唯一的号码

<?php
   echo uniqid();
?>

但你应该使用AUTO INCREMENT。如果您想知道插入项目的保存号码,请使用以下内容:

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中的

是最后插入的值

答案 2 :(得分: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;