I get quite a few errors when trying to create a dynamic where clause using mysqli:
A warning. Parameter 2 for mysqli_stmt :: bind_param () must be a link, the value specified in ... on line 319
Warning: mysqli_stmt :: execute (): (HY000 / 2031): data for parameters in the prepared message in ... on line 328
Warning: mysqli_stmt :: bind_result (): (HY000 / 2031): there is no data for the parameters in the prepared message in ... on line 331
Warning: mysqli_stmt :: store_result (): (HY000 / 2014): Commands from synchronization; you cannot run this command now ... on line 332
I assume that there is a small change needed to solve the problems, but it happens that if one of the two drop-down menus is not equal to All or if both are not equal to All , then it appears with errors.
Below is the code that displays both the drop-down menus and the query (with the dynamic where clause), which follows depending on the selected parameter:
HTML:
Drop-down menu for students:
<select name="student" id="studentsDrop"> <option value="All">All</option> <option value="11">John May</option> <option value="23">Chris Park</option> </select>
Question Number Dropdown Menu
<select name="question" id="questionsDrop"> <option value="All">All</option> <option value="123">1</option> <option value="124">2</option> <option value="125">3</option> </select>
PHP / Mysqli:
function StudentAnswers() { /*BELOW IS THE QUERY WHERE I AM TRYING TO RETRIEVE DATA DEPENDING ON THE ASSESSMENT CHOSEN AND THEN DEPENDING ON OPTIONS CHOSEN IN STUDENT AND QUESTION NUMBER DROP DOWN MENU */ $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 "; // Initially empty $where = array('q.SessionId = ?'); $parameters = array($_POST["session"]); $parameterTypes = 'i'; // Check whether a specific student was selected if($_POST["student"] !== 'All') { $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"] !== 'All') { $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 call_user_func_array(array($selectedstudentanswerstmt, 'bind_param'), array_merge(array($parameterTypes), $parameters)); //LINE 319 ERROR 1 } //Add group by and order by clause to query $selectedstudentanswerqry .= " GROUP BY sa.StudentId, q.QuestionId ORDER BY StudentAlias, q.SessionId, QuestionNo "; // get result and assign variables (prefix with db) $selectedstudentanswerstmt->execute(); //LINE 328 ERROR 2 //bind database fields $selectedstudentanswerstmt->bind_result($detailsStudentAlias,$detailsStudentForename,$detailsStudentSurname,$detailsSessionId,$detailsQuestionNo, $detailsQuestonContent,$detailsOptionType,$detailsNoofAnswers,$detailsAnswer,$detailsReplyType,$detailsQuestionMarks,$detailsStudentAnswer,$detailsResponseTime, $detailsMouseClick,$detailsStudentMark); //LINE 331 ERROR 3 //store results retrieved $selectedstudentanswerstmt->store_result(); //LINE 332 ERROR 4 //count number of rows retrieved $selectedstudentanswernum = $selectedstudentanswerstmt->num_rows(); //output query echo "$selectedstudentanswerqry"; } ?>
Here is a DEMO: DEMO
In the demo, select a rating from the dropdown menu and submit. You will see two drop-down menus. Save them as All and send, it will display a request without problems. Not in one of the drop-down menus, change All to a specific student or question, then submit. Now you will see errors
VAR DUMP:
Result var_dump(array_merge(array($parameterTypes), $parameters))); when I selected a session (grade) with a value of 31 , a student number value of 40 and a question number value of 81 , AND WHERE CLAUSE WHERE q.SessionId = ? AND sa.StudentId = ? AND q.QuestionId = ? WHERE q.SessionId = ? AND sa.StudentId = ? AND q.QuestionId = ? :
I get this output: array(4) { [0]=> string(3) "iii" [1]=> string(2) "31" [2]=> string(2) "40" [3]=> string(2) "81" }