2011-09-14 9 views
0

私はwhile()ループを使用してランダムなファイル名を作成し、それをデータベースと照合して、それがすでに存在する場合はループします。私は少し前にこれをやったことがあるので、私の文法/使用法はちょっと心配です。それ以来、このようにループはwhile()を使っていません。while()を使用してランダムなファイル名を生成していますか?

は、ここに私のコードです:

$i = 0; 
while(++$i) { 
    $file_name = md5(mt_rand(0,9999999)) . ".php"; 
    $result = mysql_query("SELECT * FROM x WHERE file_name = '{$file_name}'"); 

    if(mysql_num_rows($result) == 0) { break; } else { continue;} 
} 

うこの作品、とされていない場合、それと間違って何ですか?

私が知っているのはちょっとした質問ですが、これがうまくいくかどうかをテストするのは、新しいテーブルを作成し、ファイル名を変更して1から3のものを選択し、メッセージを表示する代わりに、継続のなど常に、理解されるように

すべてのヘルプ、これは動作しますが、あなたが行を変更することができ

+0

フォルダ内に一意の名前を持つファイルを作成するPHP関数が組み込まれています: 'tempnam()' http://php.net/manual/en/function.tempnam.php – Paulpro

+0

このコード**は、テーブル内に同じファイル名を2つ持つことから保護していません。同じランダムファイル名が同時に実行されるスクリプトで2回生成されるためです。 – zerkms

+0

ああ。 'tempnam()'のデフォルトのファイル拡張子は.phpですか、それとも何らかの形で.phpを追加する必要がありますか? – Avicinnian

答えて

4

あなたの中に(++ $ I) $iは必要ありません。あなたはそれを使用していないので、ループにはcontinueは必要ありません。ループは自動的にループしますそれは何ですか。あなたがが少し壊れた方法でハッシュを使用している

while(true) { 
    $file_name = md5(mt_rand(0,9999999)) . ".php"; 
    $result = mysql_query("SELECT * FROM x WHERE file_name = '{$file_name}'"); 

    if (mysql_num_rows($result) == 0) break; 
} 

:あなたがループを終了するための条件に達した場合にのみ、breakする必要があります。 MD5ハッシュよりもランダムな文字列より長く生成する必要があります。短くはありません。現在MD5が作成できる完全な2^128の代わりに、10,000,000の可能なファイル名(0..99999999)しかありません。宇宙空間でのハッシュ衝突を心配するのではなく、同じ数字を2回生成するだけで、データベースへの複数回のトリップが発生する可能性は非常に高くなります。

+0

ブリリアント!タイマーが下がったときに私はあなたの答えを受け入れるでしょう。あなたの例のように、結果を{}で囲まずに 'if()'ステートメントを実行している人がいることがよくありますが、2つの違いを許すルールを説明できますか? – Avicinnian

+0

'if' /' else'/'while'はすべて「ブロック」を受け入れます。ブロックは、 'break;'のような単一の文、または中括弧で囲まれた文の集合です。複数のステートメントがある場合は、 'if' /' while'/controlの流れ構造の中身を中括弧で囲んで*書くだけです。 – meagar

+0

クール感謝!私はすぐにMD5ハッシュを拡張するために私が作ることができる追加を知っていますか?私はちょうど(フォーマットに関係なく)ランダムなファイル名を作ろうとしていますが、何かを正しく使う方法を知っておくと良いです。 – Avicinnian

1

:!しばらく(真)

2

私はそれが些細な質問だと知っていますが、これがうまくいくかどうかをテストすることは、より多くの「タスク」(新しいテーブルを作成する必要がある、ファイル名を変更して1〜続行などの代わりにメッセージを表示する

コードが実行するアプローチを取ることは、必要以上に「タスク」です。実行可能ですが、データベースに「ユニークなファイルIDの作成」作業をさせてみましょう?

xのfile_name列を代わりにbigint(20) auto_incrementなどのfile_id列に定義します。次に、PHPコードで、新しい行を作成するクエリを発行し、保証された一意の数値IDを取得し、ファイル名に変換します。

+0

アイデアをありがとうが、http://stackoverflow.com/questions/7398152/seamlessly-adding-1-to-the-previous-row-valueによると、2つの列が 'AUTO_INCREMENT'であるテーブルを持つことは不可能です。私は別の列に 'AUTO_INCREMENT'機能を必要とします:(。 – Avicinnian

+0

既存の' AUTO_INCREMENT'カラムの値を使用しますか?それは当初意図したものではないにしても目的に合わないのですか? –

関連する問題