本当に素晴らしいトラフィックがない限り、単純な「ページごとに1回」のデータベース呼び出しがサーバーに大きな負担をかける可能性は低いですが、これを実行したい場合は、この情報をキャッシュするのが最も簡単な方法です。ユーザーがログインすると、PHP$_SESSION
スーパーグローバルで。ファイルシステムストレージを使用するようにPHPを設定したとすると(データベースセッションストレージを使用しても、パフォーマンスにわずかな影響しかありません)、質問は超高速で保存されます。 -特定のユーザーごとに一意になるように事前に作成されているファイルにアクセスします。スクリプトがロードされるとすぐに、セッションファイルが自動的にメモリに読み込まれ、そこから任意の情報にアクセスできます。
例:
質問テーブルに列がquestion_number
ありquestion_text
、回答テーブルに列がquestion_number
あり、answer_text
:
<?php
//on login:
//first get the answer array, so we can use it in the logic below:
$query = mysql_query('SELECT * FROM `questions` WHERE [criteria]',[connection identifier]) or die(mysql_error());
if (!mysql_num_rows($query)){
die("No questions!");
}
$answer_array = array();
//create a keyed array that you can access by question number
while($row=mysql_fetch_array($query)){
$answer_array[$row['question_number']] = $row['answer_text'];
}
//now get the questions and put everything into the session variable
$query = mysql_query('SELECT * FROM `questions` WHERE [criteria]',[connection identifier]) or die(mysql_error());
if (!mysql_num_rows($query)){
die("No questions!");
}
//loop through the results and generate session arrays we can work with later
while($row = mysql_fetch_array($query)){
//assign the question to the correct form:
if ($row['question_number']<=10){
$session_key = 'form_a';
} elseif($row['question_number']<=20){
$session_key = 'form_b';
} elseif($row['question_number']<=30){
$session_key = 'form_c';
} else {
$session_key = 'form_d';
}
//if the session variable does exist yet, create it:
if (!isset($_SESSION[$session_key])){
$_SESSION[$session_key] = array();
}
//get the existing answer if it exists, otherwise leave the answer blank:
$my_answer = "";
if(isset($answer_array[$row['question_number']])){
$my_answer = $answer_array[$row['question_number']];
}
//add this question array as a child array element in the session array, keyed by the question number
$_SESSION[$session_key][$row['question_number']] = array(
'question' => $row,
'answer' => $my_answer
);
}
たとえば、フォームBを読み込んでいる場合は、セッション配列からフォームBを読み取り、$_SESSION['form_b']
前の質問への回答に基づいて、必要な論理スイッチを実行できます。
$html = "";
foreach($_SESSION['form_b'] as $question_number => $data){
//perform any logic, for instance, if question 2 from form a is equal to '5', don't show question 3 on form B:
switch($question_number){
case '3': if ($_SESSION['form_a']['2']['answer']=='5'){ continue 2; }; break;
}
//add the question to the form, and populate the answer if they already answered it earlier:
$html .= "<label>".$data['question']."<input type='text' value=\"".$data['answer']."\" name='question_".$question_number."' /></label>";
}
次に、各フォームを送信するときに、mysqlanswers
テーブルを更新するだけでなく、_SESSION配列も更新する必要があります。たとえば、POSTを介してフォームBを送信する場合:
$form = 'form_b';
foreach($_POST as $key=>$value){
if (substr($key,0,strlen('question_')!='question_'){
continue;
}
$number = str_replace('question_','',$key); //this will give us the question number
$saved = add_answer($number,$value); //call the function to insert the new answer into the database (this is a dummy function, and please make sure to escape your variables
if ($saved){//assuming it saved:
$_SESSION[$form ][$number]['answer']=$value; //now we've updated the session array as well.
}
}