3

基本的に、データベースに約5000個のランダムな数値を挿入するSQLクエリを作成することにしました$i(現在はそれを理解するために10個)。

以前はMYSQLだけでそれをやろうとしましたが、失敗し、そこでもう時間を無駄にしたくありません。

10桁の数値をランダム化し、その数値を$codes、データベース内のさまざまなテーブルからの100,000を超える値を含む配列()と照合します。また、新しい乱数を新しい配列($newNumbers)に追加して、同じ新しい番号を作成しないようにします。次に、その番号をINSERTクエリに追加します。また、2番目の番号を作成するためのネストされたwhileループもあります。これも完全に一意である必要があります。

それが理にかなっていることを願っています..とにかく、問題はネストされたループ内にあるようですが、それは無限ループのようです(そして増加しないようです$i)が、理由を理解することはできません。

$query = "INSERT INTO 'table' ('num_id', `num1`, `num2`) VALUES";

$i = 0;
while ($i <= 10){

    $rand = mt_rand(1000000000, 9999999999);
    if (!in_array($rand, $codes) && !in_array($rand2, $newNumbers) ){
        $newNumbers[] = $rand;

        $second = 0;
        while ($second == 0){
            $rand2 = mt_rand(1000000000, 9999999999);
            if (!in_array($rand2, $codes) && !in_array($rand2, $newNumbers) ){
                $query .= " ('', $rand, $rand2)";
                $newNumbers[] = $rand2;
                $second = 1;

                $i++;
            }else
                $duplicates ++;
        }//end second loop



    }else
        $duplicates ++;
}//while
4

4 に答える 4

2
$query = "INSERT INTO 'table' ('num_id', `num1`, `num2`) VALUES";

$i = 0;
while ($i <= 10){

    $rand = mt_rand(1000000000, 9999999999);
    if (!in_array($rand, $codes) && !in_array($rand2, $newNumbers) ){
        $newNumbers[] = $rand;

        $second = 0;
        while ($second == 0){
            $rand2 = mt_rand(1000000000, 9999999999);
            if (!in_array($rand2, $codes) && !in_array($rand2, $newNumbers) ){
                $query .= " ('', $rand, $rand2)";//missing quotes
                $newNumbers[] = $rand2;
                $second = 1;

                $i++;
            }else
                $duplicates ++;
        }//end second loop



    }else
        $duplicates ++;
}//while
于 2013-01-17T11:40:43.287 に答える
1
$query .= " ('', $rand, $rand2")"; 

見積もりを確認してください

于 2013-01-17T11:40:50.937 に答える
0

あなたの行には無関係な"性格があります$query .= " ('', $rand, $rand2")";。次のようにコードを修正する必要があります。

$query = "INSERT INTO 'table' ('num_id', `num1`, `num2`) VALUES";

$i = 0;
while ($i <= 10){

    $rand = mt_rand(1000000000, 9999999999);
    if (!in_array($rand, $codes) && !in_array($rand2, $newNumbers) ){
        $newNumbers[] = $rand;

        $second = 0;
        while ($second == 0){
            $rand2 = mt_rand(1000000000, 9999999999);
            if (!in_array($rand2, $codes) && !in_array($rand2, $newNumbers) ){
                $query .= " ('', $rand, $rand2)";
                $newNumbers[] = $rand2;
                $second = 1;

                $i++;
            }else
                $duplicates ++;
        }//end second loop



    }else
        $duplicates ++;
}//while
于 2013-01-17T11:41:32.897 に答える
0

したがって、最初の IF ステートメント$rand2の配列にないことを確認していたようです。これは、の最初のループの後、再生成されないため、毎回になります。したがって、無限ループです。$newNumbers$i$rand2$newNumbers

また、余分な引用符で解析エラーを見つけてくれた皆さんに感謝します.TextWranglerで修正しましたが(ちなみに壮大です)、投稿用のクエリを単純化するときにエラーが発生しました.

if (!in_array($rand, $codes) && !in_array($rand2, $newNumbers) ){

$query = "INSERT INTO 'table' ('num_id', `num1`, `num2`) VALUES";

$i = 0;
while ($i <= 10){

    $rand = mt_rand(1000000000, 9999999999);
    if (!in_array($rand, $codes) && !in_array($rand, $newNumbers) ){
        $newNumbers[] = $rand;

        $second = 0;
        while ($second == 0){
            $rand2 = mt_rand(1000000000, 9999999999);
            if (!in_array($rand2, $codes) && !in_array($rand2, $newNumbers) ){
                $query .= " ('', $rand, $rand2)";
                $newNumbers[] = $rand2;
                $second = 1;

                $i++;
            }else
                $duplicates ++;
        }//end second loop



    }else
        $duplicates ++;
}//while
于 2013-01-17T12:13:21.587 に答える