首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php唯一不存在于mysql表中的随机数-检查,然后生成

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

Stack Overflow用户
提问于 2013-12-14 00:11:24
回答 3查看 4.5K关注 0票数 2

我有这样的剧本:

代码语言:javascript
复制
$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中进行检查是非常重要的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-14 00:25:34

首先,代码中的直接错误是

代码语言:javascript
复制
if(mysql_num_rows($result) == 1)
{
  $rrezervim_id = rand(1, 5);
} 

失败,如果您按了一个已取数字两次。您需要一个循环,例如

代码语言:javascript
复制
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作为主要手段,然后使用一个公式从其中创建难以猜测的伪随机。线性反馈移位寄存器可以是一种方法,而密码学上将自动生成的ID和存储在表中的伪随机(不一定是唯一的)结合起来可能是另一种方法。这两种方法都提供了线性性能和无种族使用。

票数 2
EN

Stack Overflow用户

发布于 2013-12-14 00:15:28

您可以在php中创建唯一的数字。

代码语言:javascript
复制
<?php
   echo uniqid();
?>

但是你应该使用自动增量。如果您想知道保存插入项的编号,请使用如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-12-14 00:59:23

由于您没有使用AUTO_INCREMENT,建议(慢)选择所有有效的数字并随机选择1。

如果我们有1,2,3,5,7,我们允许的元素是..10,那么我们有5个允许的元素(4,6,8,9,10)。因此,我们兰特(1,5)。如果我们得到"1",下一个数字是4,如果我们得到"2",我们的下一个数字是6。为了更好地解释这个想法:

代码语言:javascript
复制
Rand(1,5)  Our array   Value(available)
           1
           2
           3
1          -           4
           5
2          -           6
           7
3                      8
4                      9
5                      10

代码示例:

代码语言:javascript
复制
$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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20578126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档