如果数据库

时间:2018-03-28 05:08:07

标签: php

这是我的代码

$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();
             }

这里我的意图是插入唯一值而不是重复值。在插入之前我正在检查数据库是否已存在此随机数(如果存在)我必须再次生成新值我必须生成值并匹配(如果不存在)则执行插入查询。谁能帮我。

2 个答案:

答案 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';
}

请记住这是演示。我建议您使用mysqlipdo,因为mysql <{1}}无效{/ 1}}