Errores que aparecen en el código mysqli y call_user_func_array ()

Recibo algunos errores al intentar crear una cláusula dinámica donde se utiliza mysqli:

Advertencia: se espera que el parámetro 2 de mysqli_stmt :: bind_param () sea una referencia, el valor se indica en ... en la línea 319

Advertencia: mysqli_stmt :: execute (): (HY000 / 2031): No se proporcionaron datos para los parámetros en la declaración preparada en ... en la línea 328

Advertencia: mysqli_stmt :: bind_result (): (HY000 / 2031): No se proporcionaron datos para los parámetros en la declaración preparada en ... en la línea 331

Advertencia: mysqli_stmt :: store_result (): (HY000 / 2014): Comandos no sincronizados; no puede ejecutar este comando ahora en ... en la línea 332

Supongo que se necesita un pequeño cambio para resolver los problemas, pero lo que ocurre es que si uno de los dos menús desplegables no es igualAll o si ambos no son igualesAll Entonces se le ocurren los errores.

A continuación se muestra el código que muestra los menús desplegables y la consulta (con la cláusula dinámica dónde) que sigue dependiendo de las n opciones seleccionadas:

HTML:

Menú desplegable de estudiantes:

<select name="student" id="studentsDrop">
<option value="All">All</option>
<option value="11">John May</option>
<option value="23">Chris Park</option>
</select>

Número de pregunta Menú desplegable

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

        }

        ?>

Aquí hay una DEMO: MANIFESTACIÓN

En la demostración, seleccione una evaluación del menú desplegable y envíe. Verás los dos menús desplegables. Mantenlos ambos comoAll y enviar, dará salida a la consulta sin problemas. No en uno de los menús desplegables, cambiarAll a un estudiante específico o pregunta, luego enviar. Ahora verás los errores.

VAR DUMP:

El resultado de lavar_dump(array_merge(array($parameterTypes), $parameters))); Cuando elegí la sesión (evaluación) con valor31, valor del número de estudiante40y el valor del número de la pregunta81Y DONDE CLAUSULAWHERE q.SessionId = ? AND sa.StudentId = ? AND q.QuestionId = ?:

Estoy recibiendo esta salida:array(4) { [0]=> string(3) "iii" [1]=> string(2) "31" [2]=> string(2) "40" [3]=> string(2) "81" }

Respuestas a la pregunta(3)

Su respuesta a la pregunta