Php 创建动态WHERE子句时出现mysqli警告
我试图创建一个带有动态where子句的查询。该查询有一个默认where子句,无论从Php 创建动态WHERE子句时出现mysqli警告,php,mysqli,Php,Mysqli,我试图创建一个带有动态where子句的查询。该查询有一个默认where子句,无论从学生和问题`下拉菜单中选择哪个选项,它都将始终检查SessionId=? 然后我有一个php代码,如果用户选择了一个学生或一个问题(或者换句话说,没有在学生下拉菜单中选择All,或者用户没有在问题下拉菜单中选择All)。如果在两个下拉菜单中选择了All`选项,则不会将这些参数添加到WHERE子句中 无论如何,在尝试执行此操作时,我会遇到以下错误: Warning: mysqli::prepare(): (42000
学生和问题`下拉菜单中选择哪个选项,它都将始终检查SessionId=?
然后我有一个php代码,如果用户选择了一个学生或一个问题(或者换句话说,没有在学生下拉菜单中选择All
,或者用户没有在问题下拉菜单中选择All)。如果在两个下拉菜单中选择了
All`选项,则不会将这些参数添加到WHERE子句中
无论如何,在尝试执行此操作时,我会遇到以下错误:
Warning: mysqli::prepare(): (42000/1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE q.SessionId = ?' at line 15 in ... on line 320
Fatal error: Call to a member function bind_param() on a non-object in ... on line 322
我的问题是,为了修复错误,我需要在下面的mysqli和php代码中整理什么
下面是带有注释的代码,用于显示错误所在的行号:
$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';
}
$selectedstudentanswerqry .= "
GROUP BY sa.StudentId, q.QuestionId
ORDER BY StudentAlias, q.SessionId, QuestionNo
";
// 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); //line 320 error
// You only need to call bind_param once
$selectedstudentanswerstmt->bind_param($parameterTypes,implode($parameters)); //line 322 error
}
// get result and assign variables (prefix with db)
$selectedstudentanswerstmt->execute();
$selectedstudentanswerstmt->bind_result($detailsStudentAlias,$detailsStudentForename,$detailsStudentSurname,$detailsSessionId,$detailsQuestionNo,
$detailsQuestonContent,$detailsOptionType,$detailsNoofAnswers,$detailsAnswer,$detailsReplyType,$detailsQuestionMarks,$detailsStudentAnswer,$detailsResponseTime,
$detailsMouseClick,$detailsStudentMark);
$selectedstudentanswerstmt->store_result();
$selectedstudentanswernum = $selectedstudentanswerstmt->num_rows();
它看起来像是你在做你的分组和排序,在你的WHERE语句之前
试着把这些线
$selectedstudentanswerqry .= "
GROUP BY sa.StudentId, q.QuestionId
ORDER BY StudentAlias, q.SessionId, QuestionNo
";
在你的if声明之后
if(!empty($where)) {
...
}
回显您的查询,其中
不在正确的位置,它位于分组依据之前
在完成构建后回显$selectedstudentanswery,因此最后的$selectedstudentanswery值将很有帮助。