mysqliを使用して動的where句を作成しようとすると、かなりの数のエラーが発生します。
警告:mysqli_stmt :: bind_param()のパラメーター2は参照であると予想され、値は319行目の...で指定されています
警告:mysqli_stmt :: execute():(HY000 / 2031):328行目の...のプリペアドステートメントのパラメーターにデータが提供されていません
警告:mysqli_stmt :: bind_result():(HY000 / 2031):331行目の...のプリペアドステートメントのパラメーターにデータが提供されていません
警告:mysqli_stmt :: store_result():(HY000 / 2014):コマンドが同期していません。332行目の...でこのコマンドを実行することはできません。
問題を解決するために必要な変更が少しあると思いますが、2つのドロップダウンメニューのいずれかが等しくないAll
場合、または両方が等しくない場合はAll
、エラーが発生します。
以下は、選択したn個のオプションに応じて、ドロップダウンメニューとそれに続くクエリ(動的where句を使用)の両方を表示するコードです。
HTML:
学生ドロップダウンメニュー:
<select name="student" id="studentsDrop">
<option value="All">All</option>
<option value="11">John May</option>
<option value="23">Chris Park</option>
</select>
質問番号ドロップダウンメニュー
<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";
}
?>
これがデモです: デモ
デモでは、ドロップダウンメニューから評価を選択して送信します。2つのドロップダウンメニューが表示されます。両方を設定しAll
て送信すると、問題なくクエリが出力されます。ドロップダウンメニューのいずれかでいいえAll
、特定の学生または質問に変更してから送信してください。これでエラーが表示されます
VARダンプ:
値、学生番号の値、質問番号の値var_dump(array_merge(array($parameterTypes), $parameters)));
を使用してセッション(評価)を選択したときの結果、およびWHERE CLAUSE :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" }