我正在尝试对MySQL数据库进行PHP函数检查,如果之前已经随机创建的值存在,如果它确实存在,那么它将重复,直到它产生一个不存在的值。
目前,我已经悲惨地失败了,虽然我认为我的方法可行,但事实并非如此。
PHP
我在脚本中自己尝试了这个,然后意识到php函数不会运行,除非它们被调用。
conn(); //db connection
function genID() {
$newIDref = uuaig(10);
$queryCHECK = "SELECT *
FROM contentArticle_vids
WHERE videoArticle_id = '$newIDref'
";
$resultCHECK = mysql_query($queryCHECK);
$numrows = mysql_num_rows($resultCHECK);
if ($numrows !== 0) {
genID();
die();
}
}
所以..然后我尝试了这个,然后让它真的不开心(打破了整个页面)。
conn(); //db connection
genID();
function genID() {
$newIDref = uuaig(10);
$queryCHECK = "SELECT *
FROM contentArticle_vids
WHERE videoArticle_id = '$newIDref'
";
$resultCHECK = mysql_query($queryCHECK);
$numrows = mysql_num_rows($resultCHECK);
if ($numrows !== 0) {
genID();
die();
}
if ($numrows === 0) {
return $newIDref;
die();
}
}
作为参考,随机字符串生成器是uuaig(10)
。
我最终需要生成随机字符串,然后在数据库中确认该字符串不存在时返回。
我如何进行?
答案 0 :(得分:2)
为什么要选择?只需在videoArticle_id上添加一个唯一索引即可。然后,当您尝试生成并插入新ID时,只需处理插入失败并使用新ID重试。
如果你有一个用于生成id的代码方案并且期望很少的id冲突,那么这将更有效。
所以你的功能可能如下:
function genID() {
$idSuccess = false;
$max_retries = 3;
$i = 1;
while (false === $idSuccess && $i <= $max_retries) {
$newIDref = uuaig(10);
$queryCHECK = "INSERT INTO contentArticle_vids (`videoArticle_id`)
VALUES ('$newIDref')";
$idSuccess = mysql_query($queryCHECK);
$i++;
}
if(false === $idSuccess) {
error_log('Could not generate ID in genID()');
return false;
}
return $newIDref;
}
注意我添加了最大重试限制,因此您没有无限循环可能性。另请注意,这将继续保留数据库表中新的唯一ID的位置。
最后,基本上我必须注意您使用的是已弃用的mysql
扩展程序。你真的不应该使用这个扩展来编写新的代码。
答案 1 :(得分:0)
经过一些修修补补后,我设法找到了达到理想结果的正确方法。
//genID();
function genID($newIDref) {
$status = false;
$i=0;
while ($status === false) {
$newIDref = uuaig(10);
$queryCHECK = "SELECT *
FROM contentArticle_vids
WHERE videoArticle_id = '$newIDref'
";
$resultCHECK = mysql_query($queryCHECK);
$numrows = mysql_num_rows($resultCHECK);
if ($numrows === 0) {
$status = true;
return $newIDref;
}
$i++;
// testing
/*
if ($i > 5) {
echo 'fin';
die();
}
*/
// testing
}
}
$newIDref = genID($newIDref);