【问题标题】:php generate a string and check from mysql with not existphp生成一个字符串并从mysql检查不存在
【发布时间】:2012-05-08 16:14:46
【问题描述】:

我想生成一个字符串来发布一个 url。然后将post 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  
}

【问题讨论】:

  • 如何制作循环?严重地?你搜索了吗?无论如何,这是一个糟糕的方法 - 随着 URL 的消耗,它会变得越来越慢。除非您需要难以猜测的 URL,否则请使用自动增量 ID。
  • 我的建议是为您的列添加一个唯一键以真正防止重复。
  • 请停止使用古老的mysql_* 函数编写新代码。它们不再维护,社区已经开始deprecation process。相反,您应该了解准备好的语句并使用PDOMySQLi。如果你想学习,here is a quite good PDO-related tutorial.

标签: php mysql shuffle


【解决方案1】:

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

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

(不是实际代码)

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

此外,通过将列设为UNIQUE,确保没有输入重复项。

【讨论】:

  • 这可行,但可能会根据数据库中的记录数产生巨大的数组。
  • 由于您仍然需要将自己的价值与所有其他人进行比较,因此确实没有办法解决。此外,它胜过一遍又一遍地循环相同的查询。
【解决方案2】:

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

【讨论】:

  • 但是如果有人确实尝试输入一个副本,而不是尝试生成一个不同的副本,它会爆炸。
  • @Truth:同意。但是,在数据库层处理唯一约束可确保无论访问点如何都保持一致性。对于这个req,他将不得不发出选择或处理由于唯一约束失败而引发的错误。
【解决方案3】:

您可以使用 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  
    }
}

【讨论】:

  • 您应该避免循环查询,成本很高,尤其是在每次迭代都重新加载查询时。您至少应该将查询放在循环之前,然后循环查询结果。
  • 效率低下。一旦他达到数百/数千,将导致大幅减速。
猜你喜欢
  • 2015-11-07
  • 2016-04-04
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 2013-09-06
相关资源
最近更新 更多