1

goto ステートメントが嫌われていることは知っていますが、次の状況が最も受け入れられるかどうかを知りたかったのです。

列の値に対して一意の乱数を作成したいのですが、そのためには乱数を作成し、それがテーブルに存在するかどうかを確認する必要があります。

a:
$rnumber = rand(1, 10);
$queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);

if ($queryresult->num_rows > 0) //if random number exists a row would be returned
{goto a;}  //try again
else {//insert into table}
4

5 に答える 5

2

代わりに、再試行をカウントする while ループを使用する必要があります。

$attempt = 0; $success = false;
while ($attempt++ < 3) {
    // ... make sure $success gets marked true!
    // in case of success, make sure you break here!
}
if (!$success) {
    // Failure
}

これにより、スクリプトがフリーズしないようになります (無限ループ)。

于 2013-05-25T17:32:20.743 に答える
0

gotoステートメントは主に(存在する場合)エラー処理に使用されました。ステートメントの長いリストでは、それぞれがエラーをトリガーする可能性があり、残りのすべてのステートメントをスキップするために関数の下部近くでジャンプ (goto) が行われました。 、関数の最後で一般的なエラー プロセッサを実行します。

しかし、今日では、PHP でさえ例外処理を行っているため、 gotoの使用はさらに正当化されません。

前述のように問題を修正します

あなたの場合、単純なアルゴリズムを実装して同等の機能を実行できます

do {
  $rnumber = rand(1, 10);
  $queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);

} while ($queryresult->num_rows > 0);

無限(または非常に長い)ループに陥るリスクがあります...

改善の余地

試行回数が限られているので (1 .. 10)、

  • 繰り返しなしで 1 から 10 (最大) までのすべての数字を 1 回試す
  • ランダム (例: 7 2 3 9 ...)

つまり、最大10 回の試行を実行し、が存在しない場合、または 10 回の試行がすべて完了した場合に終了します。1 から 10 までランダムに試すには、shuffle関数を使用して、1 から 10 の要素の配列をランダムにシャッフルします。

$tries = array();
for ($i=1 ; $i<=10 ; $i++) $tries[] = $i; // create an array (1,2,3,4,5...)

shuffle ($tries); // shuffle the array, eg now $tries is (8,2,9,1,7...)

$index = 0; // start with first element of $tries
do {
  $rnumber = $tries[$index++];
  $queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);

} while ($queryresult->num_rows > 0 && $tries < 10);

このようにして、10 個すべての可能な値をランダムに試します。それ以上ではありません。

しばらくし追加

if ($queryresult->num_rows < 1) {
  // found a non existing number: $tries[$index-1]
}
else {
  // all 10 numbers exist in the DB...
}

2つの条件に対処します。

于 2013-05-25T17:38:07.420 に答える
-1

gotoは良いコーディング手法ではありません。コードが説明不能で管理不能になります。絶対に使用しないでくださいgoto。そうしないと、コードのコンパイル中にヴェロキラプトルに襲われます。

ここに画像の説明を入力

でも、コンソールアプリを作っているなら大丈夫です。

于 2013-05-25T17:40:28.690 に答える