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 estudiante40
y el valor del número de la pregunta81
Y 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" }