【问题标题】:PHP caches RAND() variable valuesPHP 缓存 RAND() 变量值
【发布时间】:2013-08-31 15:23:22
【问题描述】:

我在 index.php 文件中有以下代码:

include('db_connect.php'); //Here's the script that provides mysql connection to a database

$a = round(rand(1,100));
$b = round(rand(160,202));
$c = round(rand(50,110));
$d = round(rand(1,99999));

$sql = "INSERT INTO sInstance (p1,p2,p3,p4) VALUES ('".$a."','".$b."','".$c."','".$d."')";
$result = mysql_query($sql) or die(mysql_error());

显然,它随机生成值并将它们作为记录插入到MyISAM数据库表sInstance中。

问题:在生成和插入约 1000 条记录后,几乎不可能生成新记录(具有唯一值集)。每条新记录都是一些旧记录的克隆(具有相同的 p1-p2-p3-p4 值)。

问题:如何避免这种情况并让php生成唯一记录?

线索:这是 PHP 的服务器端问题,可能它以某种方式缓存了在 RAND() 函数的帮助下设置的值。问题不在于浏览器,也不在于mysql本身。

【问题讨论】:

  • 我建议每次都使用 mt_rand() 而不是 rand()
  • 这些数字需要有多独特?它们应该用于加密操作吗?

标签: php mysql caching random auto-generate


【解决方案1】:

不确定你是不是做错了什么,但是重置随机种子生成器就可以了:

http://php.net/manual/en/function.srand.php

【讨论】:

    【解决方案2】:

    改用 mt_rand()。

    http://php.net/manual/en/function.mt-rand.php

    如果这不起作用,您可以添加数据库架构吗?

    【讨论】:

      【解决方案3】:

      rand() 的种子是使用服务器上的当前时间戳进行的,因此当您快速生成随机值时,您可能会获得相同的种子来创建随机值。

      您确定它不会立即发生,并且仅在 1000 条左右的记录之后发生吗?

      您可以考虑使用更好的随机数生成器,例如 mt_rand()

      【讨论】:

      • 是的,它发生在大约 1000 条记录时。我也尝试过在一个循环中生成记录(for、while- 等),并且得到了相同的结果。我还尝试重置 PHP 缓存、MySQL 缓存并做了很多其他不相关的事情。 mt_rand 按我的意愿为我工作,谢谢。
      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 2015-04-15
      • 2011-09-16
      • 1970-01-01
      • 2014-01-20
      • 2011-10-09
      • 2014-03-24
      相关资源
      最近更新 更多