【问题标题】:How to generate new random value if it already exists in the database?如果数据库中已经存在,如何生成新的随机值?
【发布时间】:2014-02-14 07:36:08
【问题描述】:

如果数据库中已经存在值,如何在文本框中自动生成新的随机值?

我尝试的一个例子:

<?php
$length = 1;
$randomString = substr(str_shuffle("123456789"), 0, $length);

$mysqli1 = new mysqli("localhost", "root", "", "k");

$sql = $mysqli1->query("SELECT catid FROM subcat WHERE catid = '$randomString'");
if(($sql->num_rows) > 0){
  echo "User id exists already.";
}
echo '<input name="id" value="'.$randomString.'">';
?>

【问题讨论】:

  • 你能解释一下你在这里做什么吗?你应该为每个条目生成一个新的 id 吗?
  • @jack 如果它已经是数据库中的值,我想在文本框中生成一个新代码。

标签: php jquery


【解决方案1】:

这样会更好,你可以试试这个

$randomString = md5(uniqid(rand(), true));

【讨论】:

  • 为什么选择md5()
【解决方案2】:

显然,您需要一个独特的价值

uniqid() 函数根据微时间(当前时间,以微秒为单位)生成唯一 ID。

echo uniqid();

编辑:OP 只需要 6 个字符。所以尝试类似

$id = uniqid();
$id = substr($id,rand(0,strlen($id) - 6),6);

【讨论】:

  • printf("uniqid(): %s\r\n", uniqid());echo uniqid();
  • 如何将字符限制为6个?
【解决方案3】:

使用这个strtotime('now')

来自 W3schools:strtotime 将英文文本日期时间解析为 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 以来的秒数 GMT)。

这将永远是唯一的。因此不需要任何检查。

万一两个用户同时来

附加一个随机字符串..例如:

$unique_id=strtotime('now')."".substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, 5);

【讨论】:

  • 为什么不只是time()
  • yus ...这也是一种选择
  • @Time_to_leave_earth 现在的作用是什么?
  • @user3097736:它会根据 Unix 时间戳为您提供当前时间
  • @Time_to_leave_earth 但是太长了。 time() 怎么样?
【解决方案4】:

可以用这个(Linux 示例)生成一个相当随机的字符串:

substr(sha1(openssl_random_pseudo_bytes(3)), 0, 6);

尽管如此,由于值域有限,可能会出现重复;以下算法通常有效:

  1. 生成标识符
  2. 使用生成的标识符插入记录;使用"INSERT IGNORE"
  3. 如果没有受影响的行,请转到 #1

【讨论】:

    【解决方案5】:

    再次生成它。

    <?php
    $length = 1;
    $randomString = substr(str_shuffle("123456789"), 0, $length);
    
    $mysqli1 = new mysqli("localhost", "root", "", "k");
    
    $sql = $mysqli1->query("SELECT catid FROM subcat WHERE catid = '$randomString'");
    if(($sql->num_rows) > 0){
        $randomString = substr(str_shuffle("123456789"), 0, $length);
    }
    echo '<input name="id" value="'.$randomString.'">';
    ?>
    

    或者在生成的字符串末尾加一个时间,让它更随机。

    像这样,你应该有一个更大的长度值。因为长度为 1,你不能有更多的随机数。

    substr(str_shuffle("123456789"), 0, $length).time();
    

    但仍然有重复的机会,除非你使用 md5 或其他东西做出更好的算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2015-07-11
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多