Ошибки, появляющиеся в коде mysqli и call_user_func_array ()

Я получаю довольно много ошибок при попытке создать динамическое предложение where с помощью mysqli:

Предупреждение: параметр 2 в mysqli_stmt :: bind_param () должен быть ссылкой, значение указано в ... в строке 319

Предупреждение: mysqli_stmt :: execute (): (HY000 / 2031): нет данных для параметров в подготовленном операторе в ... в строке 328

Предупреждение: mysqli_stmt :: bind_result (): (HY000 / 2031): нет данных для параметров в подготовленном выражении в ... в строке 331

Предупреждение: mysqli_stmt :: store_result (): (HY000 / 2014): команды не синхронизированы; вы можете'Запустите эту команду сейчас ... в строке 332

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

Ниже приведен код, отображающий как раскрывающиеся меню, так и запрос (с динамическим предложением где), который следует в зависимости от выбранных параметров:

HTML:

Студент Раскрывающееся меню:


All
John May
Chris Park

Номер вопроса Выпадающее меню


All
1
2
3

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";

        }

        ?>

Вот ДЕМО: DEMO

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

VAR DUMP:

Результатvar_dump(array_merge(array($parameterTypes), $parameters))); когда я выбрал сессию (оценку) со значением31, значение номера студента40и значение номера вопроса81И ГДЕ ОГОВОРКА:WHERE q.SessionId = ? AND sa.StudentId = ? AND q.QuestionId = ?

Я получаю этот вывод:array(4) { [0]=> string(3) "iii" [1]=> string(2) "31" [2]=> string(2) "40" [3]=> string(2) "81" }

Ответы на вопрос(3)

Ваш ответ на вопрос