Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php $stmt->;绑定参数($params)是否可能?_Php_Mysql_Mysqli_Prepared Statement_Switch Statement - Fatal编程技术网

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();