【问题标题】:$stmt->bind_param($params) possible?$stmt->bind_param($params) 可能吗?
【发布时间】:2012-02-20 14:46:04
【问题描述】:

我的函数看起来是这样的。

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

对于每个 switch case $params ($stmt-&gt;bind_param($params);) 必须不同。

所以我想做的是在switch 内部创建$params

$params='"i"'.$id; 

那就这样用吧

$stmt->bind_param($params);

这可能吗?

【问题讨论】:

    标签: php mysql mysqli prepared-statement switch-statement


    【解决方案1】:

    我真的不知道这是否是您想要的,但只需将 prepare() 和 bind_param() 调用放在 case-statement 中即可:

    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"]);
    

    在调用 bind_param 语句时,您似乎必须提供所有变量。您仍然可以使用可变数量的参数调用 bind_param。请参阅http://php.net/manual/de/mysqli-stmt.bind-param.php 上的 cmets 以获取解决方案。

    【讨论】:

      【解决方案2】:

      您可以在每个 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;
      }
      

      【讨论】:

      • 我知道这一点。但也许有可能用我的想法摆脱多余的代码?
      • 好吧,无论如何它都需要额外的代码来摆脱冗余代码
      【解决方案3】:

      也许它不再帮助 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 [,..]);
      

      【讨论】:

        【解决方案4】:

        是的,这很有可能,但我建议不要使用 mysqli 并转移到 PDO,这正是您要求的方式:

        $stmt = $db->prepare($sql);
        $stmt->execute($params);
        $data = $stmt->fetchAll();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-04
          • 2020-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-01
          相关资源
          最近更新 更多