2013-02-16 2 views
0

Я считаю, что причиной этой проблемы является динамическое предложение WHERE, которое я установил. Ниже как динамический ИНЕКЕ работает:Отображать только один набор данных из цикла

  • Обязательного WHERE условие q.SessionId = ?
  • Если пользователь выбирает одного студента от студента выпадающего меню, а затем добавить AND sa.StudentId = ? к ИНЕКЕ
  • Если пользователь выбирает All студентов варианта от студента выпадающее меню, затем удалите или не отобразите AND sa.StudentId = ? из предложения WHERE
  • Если пользователь выбирает один вопрос из раскрывающегося списка вопросов, добавьте AND q.QuestionId = ? в предложение WHERE
  • Если пользователь выбирает All вопросы вариант из вопроса выпадающего меню, а затем удалить или не отображать AND q.QuestionId = ? от ИНЕК

У меня есть три выпадающего меню (ниже то, что они выглядят как с данными выборки):

сессия:

<select name="session" id="sessionsDrop"> 
<option value="26">POKUB1</option> 
<option value="27">POKUB2</option> 
</select> 

Студент:

<select name="student" id="studentsDrop"> 
<option value="0">All</option> 
<option value="39">Luke Mcfadzen</option> 
<option value="40">Chris Tucker</option> 
</select> 

Вопрос:

<select name="question" id="questionsDrop"> 
<option value="0">All</option> 
<option value="72">1</option> 
<option value="73">2</option> 
</select> 

Не забывайте, как WHERE условия предположит, ту работу, которую я уже упоминал выше, в этом вопросе. Предположим, что сеанс, выбранный из раскрывающегося меню сеанса, - POKUB 1, drop down value: 26.

Если вы выберете одного студента и один вопрос, то он правильно отобразит детали, например.

  • Студент: Лука McFadzen - выпадающее значение: 39
  • Вопрос: 1 - выпадающее значение: 72

Так WHERE условие q.SessionId = 26 AND sa.StudentId = 39 AND q.QuestionId = 72.

Но если я выберу опцию All в любом из двух или двух студентов и вопрос выпадающего меню, то на выходе будет отображаться только один ученик и один вопрос, и по какой-то странной причине он объединяет ответы из всех вопросов и объединяет ответы всех ответов учащихся единственный выход.

Теперь All варианта как в раскрывающемся меню имеет выпадающее значение 0, теперь 0 не является значение, чтобы выбрать из базы данных, но мы уже говорили в динамике, где положение, что если значение 0 выбираются из определенных выпадающего меню, затем удалите соответствующий условие из пункта WHERE, так, например:

  • All студентов и один вопрос (значение 72) - WHERE q.SessionId = 26 AND q.QuestionId = 72
  • Single (значение 39) студентов и All вопросов - WHERE q.SessionId = 26 AND sa.StudentId = 39
  • All студенты и All вопросов - WHERE q.SessionId = 26

ВЫШЕПРИВЕДЕННЫХ СЦЕНАРИИ возникают проблемы,

Если я просто оставил запрос со статическим ИНЕКЕМ WHERE q.SessionId = ? затем выводит деталь правильно, если я выбираю All студентов и All Вопросы, но мне нужен запрос для работы для всех различных возможных вариантов, выбранных из раскрывающихся меню, и, следовательно, для чего мне нужно динамическое предложение WHERE. Как я могу заставить его работать, чтобы отображались правильные данные?

Код:

$selectedstudentanswerqry = " 
     SELECT 
     sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId, 
     q.QuestionId, 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, 
     (
     SELECT sum(StudentMark) 
     FROM Student_Answer sta 
     WHERE sa.StudentId = sta.StudentId 
     AND sa.QuestionId = sta.QuestionId 
     )StudentMark 
     FROM Student st 
     INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId) 
     INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId) AND sa.QuestionId = sr.QuestionId 
     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 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, QuestionNo 
     "; 

    // get result and assign variables (prefix with db) 
    $selectedstudentanswerstmt->execute(); 
    $selectedstudentanswerstmt->bind_result($detailsStudentId,$detailsStudentAlias,$detailsStudentForename,$detailsStudentSurname,$detailsSessionId, 
    $detailsQuestionId,$detailsQuestionNo,$detailsQuestionContent,$detailsOptionType,$detailsNoofAnswers,$detailsAnswer,$detailsReplyType,$detailsQuestionMarks, 
    $detailsStudentAnswer,$detailsResponseTime,$detailsMouseClick,$detailsStudentMark); 

    $selectedstudentanswerstmt->store_result(); 
    $selectedstudentanswernum = $selectedstudentanswerstmt->num_rows(); 

