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日:Gorillas Gone Wild、Topless Apes Live!」というタイトルの場合、URLは次のようになります。
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短縮サービスに組み込んで、ユーザーがクリックしようとしているものを少なくともある程度示すことができる場合があります。
ドキュメンテーション