我具有检查值是否存在的函数,在这种情况下,这是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万多个记录...
答案 0 :(得分:1)
在执行此操作时,需要牢记以下几点:
UNIQUE
约束,因此无法添加重复值。插入之前,您不能依靠SELECT COUNT(*) FROM x WHERE key=?
测试,因为它很容易受到race conditions的攻击。</ li>
UNIQUE
约束违反是您可以处理的非常具体的MySQL错误代码。如果error
失败,请检查您的INSERT
值,并进行相应调度。通过生成几百万个密钥来测试代码,以确保其正常运行。