1

私はURL短縮サービスに取り組んでいますが、現在、ランダムに生成された文字列の問題に直面しています。私がやりたいことは:

  1. ランダムな文字列を生成する[すでに完了]
  2. データベースの検索データベースが存在するかどうか[すでに完了]
  3. すでに存在する場合は、新しいものを生成し、[Stacked!]のチェックに進みます。
  4. そのユニークな場合は、次のプロセスに進みます

これがランダム文字列の生成に使用されるコードです

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

私は今何ができますか?

4

1 に答える 1

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);
}

何を使用しているのかわからないので、データベースコードを汎用のままにしました...しかし、それがmysqliPDOであるといいのですが:)

また、言及したいのですが、たとえば、独自の文字列を生成する関数があります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短縮サービスに組み込んで、ユーザーがクリックしようとしているものを少なくともある程度示すことができる場合があります。

ドキュメンテーション

于 2012-08-17T22:22:12.727 に答える