0

私は一種の「クイズ」を作っています。ユーザーは質問を受け、3 つの回答から選択できます。これが私のコードです:

// query
$result = mysql_query("SELECT * FROM `db_game` LEFT JOIN `db_game_printers` ON (db_game.printerId = db_game_printers.id) ORDER BY RAND() LIMIT 1") or die(mysql_error());

while($row = mysql_fetch_array($result)) {

// explode answers
$row['printerQuestion'] = trim($row['printerQuestion']);
$question = explode(",", $row['printerQuestion']);

$printerQuestion = $row['title'];
$printerAnswer = $row['printerAnswer'];

// check answer
$answer = $row['printerAnswer'];
    if (isset($_GET['answer'])) {
        $answerUser = $_GET['answer'];
        if ($answerUser == $answer) {
            $correct = true;
        } else {
            $false = true;
        }
    }

期待どおりに動作します。ユーザーが回答をクリックして質問に答えると、次の質問が表示されます。また、彼らが実際に正解したか不正解だったかを示したいと思います! 私はこのコードを書きました:

<div id="wrapper">

<div id="question">
<h1><?= $printerQuestion; ?></h1>
</div><!-- /question -->

<ul id="answers">
    <li style="text-align:left;"><a href="index.php?answer=<?=$question[0];?>"><button class="punch"><?=$question[0];?></button></a></li>
    <li style="text-align:center;"><a href="index.php?answer=<?=$question[1];?>"><button class="punch"><?=$question[1];?></button></a></li>
    <li style="text-align:right;"><a href="index.php?answer=<?=$question[2];?>"><button class="punch"><?=$question[2];?></button></a></li>
</ul>
<div class="clear" style="margin-bottom:50px;"></div>


<?php
$prev_printerQuestion = $printerQuestion;
$prev_printerAnswer = $printerAnswer;

} // end while loop
?>

<?php
if (isset($_GET['answer'])) {
    if ($correct) {
        echo "Correct! The ".$prev_printerQuestion." uses the ".$prev_printerAnswer."";
    }
    else if ($false) {
        echo "Not correct. ".$prev_printerQuestion." = ".$prev_printerAnswer."" ;
    }
}
?>

</div><!-- /wrapper -->

答えが正しいかどうかのチェックでは、現在のデータが使用されます。前の質問からではありません。別の変数と while ループの外側 (および内側) に値を配置しようとしましたが、違いはありませんでした。

誰でも思いつきましたか?

4

1 に答える 1

2

最初に、アプリケーションで何をしようとしているのかを表すいくつかの関数を定義します。(簡単にするために、OO の原則については説明しません)。

アプリケーションの機能のこのカプセル化を理解することは、優れたソフトウェア設計への第一歩です。

あなたの場合、ビューレイヤーは非常に単純です:

function displayQuestion($question, $answers) { /* display html for question and possible answers */ }

質問を表示するには、質問とその回答をデータベースから取得する必要があります。あなたはこれを行うかもしれません:

function getQuestion($questionNumber) { /* performs SQL queries and returns some representation of question, answers and correct answer */ }

次に、実際の「ビジネス」(ゲーム) ロジック自体を取得します。これは次のとおりです。

function checkAnswer($questionNumber, $answerGiven) { /* returns true or false */ }

また、ゲーム全体を制御するためのいくつかの関数も必要です。たとえば、次のようになります。

function startNewGame() { /* reset internal variables */ }

function getCurrentQuestionNumber() { /* get the question that the user is up to */ }

function displayCurrentScore() { /* display html for current score */ }

最後の部分は、すべてを一緒に配線することです。(私はあなたがする最後のことではなく、議論の最終的なことを意味します). これは、HTTP リクエストから始まり、モデルとビジネス ロジックを経由してビュー レイヤーに戻り、HTTP レスポンスを介してユーザーにページを表示するために、パーツを一緒に接続する場所です。このプロセス全体をメソッドとしてカプセル化することが考えられます。

function handleRequest() { /* perform the whole request-response cycle, calling the other methods as required */ }

上記は、これらの機能とその機能に対する広範でかなり一般化されたアプローチであり、正確な要件がわからないため、欠落している部分があることに注意してください。これも「ベスト プラクティス」とは言えませんが、ビジネス ロジックとデータベース アクセスを HTML コードに混在させるよりはましです :-)

于 2013-02-05T13:29:19.367 に答える