while ($selectedstudentanswerstmt->fetch()) { 

       //Check if the student data exist. 
       if (!isset($questions[$detailsStudentId])) { 
        $questions[$detailsStudentId] = array(
         'studentalias' => $detailsStudentAlias, 
         'studentforename' => $detailsStudentForename, 
         'studentsurname' => $detailsStudentSurname, 
         'questions' => array() 
        ); 
       } 

       $questions[$detailsStudentId]['questions'][$detailsQuestionId] = array(
        'questionno'=>$detailsQuestionNo, 
        'content'=>$detailsQuestionContent, 
        'optiontype'=>$detailsOptionType, 
        'noofanswers'=>$detailsNoofAnswers, 
        'answer'=>$detailsAnswer, 
        'replytype'=>$detailsReplyType, 
        'questionmarks'=>$detailsQuestionMarks, 
        'studentanswer'=>$detailsStudentAnswer, 
        'responsetime'=>$detailsResponseTime, 
        'mouseclick'=>$detailsMouseClick, 
        'studentmark'=>$detailsStudentMark 
       ); 
      } 

      $selectedstudentanswerstmt->close(); 

    foreach ($questions as $studentId => $studentData) { 
     echo '<p>'.$studentData['studentalias'].' - '.$studentData['studentforename'].' '.$studentData['studentsurname'].'</p>'; 

     foreach ($studentData['questions'] as $questionId => $questionData) { 
      echo '<p><strong>'.$questionData['questionno'].': '.$questionData['content'].'<br/>'; 
      echo $questionData['optiontype'].' - '.$questionData['noofanswers'].' - '.$questionData['answer'].' - '.$questionData['replytype'].' - '.$questionData['questionmarks'].'<br/>'; 
      echo $questionData['studentanswer'].' - '.$questionData['responsetime'].' - '.$questionData['mouseclick'].' - '.$questionData['studentmark'].'</strong></p>'; 
     } 
    } 

Ниже приведены возможные var_dumps для $_POST['student'] и $_POST['question']:

ОДИН СТУДЕНТ И ОДИН ВОПРОС:

  • Студент: Chris Tucker - строка (2) "40"
  • Вопрос: 1 - строка (2) "72"

ОДИН СТУДЕНТ И ВСЕ ВОПРОСЫ:

  • Студент: Chris Tucker - строка (2) "40"
  • Вопрос: Все - строка (1) "0"

ВСЕ СТУДЕНТЫ И ОДИН ВОПРОС:

  • Слушатель: Все - строка (1) "0"
  • Вопрос: 1 - строка (1) "72"

ВСЕ СТУДЕНТЫ И ВСЕ ВОПРОСЫ:

  • Student: Все - строка (1) "0"
  • Вопрос: Все - строка (1) "0"

Ниже приведен пример var_dump($questions);, если я выбираю All студентов и All вопросы:

array(1) { 
[39]=> array(4) { 
["studentalias"]=> string(8) "u4838229" 
["studentforename"]=> string(5) "Chris" 
["studentsurname"]=> string(6) "Tucker" 
["questions"]=> array(1) { 
[72]=> array(11) { 
["questionno"]=> int(1) 
["content"]=> string(14) "What is a RAM?" 
["optiontype"]=> string(3) "A-E" 
["noofanswers"]=> int(1) 
["answer"]=> string(7) "B,C,D,E" 
["replytype"]=> string(6) "Single" 
["questionmarks"]=> int(5) 
["studentanswer"]=> string(9) "A,B,C,D,E" 
["responsetime"]=> string(8) "00:00:07" 
["mouseclick"]=> int(1) 
["studentmark"]=> string(1) "2" } } } } 
+0

Вы можете попробовать с '-1' для опции' All' вместо '0'? Также 'var_dump ($ selectedstudentanswerqry)' перед исполнением и проверить, действительно ли он. – SparKot

ответ

0

пустой() (PHP 4, PHP 5)

пусто - Определить, является ли переменная пустой Возвращает FALSE, если переменная существует и не пустое, отличное от нуля значение. В противном случае возвращается значение ИСТИНА.

Возможно использование, кроме 0, значение для All.

+0

Привет, извините, мне просто нужно было выполнить поручение, я вернулся, я дам ваше решение и дам вам знать. На самом деле вы можете сообщить мне, что значение должно быть точно названо «значением» ... »« Потому что я предполагаю, что не могу просто «value =« empty » – user2048994

+0

Я имел в виду' 'кроме' 0'. '0' ==' false' в языках программирования. И 'empty (0)' функция вернет false для него. – SparKot

+0

var_dump для $ selectstudentanswerqry показывает, что запрос выполняется правильно для каждого параметра, но то, что результат все еще делает, состоит в том, что он расчесывает все ответы учащихся вместе как один и объединяет все ответы как один. Поэтому, если я выбираю всех учеников, он отображает одного ученика, один вопрос, но затем отображает все ответы на каждый вопрос на вопрос один и все ответы ученика на каждый вопрос на вопрос один. Имеет ли это смысл? – user2048994

Смежные вопросы