使用 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
但是,您对length没有太多的控制权,如果这比您坚持使用自制随机生成器更重要 - 只是期望发生冲突的可能性更大。
编辑另一件事:通常,许多内容发布系统将使用文章标题,而不是对您的用户无意义的随机字符串。这被称为(有时)“post slug”。如果您的标题为“11 月 17 日:大猩猩狂野,裸照猿直播!”,则网址为:
http://www.mywebsiteaboutgorillas.com/november-17th-gorillas-gone-wild-topless-apes-live
这样的 URL 对您的用户的意义比:
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 缩短器中使用类似的功能,以至少让用户知道他们将要点击什么。
文档