У меня есть запрос ниже с предложением dynamic where, где он выводит результаты в зависимости от выбранного меню. Теперь предложение where работает правильно при добавлении и удалении определенных условий в зависимости от выбранных опций.Правильно ли он не отвечает за ответы?
Но я понял, что если я хочу посмотреть на все вопросы, у меня нет условия QuestionId = ?
, но это нормально, но когда нужно отображать ответы на каждый вопрос, вместо отображения это нравится:
D (this is for question 1)
B,C,E (this is for question 2)
он отображает их все как один ответ, как показано ниже, который является неправильным:
D,B,C,E
Мой вопрос: что является причиной этого, запрос или цикл?
var_dump ($ вопросов): выводит на экран это:
array(1) { [39]=> array(1) { [72]=> array(1) { ["answer"]=> string(7) "B,C,D,E" } } }
72 является QuestionID, так что для какой-то странной причине не происходит по всем вопросам (там должен быть второй вопрос, который 73)
Ниже код:
$selectedstudentanswerqry = "
SELECT sa.StudentId, q.QuestionId,
GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR ',') AS Answer
FROM Student st
INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId)
INNER JOIN Question q ON (sa.QuestionId = q.QuestionId)
INNER JOIN Answer an ON q.QuestionId = an.QuestionId
";
// Initially empty
$where = array('q.SessionId = ?');
$parameters = array($_POST["session"]);
$parameterTypes = 'i';
//check if POST is empty
// Check whether a specific student was selected
$p_student = empty($_POST["student"])?'':$_POST["student"];
switch($p_student){
case 0:
//dont' add where filters
break;
default:
$where[] = 'sa.StudentId = ?';
$parameters[] .= $_POST["student"];
$parameterTypes .= 'i';
}
// Check whether a specific question was selected
$p_question = empty($_POST["question"])?'':$_POST["question"];
switch($p_question){
case 0:
//dont' add where filters
break;
default:
$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
";
// get result and assign variables (prefix with db)
$selectedstudentanswerstmt->execute();
$selectedstudentanswerstmt->bind_result($detailsStudentId,$detailsQuestionId,$detailsAnswer);
$selectedstudentanswerstmt->store_result();
$selectedstudentanswernum = $selectedstudentanswerstmt->num_rows();
$questions = array();
while ($selectedstudentanswerstmt->fetch()) {
$questions[$detailsStudentId][$detailsQuestionId] = array(
'answer'=>$detailsAnswer,
);
}
...
<?php
var_dump($questions);
foreach ($questions as $studentId => $student)
{
foreach ($student as $questionId => $question) {
echo '<p><strong>Answer:</strong> ' .htmlspecialchars($question['answer']). '</p>' . PHP_EOL;
}
}
?>
Я не вижу ничего, что могло бы повлиять на ваш результат, за исключением этой строки 'GROUP BY sa.StudentId, q.QuestionId' попытаться удалить его и увидеть результаты, которые вы получите – shnisaka
@shnisaka Я буду тестировать это – user1830984
@shnisaka Нет не работает, я опубликую скриншот о том, что отображается в запросе. Фактически, что я буду делать, вставьте результат запроса в качестве образца, а затем спросите, как писать цикл. Вам нравится этот вызов? – user1830984