私はphpが初めてです。小さなオンライン試験アプリケーションを作成しています。MySql で質問テーブルを 1 つ作成しましたが、ページに質問を 1 つだけ表示したいと考えています。その質問の回答を送信した後、別の質問をページに表示します。どうすればこれを行うことができますか?ありがとう
3 に答える
編集2 元のコードのいくつかの問題を修正するための更新疑似コードを次に示します。
基本的に、ここでの変更は、データベースからすべての質問 ID を取得してシャッフルすることです。これにより、自動インクリメント シーケンスで ID が欠落する可能性が高くなります。
古いコードからのもう 1 つの変更点は、一度に 1 つずつではなく、選択されたすべての質問をデータベースから取得することです。そこで何を考えていたのかわからない。
ここにいくつかの疑似コードがあります:
// Get all questions ids. This should be fine since there shouldn't be too many cases where you will have more than 1000 questions.
$questionIds = db.selectIdsFromQuestionsWhereTypeIsSports();
// Shuffle array so the question ids are out of order
shuffle($questionIds);
// Number of questions you want
$quizLength = 5;
// select your questions
$selectedQuestions = array_slice($questionIds, 0, $quizLength);
// Now fetch all data for selected questions
$quiz = db.fetchByWhereIdIn($selectedQuestions);
// Now do whatever with your question
rand
**元のMySQL関数は使用しませんでした。行数が多い場合、優れたパフォーマンスは得られません。さらに、同じ質問をもう一度選択する可能性があります。
したがって、私が行うことは、データベースから一連の質問を取得してから、php でシャッフルすることです。
何千もの質問がある場合は、自動インクリメント ID に関連する一連の数字をランダムに生成することをお勧めします。自動インクリメント ID を使用していない場合、これは機能しません。
たとえば、10 個の質問をしたい場合、データベースに 100 個の質問がある場合、たとえば 1 から 100 までの数字を 10 個生成します。
このアプローチの 1 つの欠点は、自動インクリメント シーケンスに穴がある場合です。数が多すぎない場合は、捨ててランダムに別の数を選ぶことができます。
ここにいくつかの疑似コードがあります:
// Get a count of your questions from the database
$totalQuestions = db.count();
// Generate an array sequence/range
$questionIds = range(1, $totalQuestions);
// Shuffle array so the numbers are out of order
shuffle($questionIds);
// Store your questions
$quiz = array();
// Number of questions you want
$quizLength = 5;
// Now you can retrieve questions like so
while (count($quiz) == $quizLength) {
$question = db.fetchById(array_pop($questionIds);
if ($question != null) {
$quiz[] = $question;
}
}
// Now do whatever with your question
SELECT * FROM 質問 ORDER BY RAND() LIMIT 4
セッションでの質問 ID をカンマ区切りで設定する
$_SESSION['asked_question_ids'] = $asked_question_ids;
セッションからの質問 ID を使用して、まだ尋ねられていないランダムな質問を取得します
$asked_question_ids = '3, 4, 5, asked queston ids from session'
SELECT * FROM questions WHERE qid NOT IN ($asked_question_ids) ORDER BY RAND() LIMIT 1