以下に、学生用と質問用の 2 つの HTML ドロップダウン メニューがあります。
<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="2">What is 2+2</option>
<option value="34">What is 3+3</option>
<option value="42">What is 4+4</option>
<option value="51">What is 5+5/option>
</select>
<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="23">Jay Hart</option>
<option value="32">Bubba Wright</option>
<option value="43">Tim Grey</option>
<option value="52">Mary Pine</option>
</select>
以下は、上記の 2 つのドロップダウン メニューから選択したオプションに応じて結果を出力する mysqli クエリです。
$selectedstudentanswerqry = "
SELECT
sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId,
QuestionNo, QuestionContent, o.OptionType, q.NoofAnswers,
GROUP_CONCAT( DISTINCT Answer ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, QuestionMarks,
GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime, MouseClick, StudentMark
FROM Student st
INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId)
INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId)
INNER JOIN Question q ON (sa.QuestionId = q.QuestionId)
INNER JOIN Answer an ON q.QuestionId = an.QuestionId
LEFT JOIN Reply r ON q.ReplyId = r.ReplyId
LEFT JOIN Option_Table o ON q.OptionId = o.OptionId
";
// Initially empty
$where = array('q.SessionId = ?');
$parameters = array($_POST["session"]);
$parameterTypes = 'i';
// Check whether a specific student was selected
if($_POST["student"] != '0') {
$where[] = 'sa.StudentId = ?';
$parameters[] .= $_POST["student"];
$parameterTypes .= 'i';
}
// Check whether a specific question was selected
// NB: This is not an else if!
if($_POST["question"] != '0') {
$where[] = 'q.QuestionId = ?';
$parameters[] .= $_POST["question"];
$parameterTypes .= 'i';
}
// If we added to $where in any of the conditionals, we need a WHERE clause in
// our query
if(!empty($where)) {
$selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where);
global $mysqli;
$selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry);
// You only need to call bind_param once
if (count($where) == 1) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]);
}
else if (count($where) == 2) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]);
}
else if (count($where) == 3) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1], $parameters[2]);
}
}
$selectedstudentanswerqry .= "
GROUP BY sa.StudentId, q.QuestionId
ORDER BY StudentAlias, q.SessionId, QuestionNo
";
.......................................................................................
$arrStudentId = array();
$arrStudentAlias = array();
$arrStudentForename = array();
$arrStudentSurname = array();
$arrQuestionNo = array();
$arrQuestionContent = array();
while ($selectedstudentanswerstmt->fetch()) {
$arrStudentId[ $detailsStudentId ] = $detailsStudentId;
$arrStudentAlias[ $detailsStudentId ] = $detailsStudentAlias;
$arrStudentForename[ $detailsStudentId ] = $detailsStudentForename;
$arrStudentSurname[ $detailsStudentId ] = $detailsStudentSurname;
$arrQuestionNo[ $detailsStudentId ] = $detailsQuestionNo;
$arrQuestionContent[ $detailsStudentId ] = $detailsQuestonContent;
}
foreach ($arrStudentId as $key=>$student) {
echo '<p><strong>Question:</strong> ' .htmlspecialchars($arrQuestionNo[$key]). ': ' .htmlspecialchars($arrQuestionContent[$key]). '</p>' . PHP_EOL;
}
データベース内の実際のIDであるため、DBはドロップダウンメニューから値を取得できるため、それぞれのドロップダウンメニューから特定の学生または特定の質問を選択すると、問題なく詳細が出力されます。
しかし問題は、All
どちらかのドロップダウン メニューからオプションを選択した場合です。All
両方のドロップダウン メニューのオプションの値は です0
。今0
はIDとしてデータベースにありません。ユーザーがAll
オプションを選択するAll
と、学生のドロップダウンメニューで選択された場合は学生の詳細が 表示All
され、質問のドロップダウンメニューで選択された場合は質問の詳細が表示されます。
現在、クエリは、適切な条件を含めるように構築された動的な WHERE 句を使用して、これを行うためのデータを収集しています。All
しかし、私の質問は、ユーザーが関連するドロップダウンメニューでオプションを選択した場合、学生/質問のすべての詳細を表示するにはどうすればよいですか?
RING0の回答を扱う更新:
Notice: Array to string conversion in ... on line 358
Warning: mysqli::prepare(): (42S22/1054): Unknown column 'Array' in 'where clause' in ... on line 360
Fatal error: Call to a member function bind_param() on a non-object in ... on line 370
コードの更新:
$selectedstudentanswerqry = "
SELECT
sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId,
QuestionNo, QuestionContent, o.OptionType, q.NoofAnswers,
GROUP_CONCAT( DISTINCT Answer ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, QuestionMarks,
GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime, MouseClick, StudentMark
FROM Student st
INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId)
INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId)
INNER JOIN Question q ON (sa.QuestionId = q.QuestionId)
INNER JOIN Answer an ON q.QuestionId = an.QuestionId
LEFT JOIN Reply r ON q.ReplyId = r.ReplyId
LEFT JOIN Option_Table o ON q.OptionId = o.OptionId
";
// Initially empty
$where = array();
$parameters = array();
$parameterTypes = '';
// Check whether a specific session was selected
if($_POST["session"] != '0') {
$where[] = array('q.SessionId = ?');
$parameters[] = array($_POST["session"]);
$parameterTypes .= 'i';
}
// Check whether a specific student was selected
if($_POST["student"] != '0') {
$where[] = 'sa.StudentId = ?';
$parameters[] .= $_POST["student"];
$parameterTypes .= 'i';
}
// Check whether a specific question was selected
// NB: This is not an else if!
if($_POST["question"] != '0') {
$where[] = 'q.QuestionId = ?';
$parameters[] .= $_POST["question"];
$parameterTypes .= 'i';
}
// If we added to $where in any of the conditionals, we need a WHERE clause in
// our query
if(count($where) > 0) {
$selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where);
global $mysqli;
$selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry);
// You only need to call bind_param once
if (count($where) == 1) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]);
}
else if (count($where) == 2) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]);
}
else if (count($where) == 3) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1], $parameters[2]);
}
スクリーンショット:
上記のように、学生を選択したことを示していますが、All
質問を選択しています。ただし、見出しの下に表示される質問は 1 つだけStudent Answer
です。この例では、括弧内に表示される質問の総数は2
であるため、1 つの質問ではなく 2 つの質問が表示されます。
データベースのスクリーンショット:
通常のクエリのわずかに短縮されたバージョンですが、メインのクエリにも同じ数の行が表示されるため、これは影響しません。質問が 2 つあるため、2 行で表示されます。StudentId = 1
以下の結果は、評価 26 ( ) のすべての質問である 1 人の学生の結果SessionId = 26
です。