【问题标题】:While Loop when checking if record exists - PHP检查记录是否存在时循环 - PHP
【发布时间】:2015-03-31 20:33:38
【问题描述】:

我需要生成一个随机数。生成数字后,我需要检查我的表以查看之前是否生成过该数字。如果随机数不是唯一的,我会重新生成这个数字,直到生成一个唯一的数字。

这是我的代码:

$con=mysqli_connect($host,$user,$pass,$database);

$random = rand(1000, 9999);

$result = mysqli_query($con,"SELECT * FROM tablex WHERE randomnumber = '.$random .'");

$num_rows = mysqli_stmt_num_rows ($result);

while ($num_rows > 0) {

$random = rand(1000, 9999);
$num_rows = mysql_num_rows($result);
 }

$random = rand(1000, 9999);

我需要知道这个算法是否正确——尤其是。 while 循环。或者还有其他更有效的方法吗?

【问题讨论】:

  • 你这样做有什么理由吗?您可以使用主键获取给定行的唯一标识符。
  • 您是否考虑过当您获得超过 8999 个条目时会发生什么(当您接近该值时,while 循环将运行越来越长的时间)?如果您需要一个值来确认电子邮件地址,则不必将唯一值作为代码(就像标识符一样) - 它应该有超过 8999 个可能的值。
  • 如何使用主键生成唯一的 4 位密钥?是通过 PHPMyAdmin 吗?
  • 作为旁注,您应该查看mt_rand() php.net/manual/en/function.mt-rand.php
  • @CodyRaspien - 主键通常已经是唯一的数字了。

标签: php mysql random mysqli while-loop


【解决方案1】:

我清理了你的代码,修复了大部分问题(但请注意,在 8999 次调用后,它仍会无限循环)。

$con=mysqli_connect($host,$user,$pass,$database);
do {
$random = mt_rand(1000,9999);
$result = $con->query("SELECT * FROM tablex WHERE email = '.$random .'");
$num_rows = $result->num_rows;
} while ($num_rows > 0);

【讨论】:

  • @CodyRaspien 您的令牌可以有多长(以及什么字符集)?它的目的是什么?
  • 如果我移动 $result = mysqli_query($con,"SELECT * FROM tablex WHERE email = '.$random .'");进入循环,如果找到数字会打破循环吗?
  • 4 位长。这是一个优惠券系统。
  • 1.是的,它会。但是你需要把它放在正确的位置。 2. 因为之后你的 while 循环将是一个无限循环(它不会再找到任何空闲数字,只是继续无限地生成和测试它们,从而消耗你所有的 CPU 和数据库资源)
  • @Aragorn0 更新后的答案运行起来会很昂贵。生成随机数然后检查它是否存在的最佳方法是什么 - 如果存在,则重新生成,否则,使用随机数?
【解决方案2】:

如果您在所选日期列出启用的随机数会更好,例如您在每个脚本执行日期生成随机循环

$con=mysqli_connect($host,$user,$pass,$database);
$randomnumbers = [];
$query = "SELECT randomnumber FROM tablex WHERE (DATE(tablex.randomdate) = DATE(NOW()))";
$result = mysqli_query($con, $query);
while ($row = mysqli_fetch_assoc($result)) {
 $randomnumbers[] = $row['randomnumber'];
}
do {
 $random = mt_rand(1000, 9999);
} while (in_array($random, $randomnumbers));

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2011-02-20
    • 2015-01-21
    • 2012-08-13
    • 2015-01-02
    相关资源
    最近更新 更多