PHP检查数据库表,如果值存在,请运行循环以生成唯一值

时间:2018-09-07 19:19:14

标签: php mysql

我具有检查值是否存在的函数,在这种情况下,这是API密钥。我想要实现的是,在为每个帐户注册创建新的api密钥之前,我想循环我的函数以生成新密钥(如果数据库中已经存在)。密钥是使用以下命令生成的简单字符串:

$apiKey = bin2hex(random_bytes(16));

我的功能:

function apiCheckKey($apiKey) {
    global $conn;
    $sql = "SELECT * FROM `api` WHERE `key` = '".$apiKey."'";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result)) {
        return true;
    } else {
        return false;
    }
}

我的支票:

if(!apiCheckKey($apiKey)) {
     // loop
}

如何有效运行循环以生成新密钥并消除重复项?请记住,数据库将包含10万多个记录...

1 个答案:

答案 0 :(得分:1)

在执行此操作时,需要牢记以下几点:

  1. 确保此列具有UNIQUE约束,因此无法添加重复值。插入之前,您不能依靠SELECT COUNT(*) FROM x WHERE key=?测试,因为它很容易受到race conditions的攻击。<​​/ li>
  2. 生成一个足够随机的API密钥,以免发生冲突。一个> = 20个字符的随机字符串,使用所有字母(大写和小写)加上数字,将有704,423,425,546,998,022,968,330,264,616,370,176可能的形式,因此从天文学角度讲,碰撞不太可能发生。如果您的按键较短,则由于the pigeonhole principlebirthday paradox之类的影响,碰撞的可能性会更大。
  3. 在不太可能发生冲突的情况下,使您的代码生成新密钥并重试插入。 UNIQUE约束违反是您可以处理的非常具体的MySQL错误代码。如果error失败,请检查您的INSERT值,并进行相应调度。

通过生成几百万个密钥来测试代码,以确保其正常运行。