mysqli_prepare与PDO

时间:2011-09-12 04:29:23

标签: php mysqli

背景

我正在尝试编写函数查询

query('type', 'parameters', 'bind_types')

我可以打电话来进行简单的查询。所有mySQL查询都在函数

grab_sql()

所有绑定都发生在函数bind()

call_user_func_array需要正确引用函数,所以我写了ref_arr来容纳。

问题是我没有得到我需要的结果 - 它们在结果下面发布。我认为问题在于重新绑定,正如我在那部分猜到的那样。

研究

  • 有关准备好的陈述的信息here
  • 有关call_user_func_array here
  • 的信息
  • 有关call_user_func_array here
  • 参考资料的必要性的信息

问题:如何修改此代码以正确获取正确的结果?

CODE

  function ref_arr(&$arr)
    { 
    $refs = array(); 
    foreach($arr as $key => $value) 
      {  
      $refs[$key] = &$arr[$key];
      } 
    return $refs;}      

  public function bind($query, $input_param, $btypes)
    {   
    $a="test_var1";$b="test_var2";
    $output_arr=array($a,$b);
    $input_ref = $this->ref_arr($input_param);
    $output_ref = $this->ref_arr($output_arr);
    if($statement=mysqli_prepare(one::$db, $query)) 
      {
      array_unshift($input_ref, $statement, $btypes);
      call_user_func_array("mysqli_stmt_bind_param", $input_ref);
      mysqli_stmt_execute($statement);
      array_unshift($output_ref, $statement);
      call_user_func_array("mysqli_stmt_bind_result", $output_ref);
      mysqli_stmt_fetch($statement);
      var_dump($output_ref);  
      mysqli_stmt_close($statement);
      }
    }
  public function grab($type)
    {
    switch($type) 
      {
      case "validate_user":
        $query="SELECT email,pass FROM cr WHERE email=? AND pass=?";
        break;
      case "another_query_type":
        break;
      }
    return $query;
    }
  public function query($qtype, $arg_arr, $btypes)
    {
    return self::bind(self::grab_sql($qtype), $arg_arr, $btypes);
    }
  }

测试案例

<?php
  require_once 'p0.php'; 
  $db_ = new database();
  $db_->query('validate_user',array('joe@gmail.com','Password'), 'ss');
?>

结果

值结果似乎是(最后两个值)&amp; NULL和&amp; NULL。

array(3) { [0]=> object(mysqli_stmt)#2 (9) {  
    ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(2) ["field_count"]=> int(2) ["errno"]=> int(0) ["error"]=> string(0) "" ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) } [1]=> &NULL [2]=> &NULL 
} 

1 个答案:

答案 0 :(得分:2)

是的,在Mysqli中编写一个通用的bind-this-array-into-a-query是一个皇家PITA。当我编写Zend Framework的mysqli适配器时,我最终得到了它,但它需要做很多工作。欢迎您查看代码。我看到一个主要区别,这是我如何做参考:

$stmtParams = array();
foreach ($params as $k => &$value) {
    $stmtParams[$k] = &$value;
}
call_user_func_array(
    array($this->_stmt, 'bind_param'), // mysqli OO callback
    $stmtParams
);

这与你的略有不同。我想知道在你的代码中,ref运算符&是否比数组索引[]运算符更紧密地绑定。

注意我还必须在foreach和赋值中使用ref运算符。我从来没有完全理解为什么,但这是唯一可行的方法。 PHP refs非常神秘且难以理解。

如果您遇到启用了Mysqli而不是PDO的环境,这可能不是一个可行的建议,但您应该考虑使用PDO。 PDO会为您处理大量工作;您只需将值数组传递给PDOStatement::execute(),即可获得带参数的预准备查询。对我来说,使用PDO比使用mysqli要容易得多。

$pdoStmt->execute( array('joe@gmail.com','Password') );  // it's that easy

P.S。:我希望你是not storing passwords in plaintext