代码之家  ›  专栏  ›  技术社区  ›  Alnitak

混合使用PHP的mysqli数据访问函数?

  •  0
  • Alnitak  · 技术社区  · 17 年前

    在过去的几天里,我看到了几个问题 mysqli 但答案似乎没有认识到两者之间的区别 $stmt->execute() 和 $db->query() .

    据我所知,有两种不同的模型用于访问数据库中的结果 mysqli .

    这一个使用原始SQL并要求程序员转义输入以防止SQL注入攻击,但允许程序员检索包含以下内容的关联数组(或普通数组) column => value 映射:

    $result_set = $db->query("SAFE SQL QUERY HERE");
    while ($row = $result_set->fetch_assoc()) {
         # do something with $row['fieldname'];
    }  
    

    或者,您也可以这样做,这样可以很好地绑定参数和结果,但不能(AFAIK)提供任何类型的简单数组结果:

    $stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
    $stmt->bind_param("s", $input_variable);
    $stmt->execute();
    $stmt->bind_results($output_col1, $output_col2);
    while ($stmt->fetch()) {
         # do something with $output_col1 and $output_col2
    }
    

    mysqli 要获得第一个模式中显示的简单阵列输出,但仍按照第二个模式使用安全绑定的输入参数?

    我找不到任何方法来执行此操作(除了使用 PDO 相反!)。

    3 回复  |  直到 17 年前
        1
  •  1
  •   Travis Leleu    17 年前

    另外,您不能将整个数组自动绑定到获取的结果。不幸地但是,如果要从中查找数组行为(可能这样更容易传递结果),可以尝试以下方法:

    <?php
     $dbh = new mysqli( ... );
     $arr = array();
     if( $stmt = $dbh->prepare( 'SELECT id, email FROM email_list' );
     {
      $stmt->execute();
      $stmt->bind_result( $arr['id'], $arr['email'] );
    
      while( $stmt->fetch() )
       DoSomething( $arr );
     }
    ?>
    

    这将为您提供上述要求的行为。但是,它不会将数组字段动态绑定到数组中的关联索引——也就是说,您必须指定id绑定到$arr['id'],等等。

    如果场景确实需要对关联索引进行动态绑定,则始终可以编写一个简单的类,该类将首先解析所选字段的查询,然后设置关联数组索引,然后执行查询。

        2
  •  1
  •   Chad Birch    17 年前

    在php手册本页的注释中,有多个函数实现可以实现这类功能: mysqli_stmt::fetch

        3
  •  0
  •   Jeremy DeGroot    17 年前

    我会说不。我想我还没有和你一起工作过 mysqli 或者准备好的陈述,我相信你的第二个例子中的每一步都是离散的和必要的。我能给你的唯一安慰是,你的第一个例子掩盖了一些SQL转义,你可以在第二个例子中安全而真实地忽略它们。