我正在研究一个网址缩短器,目前我面临着随机生成字符串的问题。我想做的事情是:
- 生成随机字符串 [ 已完成 ]
- 搜索数据库是否存在 [ 已完成 ]
- 如果它已经存在,则生成一个新的,然后再次继续检查[堆叠!
- 如果它是唯一的,请继续下一个过程
现在这是用于生成随机字符串的代码
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