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


PHP Random String verification from Database

我正在研究一个网址缩短器,目前我面临着随机生成字符串的问题。我想做的事情是:

  1. 生成随机字符串 [ 已完成 ]
  2. 搜索数据库是否存在 [ 已完成 ]
  3. 如果它已经存在,则生成一个新的,然后再次继续检查[堆叠!
  4. 如果它是唯一的,请继续下一个过程

现在这是用于生成随机字符串的代码

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

我现在能做什么?

使用 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

这样的 URL 对您的用户比以下更有意义:

http://www.mywebsiteaboutgorillas.com/jh7sj347dfj4

要制作"后蛞蝓":

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缩短器中处理类似的东西,以便至少为用户提供一些他们即将点击的内容的指示。

文档

  • while - http://us.php.net/manual/en/control-structures.while.php
  • mysqli - http://us.php.net/manual/en/book.mysqli.php
  • PDO - http://us.php.net/manual/en/book.pdo.php
  • uniqid - http://php.net/manual/en/function.uniqid.php