2011-08-01 12 views
0

かなりシンプルですが、私はまだ実際のストレートで適切な解決策を見つけることができませんでした。データベースに対して作成された文字列をチェックし、見つかった場合は新しい文字列を作成しますか?

私は現在、2つのdechex()関数で結果をラップし、それらを1つの文字列に連結して、2つのmt_rand()関数を1から最大整数に実行することによって、ランダムな文字列を作成します。

私はそれに関する統計を行っていませんが、これらの文字列のうちの2つの可能性はかなり低いです。

しかし、私は明らかにデータベースに対してクエリを実行し、それがエントリとして存在するかどうかを確認したい場合はバックアップソリューションが必要になります。ランダムな文字列、クエリを再度実行し、存在しない文字列が見つかるまでループします。

私は多量のフォーラムスレッドといくつかの質問をしましたが、簡潔な答えはまだ見つかりませんでした。

ご協力いただきありがとうございます、ありがとうございます!

+0

だからあなたの実際の質問は何ですか? – dkamins

+0

それはどのように行うべきかのようです。移動して実装します(データベースに対してクエリを行う場合は、UNIQUEキーを設定します)。 – Wrikken

+0

MySQLデータベースに値を問い合わせる方法はありますか?その値が特定のテーブル内のどこにあっても、新しいランダムな文字列を作成してデータベースに照会するループを作成するには、つまり、データベースに値として存在しません)。 – Fireworksable

答えて

0

再帰関数が必要です。何かが好き:

function makeString() { 

    // Create our random string 
    $string = ""; 
    $characters = array('a', 'b', 'c', 'd'); 

    for ($i = 0; $i < 4; $i++) { 

     $string .= $characters[mt_rand(0, 4)]; 
    } 

    $query = "SELECT COUNT(*) 
    FROM myTable 
    WHERE string = '{$string}'"; 

    $result = mysql_query($query); 
    $row = mysql_fetch_assoc($result); 

    if ($row['COUNT(*)'] > 0) { // if it already exists, do it again 

     $string = makeString(); 
    } 

    return $string; 
} 
+0

再帰関数の中で選択範囲を実行するのは悪い習慣です – afuzzyllama

+0

@afuzzyllama注目。 –

0

これが最もエレガントなソリューションではありませんが、それは動作します:queryForUnique($string)は、SELECTステートメントのラッパーです

$result = queryForUnique(); 

$unique_string = your_described_function(); 
$how_many_times = 0; 
while(in_array($unique_string, $result) !== false){ 
    if($how_many_times > 10){ 
     throw new Exception("Failed to find a unique string! Aborting!"); 
    } 

    $unique_string = your_described_function(); 
    $how_many_times++; 
} 

編集


は外のクエリを取りましたループでSELECTクエリを使用するのは悪い習慣です。


はあなたの制御構造を確認することをお勧めします:
http://php.net/manual/en/language.control-structures.php

1
$int_affected = 0; 
while(!$int_affected) { 
    /* Set $integer */ 
    mysql_query("INSERT IGNORE INTO table (value) VALUES ({$integer})"); 

    $int_affected = mysql_affected_rows(); 
} 

これは、あなたが探しているものですか?

関連する問題