2012-04-27 30 views
1

我想生成一个字符串发布一个URL。然后使这个帖子的网址如下:http://www.mydomain.com/post/afCeYk,并将此网址存储在mysql中。为了避免重复url,我认为首先应该检查mysql是否url已经存在。在我的代码中,我只检查一次,我无法确保第二个生成字符串尚未存在。那么我该如何做一个循环?PHP生成一个字符串,并从MySQL检查不存在

$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 
} 
+0

如何制作一个循环?真的吗?你有没有搜索?无论如何,这是一个糟糕的应用程序 - 随着URL的消耗,它会变得越来越慢。除非您需要难以猜测的网址,否则请使用自动增量ID。 – 2012-04-27 22:30:05

+1

我的建议是在列中添加一个唯一的键,以防止重复。 – 2012-04-27 22:30:26

+1

请停止使用古老的'mysql_ *'函数编写新代码。他们不再被维护,社区已经开始[弃用流程](http://news.php.net/php.internals/53799)。相反,您应该了解准备好的语句并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/mysqli)。如果你关心学习,[这里是一个很好的PDO相关教程](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers)。 – 2012-04-27 22:42:44

回答

1

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

与反复查询数据库相反,这具有性能优势。

(而不是实际的代码)

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

此外,请确保没有重复的是通过使列UNIQUE输入。

+0

这会工作,但可能会导致一个巨大的数组取决于数据库中的记录数。 – 2012-04-27 22:53:45

+0

由于您仍然需要将您的价值与其他所有人进行比较,因此实际上没有办法解决这个问题。此外,它反复循环遍历相同的查询。 – 2012-04-27 22:56:39

1

您可以使用while循环,但你必须保存几千年的网址后,它会变得非常慢:

$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 
    } 
} 
+0

您应该避免循环查询,尤其是当您每次迭代都有查询重新加载时,成本很高。您至少应该在循环之前放置查询,然后循环查询结果。 – 2012-04-27 22:33:05

+0

效率低下。一旦他达到成百上千,会导致大规模的放缓。 – 2012-04-27 22:46:44

1

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

+0

但是如果有人试图输入一个副本,而不是试图产生一个副本,它会炸毁。 – 2012-04-27 22:45:49

+0

@Truth:同意。但是,在数据库层处理唯一的约束,无论访问点如何,都能确保一致性。对于这个请求,他必须发出select或处理由于唯一约束失败而引发的错误。 – 2012-04-27 22:50:42