Fehler in mysqli code und call_user_func_array ()

Beim Versuch, eine dynamische where-Klausel mit mysqli zu erstellen, treten einige Fehler auf:

Warnung: Parameter 2 für mysqli_stmt :: bind_param () sollte eine Referenz sein. Der Wert wird in ... in Zeile 319 angegeben

Warnung: mysqli_stmt :: execute (): (HY000 / 2031): Keine Daten für Parameter in vorbereiteter Anweisung in ... in Zeile 328 angegeben

Warnung: mysqli_stmt :: bind_result (): (HY000 / 2031): Keine Daten für Parameter in vorbereiteter Anweisung in ... in Zeile 331 angegeben

Warnung: mysqli_stmt :: store_result (): (HY000 / 2014): Befehle nicht synchron; Sie können diesen Befehl jetzt nicht in Zeile 332 ausführen

Ich nehme an, es ist eine kleine Änderung erforderlich, um die Probleme zu lösen, aber was passiert, wenn eines der beiden Dropdown-Menüs nicht gleich istAll oder wenn beide nicht gleich sindAll dann kommt es mit den Fehlern auf.

Im folgenden Code werden sowohl die Dropdown-Menüs als auch die Abfrage (mit dynamischer where-Klausel) angezeigt, die abhängig von den n ausgewählten Optionen folgt:

HTML:

Schüler Dropdown-Menü:

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

Fragenummer Dropdown-Menü

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

        }

        ?>

Hier ist eine DEMO: DEMO

Wählen Sie in der Demo ein Assessment aus dem Dropdown-Menü aus und senden Sie es ab. Sie sehen die beiden Dropdown-Menüs. Behalten Sie beide alsAll und abschicken, es wird eine Abfrage ohne Probleme ausgegeben. Nein, in einem der Dropdown-Menüs ändernAll an einen bestimmten Schüler oder eine bestimmte Frage weiterleiten. Jetzt sehen Sie die Fehler

VAR DUMP:

Das Ergebnis dervar_dump(array_merge(array($parameterTypes), $parameters))); als ich Sitzung (Einschätzung) mit Wert wählte31Wert der Schülernummer40, und Fragennummer81UND WO KLAUSELNWHERE q.SessionId = ? AND sa.StudentId = ? AND q.QuestionId = ?:

Ich erhalte diese Ausgabe:array(4) { [0]=> string(3) "iii" [1]=> string(2) "31" [2]=> string(2) "40" [3]=> string(2) "81" }

Antworten auf die Frage(3)

Ihre Antwort auf die Frage