这是我的代码
$lclReferCode = rand(100000,999999);
function random(){
$lclReferCode1 = rand(100000,999999);
return $lclReferCode1;
}
$lclReferCode = random();
$lclQuery = "SELECT * FROM `sign_up` WHERE us_refer_code = '$lclReferCode'";
$qryResult = mysql_query($lclQuery);
if(mysql_num_rows($qryResult) == 0){
$lclQuery = "INSERT INTO sign_up(us_refer_code) values('" . $lclReferCode . "')";
$qryResult = mysql_query($lclQuery);
}else{
random();
}
这里我的意图是插入唯一值而不是重复值。在插入之前我正在检查数据库是否已存在此随机数(如果存在)我必须再次生成新值我必须生成值并匹配(如果不存在)则执行插入查询。谁能帮我。
答案 0 :(得分:0)
像这样(未经测试):
function setRandom(\PDO $PDO){
$stmt = $PDO->prepare("SELECT * FROM `sign_up` WHERE us_refer_code = :us_refer_code");
try{
$stmt->execute([':us_refer_code' => rand(100000,999999)]);
}catch(\PDOException $e){
if($e->getCode() == 23000){ //if I recall right this is duplicate key
setRandom($PDO); //<-- recursive.
}else{
//if not duplicate key re-throw the error.
throw new \PDOException($e->getMessage(), $e->getCode(), $e);
}
}
}
但是你必须使用PDO,将错误模式设置为exception,并将数据库字段定义为唯一索引。
建立递归限制可能不是一个坏主意,因为你可能会遇到它从未找到未在DB中输入的值的情况。这看起来像这样。
function setRandom(\PDO $PDO, $limit=0){
if($limit > 1000) throw new \Exception(__FUNCTION__.' recursion limit exceeded');
$stmt = $PDO->prepare("SELECT * FROM `sign_up` WHERE us_refer_code = :us_refer_code");
try{
$stmt->execute([':us_refer_code' => rand(100000,999999)]);
}catch(\PDOException $e){
if($e->getCode() == 23000){ //if I recall right this is duplicate key
setRandom($PDO, ++$limit);//<-- recursive
}else{
//if not duplicate key re-throw the error.
throw new \PDOException($e->getMessage(), $e->getCode(), $e);
}
}
}
这会在抛出异常之前给它1000次尝试。拥有真正有可能创建无限递归的代码永远不会有好处。
在我的网站上,我有一个错误处理程序,如果我有任何未被捕获的例外,它会向我发送电子邮件。所以我马上就知道了。粗略的,这是可选的,其中一些与您的特定用例紧密相关。
否则你必须在while循环中使用select。像这样(也未经测试)。
/**
* return false or the random value to use.
* @return false|int
*/
function ckRandom($lclReferCode){
$lclReferCode = rand(100000,999999);
$lclQuery = "SELECT * FROM `sign_up` WHERE us_refer_code = '$lclReferCode'";
$qryResult = mysql_query($lclQuery);
if(mysql_num_rows($qryResult) == 0){
//no result means the number is not used yet.
return $lclReferCode;
}else{
return false;
}
}
//$limit = 0;
$lclReferCode = false;
while( false === $lclReferCode){
$lclReferCode = ckRandom();
//if($limt > 1000) throw new \Exception(' recursion limit exceeded');
//++$limit;
}
//if $lclReferCode IS NOT false then it is the last random number searched that had no results in the DB
$lclQuery = "INSERT INTO sign_up(us_refer_code) values('" . $lclReferCode . "')";
看到这个想法是while循环将陷阱执行,直到结果返回0以外的其他东西,如果它是0然后没有行存在。 (你有这个倒退)。
同样,这很容易发生无限递归。我添加了&#34;限制&#34;评论中的东西。
那就是说,我强烈建议取消任何mysql_
函数,因为它们在PHP7后不会起作用。
答案 1 :(得分:0)
你需要尝试这样
function random(){
$lclReferCode = rand(100000,999999);
$lclQuery = "SELECT * FROM `sign_up` WHERE us_refer_code = '$lclReferCode'";
$qryResult = mysql_query($lclQuery);
$checkRow=mysql_num_rows($qryResult);
if ($checkRow>0) {
return random();
}else{
$lclQuery = "INSERT INTO sign_up(us_refer_code) values('" . $lclReferCode . "')";
$qryResult = mysql_query($lclQuery);
return true;
}
}
if (random()===true) {
echo 'inserted succesfully';
}
请记住这是演示。我建议您使用mysqli
或pdo
,因为mysql
<{1}}无效{/ 1}}