2011-12-19 15 views
0

PHPの私のWebアプリケーションの1つに、コンテストセクションがあります。それは多肢選びの10の質問が含まれています、それぞれは4つのオプションがあります。PHPコンテスト論理

ユーザーがフォームに入力した後、私はカンマ区切りの値をdbに保存しています。以下のように、次のとおりです。

user | answer 
------------------------------------- 
112 | 1,7,8,9,8,5,2,3,6,7,9,6 

は、私が使用者の満たされた回答キーと同じキーの回答を得ました。..

ユーザーの入力を評価し、最高得点のユーザーを見つけるための最良の論理的な方法は何ですか?

+0

最善の方法は、データベースに...データをそのよう... – ceejayoz

+4

カンマ区切り値を格納しないことですか?足で自分を撃ってはいけません...代わりに複数のリンクテーブルを使用してください([リレーショナルデータベースモデル](http://en.wikipedia.org/wiki/Relational_database)を参照)。 – qJake

+1

+1 to SpikeX。このように複数の値を1つの列に格納することは、1NFでさえありません。あなたが質問の数を変更したい場合は、道に沿ってどんな数の頭痛に終わるだろう。 –

答えて

1

コメントで述べたように、これはデータを格納するための最良の方法ではありませんが、私はこのように評価したい:

$:あなたがそのようなスコアが答えを持っている場合

$query = mysql_query("select * from `table` where 1",CONNECTION_IDENTIFIER) or die("die message"); 
$answer_key = array(answer1,answer2,etc); 
$high_score = 0; 
$high_scorer= ""; 
while($r=mysql_fetch_array($query)){ 
    $users_answers = explode(',',$r['answer']); 
    $user_score = 0; 
    for($i=0;$i<10;$i++){ 
     if ($answer_key[$i]==$users_answers[$i]){ 
      $user_score++; 
     } 
    } 
    if ($user_score > $high_score){ 
      $high_score = $user_score; 
      $high_scorer = $r['user']; 
    } 
} 

echo "High scorer is $high_scorer with $high_score points"; 
+0

返事をありがとう、これは私が探しているようです...ありがとう..私はそれを通過します。 。 BTWどのようにこの関数の実行時間を増加させる..より多くの答えの場合? – ramesh

+1

このソリューションは、数千人のユーザーにとってうまくいくはずです。あなたがそれ以上のものを期待しているなら、違うアプローチをしたいと思っています...しかし正直なところ、あなたは10,000人の可能な組み合わせ(10^4)しか持っていません。一度50K +回答者が極端に小さい場合は...誰かがそれを知っているかどうかをチェックするこのコードをいくつか追加してください(答えキーストリングとユーザーキーストリングを比較してください...チャンスは、回答者のうち)...一致するものがあればループをスキップします –

+0

また、それがうまくいかなかった場合は、回答テーブルに列を追加し、回答を追加する際にユーザのスコアを保存することもできます(提出したら比較機能を実行し、 ユーザー:1322、回答:1,4,7,2,5,1,5,5,2,8、得点:8 などを使用し、mysqlのORDER BYまたはMAX()を使用してください。最高の得点を得るために機能する...これは、あなたが一度にすべてではなく、調査がアップしていた時間全体にわたってスコアを処理することを可能にするでしょう。 –

1

解答1を選択すると、2 => 1点、3 => 3の場合、answersRating = array(1 => 0,2 => 1,3 => 3,4 => 2、ポイントなどがあります。私はあなたがこのようなあなたのDBを構築すべきだと思う

$score = array_sum(array_intersect_key($answersRating, array_flip(explode(',', $userAnswersStringFromDB)))); 
1

:あなたはそのような何かを行うことができ 注:これは最低限である、あなたはもちろんの名前のような質問に余分なフィールドを追加し、説明など

answers | id, user_id, question_id, answer 
questions | id, contest_id, correct_answer 
user  | id, name 

その後、すべてのクエリを取得できます。

トップスコア:

SELECT u.name,count(*) as Score FROM user u, answers a, questions q WHERE u.id=a.user_id and q.id = a.question_id and q.correct_answer=a.answer WHERE q.contest_id=XXX ORDER BY Score 
+0

あなたの返事に感謝しています....私は...回答テーブルの回答行を(1,4,2,4,1,3,4)のようなカンマ区切りの値として意味します。 – ramesh