mysqli_prepare VS PDOmysqli_prepare VS PDO(mysqli_

2019-05-12 14:27发布

背景

我试图写一个函数查询

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

我可以打电话进行简单的查询。 所有的MySQL查询在功能

grab_sql()

所有的结合发生在函数bind()

call_user_func_array需要所以我写了引用才能正常工作ref_arr以适应。

问题是,我没有得到的结果反馈,我需要 - 他们在下面的结果公布。 我认为这个问题是在绑定的reuslts的,因为我在该部件种类的猜测。

研究

  • 预处理语句上的信息在这里
  • 在信息call_user_func_array 这里
  • 对引用的neccessity信息call_user_func_array 这里

:我怎样才能修改此代码以正确的得到正确的结果?

  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');
?>

结果

该值导致似乎是(最后两个值)NULL和&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 
} 

Answer 1:

是的,写一个通用的mysqli的结合,这个阵列 - 到 - 一个查询是皇室的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和分配。 我从来没有完全明白为什么,但这只是它的工作方式。 PHP裁判是相当神秘和难以理解。

这可能不是一个可行的建议,如果你坚持已启用,但没有PDO的mysqli的环境中,但你真的应该考虑使用PDO来代替。 PDO需要照顾很多关于你的工作的; 可以简单地传递值的阵列来PDOStatement::execute()用于与参数的准备好的查询。 对我来说,这是更容易使用PDO比mysqli的这一特定用途。

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

PS:我希望你不存储明文口令 。



文章来源: mysqli_prepare vs PDO
标签: php mysqli