Как создать динамическое предложение WHERE

Я пытаюсь создать динамическое предложение WHERE, в котором в зависимости от того, какие параметры выбраны из раскрывающихся меню, он скомпилирует правильное предложение WHERE. Но я не думаю, что делаю это правильно.

Прежде всего должно существовать предложение WHERE по умолчанию, независимо от того, какой параметр выбран из выпадающих меню, должно быть условие WHERE для выбранного SessionId поэтому это должно быть SessionId = ?

Затем в зависимости от параметров, выбранных из раскрывающихся меню, он будет компилировать другие поля в предложении WHERE. Есть два выпадающих меню, которые предназначены для Students и Questions . Возможные результаты:

Student selected != 'All' : Добавить StudentId =? в выражении WHERE Student selected == 'All' : Удалить StudentId =? из предложения WHERE Question selected != 'All' : Добавить QuestionId =? в выражении WHERE Question selected == 'All' : Удалить QuestionId =? из предложения WHERE

Мой вопрос в том, как я могу это настроить?

Ниже приводится то, что у меня есть сейчас:

  if(isset($_POST['answerSubmit'])) // we have subbmited the third form { $selectedstudentanswerqry = " SELECT 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 s INNER JOIN Student_Answer sa ON (s.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 "; if ($_POST['student'] != 'All'){ $selectedstudentanswerqry .= " WHERE (SessionId = ? AND StudentId = ?) "; } if ($_POST['question'] != 'All'){ $selectedstudentanswerqry .= " WHERE (SessionId = ? AND QuestionId = ?) "; } $selectedstudentanswerqry .= " GROUP BY sa.StudentId, q.QuestionId ORDER BY StudentAlias, q.SessionId, QuestionNo "; global $mysqli; $selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry); if ($_POST['student'] != 'All'){ // You only need to call bind_param once $selectedstudentanswerstmt->bind_param("ii",$_POST["session"],$_POST["student"]); } if ($_POST['question'] != 'All'){ // You only need to call bind_param once $selectedstudentanswerstmt->bind_param("ii",$_POST["session"],$_POST["question"]); } // get result and assign variables (prefix with db) $selectedstudentanswerstmt->execute(); $selectedstudentanswerstmt->bind_result($detailsStudentAlias,$detailsStudentForename,$detailsStudentSurname,$detailsSessionId,$detailsQuestionNo, $detailsQuestonContent,$detailsOptionType,$detailsNoofAnswers,$detailsAnswer,$detailsReplyType,$detailsQuestionMarks,$detailsStudentAnswer,$detailsResponseTime, $detailsMouseClick,$detailsStudentMark); $selectedstudentanswerstmt->store_result(); $selectedstudentanswernum = $selectedstudentanswerstmt->num_rows(); } ?> 

Related of "Как создать динамическое предложение WHERE"

Попробуйте построить где array

 $where = array(); if ((int) $studentID >0) { $where[] = " studentID = '{$studentID}' "; } if ((int) $QuestionId >0) { $where[] = " QuestionId = '{$QuestionId }' "; } 

и в конце implode $, где по условию AND

 if (!empty($where)) $query['where'] = ' WHERE '. implode(' AND ', $where); 

Это единственный способ. Я не отлаживал этот код.

Ваши дела:

 - Student selected != 'All' : Add StudentId = ? in WHERE clause - Student selected == 'All' : Remove StudentId = ? from WHERE clause - Question selected != 'All' : Add QuestionId = ? in WHERE clause - Question selected == 'All' : Remove QuestionId = ? from WHERE clause <?php $selectedstudentanswerqry = "WHERE SessionId = ? "; if ($_POST['student'] != 'All'){ $selectedstudentanswerqry .= " and StudentId = ? "; } else{ /* $selectedstudentanswerqry .= " //what is condition for if student == all ? "; */ } if ($_POST['question'] != 'All'){ $selectedstudentanswerqry .= " and QuestionId = ? "; } else{ } ?> 

считают, что

 student = 1 then: if student != All = true if question != AA = true student = All if student != All = false if question != AA = true question = 1 if student != All = true if question != AA = true question = All if student != All = true if question != AA = false 

проверьте, хотите ли вы этого? Я думаю нет.

  //case1 if ($_POST['student'] != 'All'){ $selectedstudentanswerqry .= " WHERE (SessionId = ? AND StudentId = ?) "; } //case2 if ($_POST['question'] != 'All'){ //case 2.1 if ($_POST['student'] != 'All'){ $selectedstudentanswerqry .= " and (QuestionId = ?) "; } //case 2.2 else{ $selectedstudentanswerqry .= " WHERE (SessionId = ? AND QuestionId = ?) "; } } /* testing 1- student != All, question != All case1: true case1: result: $selectedstudentanswerqry = WHERE (SessionId = ? AND StudentId = ?) case2 : true case 2.1: true case2.1 result: $selectedstudentanswerqry .= and (QuestionId = ?) 2- student != All question = All case1: true case1: result: $selectedstudentanswerqry = WHERE (SessionId = ? AND StudentId = ?) case2: false 3- student = All question != All case1: false case2: true case2.1: false case2.2: true case2.2 result: $selectedstudentanswerqry = WHERE (SessionId = ? AND QuestionId = ?) 4- student = All question = All case1: false case2: false */