如何检查随机创建的号码是否已存在

时间:2018-08-22 12:43:07

标签: php mysql random

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

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

这是我当前的代码:

    @GetMapping(value = "/test")
    public ResponseEntity<String> testRest(){
        return ResponseEntity.ok("Yay");
    }

即使该代码已经存在,它似乎仍会使用该唯一编号。 (我对一些测试编号进行了硬编码)。

如果数字已经存在,我不想使用它。

1 个答案:

答案 0 :(得分:0)

与其从表中获取每一行并将其与新的“唯一引用”进行比较,而无需在查询中添加一个包含新唯一性的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;

?>