php生成一个字符串并从mysql检查是否不存在

php生成一个字符串并从mysql检查是否不存在,php,mysql,shuffle,Php,Mysql,Shuffle,我想生成一个字符串来发布url。然后将帖子url设置为:http://www.mydomain.com/post/afCeYk,并将此url存储在mysql中。为了避免重复url,我认为首先应该检查mysql是否已经存在url。在我的代码中,我只检查了一次,我不能确保第二个生成字符串不存在。那么我如何做一个循环呢 $shufstr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; $rdstr = substr(str_shuff

我想生成一个字符串来发布url。然后将帖子url设置为:
http://www.mydomain.com/post/afCeYk
,并将此url存储在mysql中。为了避免重复
url
,我认为首先应该检查mysql是否已经存在
url
。在我的代码中,我只检查了一次,我不能确保第二个生成字符串不存在。那么我如何做一个循环呢

$shufstr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$rdstr = substr(str_shuffle($shufstr),0,6);
$query =  mysql_query("select * from table where post_url = '".$rdstr."'");
if(mysql_num_rows($query)>0){
    //insert the url rules into db  
}else{
    //generate a new string and check the db again  
}

您可以使用while循环,但在保存了几千个URL后,它会变得非常缓慢:

$shufstr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$validString=false;
while(!$validString){
    $rdstr = substr(str_shuffle($shufstr),0,6);
    $query =  mysql_query("select * from table where post_url = '".$rdstr."'");
    if(mysql_num_rows($query)==0){ //This is also different from your code as you don't want to do the insert if there is 1+ row with that url. 
        $validString=true;
        //insert the url rules into db  
    }
}

您可以使用while循环,但在保存了几千个URL后,它会变得非常缓慢:

$shufstr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$validString=false;
while(!$validString){
    $rdstr = substr(str_shuffle($shufstr),0,6);
    $query =  mysql_query("select * from table where post_url = '".$rdstr."'");
    if(mysql_num_rows($query)==0){ //This is also different from your code as you don't want to do the insert if there is 1+ row with that url. 
        $validString=true;
        //insert the url rules into db  
    }
}

如果它是我的项目,我会在post_url列本身添加一个
UNIQUE
约束,这将确保不会从任何输入点(应用程序、命令行等)输入重复项。更多信息。

如果是我的项目,我会在post_url列本身添加一个
唯一的
约束,这将确保不会从任何入口(应用程序、命令行等)输入重复项。有关的详细信息。

您应该查询数据库一次,以收集表中的所有数据,然后生成一个字符串,并根据获得的数组进行检查

与反复查询数据库不同,这有一个性能优势

(非实际代码)


此外,通过使列

确保没有输入重复项。您应该查询数据库一次,以收集表中的所有数据,然后生成字符串并根据获得的数组进行检查

与反复查询数据库不同,这有一个性能优势

(非实际代码)



此外,通过设置列

如何进行循环,确保没有输入重复项?认真地你找过了吗?无论如何,这是一个糟糕的方法-它会变得越来越慢,因为URL被消费。除非您需要难以猜测URL,否则请使用自动增量ID。我的建议是为您的列添加一个唯一的键,以真正防止重复。请停止使用古老的
mysql.*
函数编写新代码。它们不再得到维护,社区已开始恢复。相反,您应该学习准备好的语句,并使用或。如果你想学的话,如何做一个循环?认真地你找过了吗?无论如何,这是一个糟糕的方法-它会变得越来越慢,因为URL被消费。除非您需要难以猜测URL,否则请使用自动增量ID。我的建议是为您的列添加一个唯一的键,以真正防止重复。请停止使用古老的
mysql.*
函数编写新代码。它们不再得到维护,社区已开始恢复。相反,您应该学习准备好的语句,并使用或。如果你想学习,。你应该避免循环查询,成本很高,尤其是每次迭代都要重新加载查询时。您至少应该将查询放在循环之前,然后循环查询结果。一旦他达到成百上千,就会造成巨大的减速。你应该避免循环查询,成本很高,尤其是每次迭代都要重新加载查询时。您至少应该将查询放在循环之前,然后循环查询结果。一旦他达到成百上千,就会造成巨大的减速。但如果有人试图输入一个副本,而不是试图生成一个不同的副本,它就会爆炸。@Truth:同意。但是,在数据库层处理唯一约束可以确保一致性,无论访问点是什么。对于此req,他必须发出select或handle命令,以处理由于唯一约束失败而引发的错误。但如果有人尝试输入一个副本,而不是尝试生成另一个副本,则该命令将失败。@Truth:同意。但是,在数据库层处理唯一约束可以确保一致性,无论访问点是什么。对于此req,他将不得不发出select或handle命令,以处理由于唯一约束失败而引发的错误。这将起作用,但可能会根据数据库中的记录数产生一个巨大的数组。由于您仍然需要将您的值与所有其他值进行比较,因此确实没有办法解决此问题。此外,它还胜过反复循环同一个查询。这会起作用,但根据数据库中记录的数量,可能会产生一个巨大的数组。因为您仍然需要将您的值与所有其他值进行比较,所以真的没有办法。此外,它胜过反复循环相同的查询。