Я не знаю, действительно ли это то, что вам нужно, но просто поместите вызовы prepare () и bind_param () внутри оператора case:
if (isset($_POST['type'])) {
switch ($_POST['type']) {
case "qsubject":
$sql = "SELECT id, name FROM chapters WHERE subject_id=?";
$stmt = $db->prepare($sql) or die($db->error());
$stmt->bind_param("i", $id);
break;
case "qchapters":
$sql = "SELECT id, name FROM sections WHERE subject_id=? AND chapter_id=?";
$stmt = $db->prepare($sql) or die($db->error());
$stmt->bind_param("ii", $id, $chapter_id);
break;
case "qsections":
$sql = "SELECT id, name FROM paragraphs WHERE subject_id=? AND chapter_id=? AND section_id=?";
$stmt = $db->prepare($sql) or die($db->error());
$stmt->bind_param("iii", $id, $chapter_id, $section_id);
break;
}
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$stmt->bind_result($chp_id, $name);
echo '<option value="#"></option>';
while ($stmt->fetch())
echo '<option value="' . $chp_id . '">' . $name . '</option>';
}
else
echo 0;
$stmt->close();
}
вы делаете 3 разных запроса,так что вполне нормально иметь 3 разных вызова prepare () -.
, если вы не можете использовать этот подход, вы также можете создать простой массив для хранения ваших параметров.
$params = array();
case "qsubject":
$params[] = array("type"=>"i", "value"=>$id);
break;
case "qchapters":
$params[] = array("type"=>"i", "value"=>$id);
$params[] = array("type"=>"i", "value"=>$chapter_id);
break;
// probably won't work, see text below.
foreach ($params as $param)
$stmt->bind_param($param["type"], $param["value"]);
itКажется, что вы должны предоставить все переменные при вызове оператора bind_param.Вы все еще можете вызвать bind_param с переменным количеством аргументов.см. комментарии к http://php.net/manual/de/mysqli-stmt.bind-param.php.