数据库中的PHP随机字符串验证

时间:2012-08-17 22:16:57

标签: php mysql

我正在开发一个url Shortener,目前我遇到了Random Generated String的问题。我想做的事情是:

  1. 生成随机字符串[已完成]
  2. 搜索数据库是否存在[已经完成]
  3. 如果已经存在,请生成一个新的并再次继续检查[Stacked!]
  4. 如果它的独特之处,那就是下一个过程
  5. 现在这是代码用于生成随机字符串

    function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {
    $str = '';
    $count = strlen($charset);
    while ($length--) {
        $str .= $charset[mt_rand(0, $count-1)];
    }
    return $str; }
    

    我现在能做什么?

1 个答案:

答案 0 :(得分:8)

使用while循环:

$random_string = randString(10);
$is_unique = false;

while (!$is_unique) {
    $result = query_the_database('SELECT id FROM table_with_random_strings WHERE random_string_column = "'.$random_string.'" LIMIT 1');
    if ($result === false)   // if you don't get a result, then you're good
        $is_unique = true;
    else                     // if you DO get a result, keep trying
        $random_string = randString(10);
}

我将数据库代码保留为通用,因为我不确定您使用的是什么......但我希望它是mysqli或PDO:)

还想提一下,有些函数会为您生成唯一的字符串,例如uniqid。这些函数在第一次生成一个唯一的字符串时可能会更成功,大部分时间都不需要while循环 - 这是一件好事。

echo uniqid(); // 502ec5b8ed2de

但是,你没有那么多的长度的控制权,如果这比你自己的自制随机发生器更重要 - 只是期望碰撞的可能性更大。

编辑另一件事:通常,许多内容发布系统会使用文章标题,而不是对用户毫无意义的随机字符串。这被称为(有时)“后塞”。如果你有一个标题为“11月17日:大猩猩去野外,裸照猿人活!”,网址将是:

http://www.mywebsiteaboutgorillas.com/november-17th-gorillas-gone-wild-topless-apes-live

这样的网址比您的用户更有意义:

http://www.mywebsiteaboutgorillas.com/jh7sj347dfj4

制作“post slug”:

function post_slug($url='', $sep='-') {
    // everything to lower and no spaces begin or end
    $url = strtolower(trim($url));

    // adding - for spaces and union characters
    $find = array(' ', '&', '\r\n', '\n', '+',',');
    $url = str_replace ($find, '-', $url);

    //delete and replace rest of special chars
    $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
    $repl = array('', '-', '');
    $url = preg_replace ($find, $repl, $url);

    if ($sep != '-')
        $url = str_replace('-', $sep, $url);

    //return the friendly url
    return $url; 
}

...你仍然需要注意那里的唯一性,有时CMS会将日期或id附加为伪子目录,以帮助减轻重复。您可以将这样的工作添加到您的URL缩短器中,以便为用户提供至少一些他们将要点击的内容的指示。

<强>文档

相关问题