【问题标题】:How to check if random created number already exist如何检查随机创建的数字是否已经存在
【发布时间】:2018-08-22 12:43:06
【问题描述】:

我正在使用 php 创建一个唯一的参考号。

我想检查该号码是否已存在于数据库中。

这是我当前的代码:

<?php

function generateRandomString($length = 3) {
    $characters = 'ABCDEFGHJKLMNOPQRSTVWXYZ';//No "I"
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

$var = generateRandomString();


$random = rand(1000, 9999);
$randoms = rand(1000, 9999);

$tokennr = "I$var-$random" . "0" . $randoms;


require_once('connect_pdo.php');
header('Content-Type: text/html; charset=utf-8');
$stmt = $conn->prepare("SELECT UniqueNumber FROM `MyTable` ");
$stmt->execute();

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
   $uniqueref = $row["UniqueNumber"];
}
if($tokennr == $uniqueref){
     $tokennrs = "I$var-14$random" . "6" . $randoms;
     $token = $tokennrs;
}else{
    $token = $tokennr;
}
echo $token;

?>

似乎代码仍然使用唯一编号,即使它已经存在。 (我硬编码了一些测试数字)。

我不想使用已经存在的数字。

【问题讨论】:

  • 触发另一个检查号码的语句
  • 您的查询列不匹配。为什么不只查询那个数字,而不是查询所有数字并循环遍历它们?
  • 这就是我在if语句中所做的
  • 您似乎在 while 循环中覆盖了 $uniqueref 。因此,在您的 if 语句中,您只检查您的 $tokennr 是否等于您获取的最后一个唯一令牌。如果它与之前的任何一个匹配,它仍然可以通过检查。
  • 感谢@DirkScholten。我如何解决它?我对编程还是很陌生

标签: php mysql random


【解决方案1】:

与其从表中获取每一行并将其与新的“唯一引用”进行比较,不如在包含新唯一引用的查询中添加一个 where 子句,这样您就不必遍历可能的 1000 行来查看它是否是重复的.

希望此列将在数据库中编入索引,这样也很快。

<?php

function generateRandomString($length = 3) {
    $characters = 'ABCDEFGHJKLMNOPQRSTVWXYZ';//No "I"
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}


require_once('connect_pdo.php');
header('Content-Type: text/html; charset=utf-8');

// prepare staement outside the loop it only has to be done once
$stmt = $conn->prepare("SELECT COUNT(UniqueNumber) as cnt 
                        FROM `MyTable` 
                        WHERE UniqueNumber = :uniq");

// automate the dup fiddle byte
$fiddlebyte = 0;

$var = generateRandomString();
$random = rand(1000, 9999);
$randoms = rand(1000, 9999);
$token = "I$var-$random" . $fiddlebyte . $randoms;

// may get more than one dup so loop until no dup
while ( true ) {

    $stmt->execute([':uniq'=> $token]);

    $cnt = $stmt->fetchColumn();

    if ( $cnt == 0 ) { 
        continue;    // stop the while loop its unique
    } 
    $fiddlebyte++;
    $token = "I$var-$random" . $fiddlebyte . $randoms;
}
echo $token;

?>

【讨论】:

  • 更好:只需创建 256 个随机位的唯一 ID,这样您就不必费心检查重复项了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多