1

我想生成一个字符串来发布一个 url。然后将帖子网址设为:http://www.mydomain.com/post/afCeYk,并将此网址存储在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  
}
4

3 回答 3

2

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

与一遍又一遍地查询数据库相反,这具有性能优势。

(不是实际代码)

$url_list = query("SELECT `post_url` FROM `table`");
do {
    $random_string = generate_random_string();
}
while(!in_array($random_string, $url_list));

此外,通过创建列确保没有重复输入UNIQUE

于 2012-04-27T22:45:05.077 回答
1

您可以使用 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  
    }
}
于 2012-04-27T22:31:13.107 回答
1

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

于 2012-04-27T22:32:39.850 回答