2011-08-11 35 views
0

掲示板スクリプト用のカスタムメダル/賞システムを作成しようとしています。PHPスクリプトのヘルプ

私が問題を抱えているのは、メダルを受け取ることができるユーザーを確認するために10分ごとに実行されるタスクです。

// select all medals from database 
$query = $db->simple_select("medals", "*", ""); 
$medals = $db->fetch_array($query); 

// select users 
$query_users = $db->simple_select("users", "*", ""); 
$results = $db->fetch_array($query_users); 

foreach($medals as $medal) 
{ 
    foreach($results as $result) 
    { 
     if($result['postnum'] >= $medal['postnum']) 
     { 
      $insert = array( 
       "mid" => $medals['id'], 
       "muid" => $result['uid'], 
       "mtime" => TIME_NOW, 
      ); 

      $db->insert_query("users_medals", $insert);     
     } 
    } 
} 

上記のコードのための意図は、ユーザーによって「ウォン」の対象のすべてのメダルを保持しているmedalsテーブルを照会することです:

は、ここに私の現在のコードです。 usersテーブルはかなり自明です - フォーラムボードのユーザーを保持します。ユーザーがメダルの要件を満たしている場合、メダルは、メダルID、ユーザーID、およびメダルが授与された時刻とともにuser_medalsテーブルに挿入されます。

しかし、タスクが実行されるたびに、30個以上の行が挿入されます(2人しかテストボードを使用していないので、1人のユーザーのみが少なくとも2つの投稿を持つユーザーのメダル)。

誰かが私にこれを手伝ってもらえますか?

ありがとうございました。

+0

あなたは 'var_dump($ medals)'と 'var_dump($ results)'から得たものを投稿することができます –

+0

メダルdbのすべてのpostnum値を結果dbのすべてのpostnum値と比較しているようです。あなたは1対1だけを比較したくないですか?同様に、結果の最初の行/列をメダルの最初の行/列と比較します。すべてをすべてと比較しているような気がしますが、あなたはIF文に複数のTRUEレスポンスを得る必要があります。 – bozdoz

+0

私は問題を修正しました。私は間違った変数を使用していました... – Spencer

答えて

1

問題はここにある:それらの値を調べるために、各ループで

if($result['postnum'] >= $medal['postnum']) 

出力$result['postnum']$medal['postnum']の値。最初の値は常に2番目の値以上であるため、ループは常に実行されます。

+0

これは$結果と$メダルの代わりに$ resultと$ medalを使用しているためですか?私はこれらが配列ではなく値であることに気付きました。これを書くには良い方法がありますか?私は多次元配列を除いてforeachループ内でforeachループを見たことがありません。二重foreachループは有効ですか? – bozdoz

+0

@bozdoz:OPが変数を正しく参照しています。 'foreach($ medals as $ medal)'と 'foreach($ result as $ result)'の行はそれぞれ '$ medal'と' $ result'という名前の変数を作成します。ループの形式はデータ構造に依存しますが、この場合は実行可能な(最適化されていない場合)ソリューションのように見えます。 –

+0

しかし、これはすべてのメダルに対してすべての結果をチェックします。 Foreach($メダルを$メダルとして)は各メダルを通過し、すべてのメダルに対して、すべての結果を実行するforeach($結果を$結果)と呼びます。 $結果を1回だけ調べる方が良いと感じています。おそらくswitch文がうまくいくでしょう。 ($ result ['postnum']> = 500):...ブロンズ... case($ result ['postnum']> = 500):..シルバー...など。 – bozdoz