回答への参照をたどろうとしていますが、どのように書くべきかわかりません:
empty() は '0' を空とみなすので、 $p_student = empty($_POST["student"])?'':$_POST["student"]; のようになります。$p_student は、$_POST["student"] が '0' の場合に true です...結果として、以下の場合は常に 'default' になるため、empty() および大丈夫だと思います... (もちろん、$p_student と $p_question の両方についてです...)
上記の例に一致するようにケースステートメントを設定しましたが、私の質問は、上記の例に応じて $p_student をどのように記述すればよいですか?
私の試み:
// Check whether a specific student was selected
$p_student = empty($_POST["student"])?'0':$_POST["student"];
switch($p_student){
case -1:
//dont' add where filters
break;
default:
$where[] = 'sa.StudentId = ?';
$parameters[] .= $_POST["student"];
$parameterTypes .= 'i';
}
アップデート:
私がやろうとしていたのは、All
オプションの場合はケース -1 を実行し、それ以外の場合はデフォルトを実行することです。これが、ドロップダウン値でこの質問をしている理由です。
学生:
<select name="student" id="studentsDrop">
<option value="-1">All</option>
<option value="39">Luke Mcfadzen</option>
<option value="40">Chris Tucker</option>
</select>
質問:
<select name="question" id="questionsDrop">
<option value="-1">All</option>
<option value="72">1</option>
<option value="73">2</option>
</select>
ユーザーがすべての学生を選択するか、個々の学生を選択するか、すべての質問を選択するか、個々の質問を選択するかどうかに応じて、動的なwhere句が試みられています。個人の場合は、where句を使用して学生を検索し、質問についても同じです。すべての学生の場合、where条件は必要ありません特定の学生を探しているわけではないため、これは質問に対しても同じように機能します。クエリには、必須の WHERE 条件チェックがあります。q.SessionId = ?
次のようなエラーが表示されます。
$selectedstudentanswerqry = "
SELECT
sa.StudentId, StudentAlias, StudentForename, ...
FROM Student st
...
";
// Initially empty
$where[] = "q.SessionId = ?";
$parameters[] = $_POST["session"];
$parameterTypes = 'i';
//check if POST is empty
// Check whether a specific student was selected
//LINE 345 ERROR
$student_id = (isset($_POST['student'])) ? $mysqli->real_escape_string(trim($_POST['student'])) : null ;
if (is_numeric($student_id)){ //If student ID is a numeric value
$where[] = "sa.StudentId = ?" ;
$parameters[] = ((int)$student_id == -1) ? "sa.StudentId" : $student_id ;
$parameterTypes .= "i" ;
}
// Check whether a specific question was selected
$question_id = (isset($_POST['question'])) ? $mysqli->real_escape_string(trim($_POST['question'])) : null ;
if (is_numeric($question_id)){ //If student ID is a numeric value
$where[] = "q.QuestionId = ?" ;
$parameters[] = ((int)$question_id == -1) ? "q.QuestionId" : $question_id ;
$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
if (count($where) == 1) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]);
}
else if (count($where) == 2) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]);
}
else if (count($where) == 3) {
$selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1], $parameters[2]);
}
}
$selectedstudentanswerqry .= "
GROUP BY sa.StudentId, q.QuestionId
ORDER BY StudentAlias, q.SessionId, QuestionNo
";
// get result and assign variables (prefix with db)
$selectedstudentanswerstmt->execute();
$selectedstudentanswerstmt->bind_result(...);
$selectedstudentanswerstmt->store_result();
$selectedstudentanswernum = $selectedstudentanswerstmt->num_rows();