Php $stmt->;绑定参数($params)是否可能?
我的函数看起来是这样的Php $stmt->;绑定参数($params)是否可能?,php,mysql,mysqli,prepared-statement,switch-statement,Php,Mysql,Mysqli,Prepared Statement,Switch Statement,我的函数看起来是这样的 if (isset($_POST['type'])) { switch ($_POST['type']) { case "qsubject": $sql = "SELECT id, name FROM chapters WHERE subject_id=?"; break; case "qchapters": $sql = "SELECT id, name FR
if (isset($_POST['type'])) {
switch ($_POST['type']) {
case "qsubject":
$sql = "SELECT id, name FROM chapters WHERE subject_id=?";
break;
case "qchapters":
$sql = "SELECT id, name FROM sections WHERE subject_id=? AND chapter_id=?";
break;
case "qsections":
$sql = "SELECT id, name FROM paragraphs WHERE subject_id=? AND chapter_id=? AND section_id=?";
break;
}
$stmt = $db->prepare($sql) or die($db->error());
$stmt->bind_param("i", $id);
$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();
}
然后像这样使用它
$stmt->bind_param($params);
这可能吗?我不知道这是否是您想要的,但只需将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();
}
似乎在调用bind_param语句时必须提供所有变量。您仍然可以使用变量计数的参数调用bind_param。有关解决方案,请参阅上的注释。您可以在每个case语句中绑定参数,如下所示:
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, $id1);
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, $id1, $id2);
break;
}
也许这对OP没有任何帮助,但我猜他真正想要的是动态创建一个数组(参数长度可变)来绑定 这可以通过使用
call_user_func_array()
简短示例:
call_user_func_array(array($stmt, 'bind_param'),
array_merge(array($bindParamsString), $paramsToBind));
其中变量$bindParamsString
对应于参数类型(例如“iis”),参数$paramsToBind
是一个数组,其中包含对要绑定的值的引用:
$paramsToBind = array(&myFirstValue [,&mySecondValue [,..]);
是的,这是很有可能的,但我建议不要使用mysqli,而改为PDO,这正是您要求的方式:
$stmt = $db->prepare($sql);
$stmt->execute($params);
$data = $stmt->fetchAll();
我知道这一点。但也许用我的想法可以去掉多余的代码?好吧,无论如何,它都需要额外的代码来去掉多余的代码
$paramsToBind = array(&myFirstValue [,&mySecondValue [,..]);
$stmt = $db->prepare($sql);
$stmt->execute($params);
$data = $stmt->fetchAll();