2017-07-12 6 views
-1

私はPHPで新しいです。私はちょうどランダムな名前(またはあなたが望むもの...)を生成したいです。それは動作します!しかし、コードの途中に「do/while」を置いて重複した名前を制御したり避けたりすると、うまくいきません....なぜですか?私のコードには何がありますか?私は疲れて、破壊される。PHPは、コントロールの生成時に重複します

<?php 
require_once 'config.php'; 
require_once 'dbconn.php'; 

function getnome() { 
    $nome = ['tin', 'pin', 'nid', 'din', 'vin']; 

    return $nome[mt_rand(0, count($nome) - 1)]; 
} 

for ($f =0; $f<6; $f++) { 
    $arr = []; 
    do { 
    $x = getnome(); 
     } 
    while (in_array($x, $arr)); 
    $arr[]=$x; 

    $query = "INSERT INTO ants (ant_id, nome) VALUES (NULL, '".getnome()."')"; 
     $res = $mysqli->query($query); 
     if (!$res) { 
      echo('<br>Error' . $mysqli->error); 
     } else { 
      echo $mysqli->affected_rows . ' created'; 
     } 

} 
?> 

enter image description here

+0

do/whileループでは何もしません。コードの残りの部分には影響しません。 – aynber

+0

私は大変な努力をしていますが、重複した名前を避ける方法は見つけられません。私に何ができる? – AlessandroFlorean

+0

最も簡単な方法は、テーブルのnomeカラムに一意のフラグを追加するか、挿入する前に存在するかどうかを確認することです。 – aynber

答えて

1

よりシンプルな方法配列から値を取り出すには、配列をランダム化して、順番に処理します。

$stmt = $mysqli->prepare("INSERT INTO ants (nome) VALUES (?)"); 
$stmt->bind_param("s", $a_nome); 
$nome = ['tin', 'pin', 'nid', 'din', 'vin']; 
shuffle($nome); 
foreach ($nome as $a_nome) { 
    $stmt->execute(); 
} 
+0

HI、mr。バーマン、私はパニックにならないで助けを借りて解決しました!私はpdoメソッドを勉強しているので、私はオプションを試してみるつもりです....準備ステートメントと!そのようにintresting。 – AlessandroFlorean

+0

@AlessandroFlorean私はこれを行うより良い方法だと思います。使用していたコードに何が問題になっているのかを説明したかったのですが、代わりにこのようにすると多くの利点があります。 –

0

二つの主要な問題があります。それは実際にランダムな値を追跡されないように

  1. あなたがforループの各反復で$arrを再初期化しているが、あなたはすでに挿入しています。あなたはの前にのforループを初期化する必要があります。

  2. $xの重複しない値を使用していないのは、挿入ステートメントのdo ... whileループに入ったばかりです。 getnome関数をもう一度呼び出すと、別の(おそらくは重複する)値が返されます。代わりに$xを使用する必要があります。


$arr = [];      // initialize $arr here instead 
for ($f = 0; $f < 6; $f++) { 
    do { 
     $x = getnome(); 
    } 
    while (in_array($x, $arr)); 
    $arr[] = $x; 

    // use $x instead of getnome()  
    $query = "INSERT INTO ants (ant_id, nome) VALUES (NULL, '" . $x . "')"; 
    $res = $mysqli->query($query); 
    if (!$res) { 
     echo('<br>Error' . $mysqli->error); 
    } else { 
     echo $mysqli->affected_rows . ' created'; 
    } 

} 

あなたが他の二つのことを修正したら、あなたが遭遇するだろうもう一つの問題は、あなたが6つのユニークな値を挿入しようとしているということですが、あなたのgetnome機能は、そう、唯一の5つを生成することができますdo ... whileループは最後の試みで無限になるように見えます。 (それはちょうどあなたがあなたの例を作成したときに翻訳で失われたものかもしれませんが、whileループやdo ... whileループで注意する必要があります)

+0

うわー!!!!!!完璧な!!!!サー・ドン・パニック。私はとても幸せだ!!!!!あなたは私の日(夜)を保存する!!!!!!!!!すばらしいです! exactly私はforループの各繰り返しで$ arrを再初期化していました。ごめんなさい。あまりにも疲れて!!!! – AlessandroFlorean

+0

心配はいりません。あなたはそれが働いてうれしい! –

+0

たくさん、ありがとう - たくさんありがとう - 何千もの時間(venice、italyから)!!!!!サー! – AlessandroFlorean

関連する問題