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

如何在PHP中抽象mysqli准备的语句?

  •  2
  • DisgruntledGoat  · 技术社区  · 15 年前

    我使用自己的类进行数据库查询,扩展mysqli:

    class iDatabase extends mysqli
    {
        public  $errorMsg;
        private $totalQueries;
        private $stmt;
    
        public function __construct()
        {
            parent::__construct( 'localhost', 'asd', 'asd', 'asd' );
    
            if ( mysqli_connect_errno() )
            {
                $this->errorMsg = 'Could not connect to server.<br /><i>' . mysqli_connect_error() . '</i>.';
                return;
            }
    
            parent::query( 'SET NAMES utf8' );
        }
    
    }
    

    但是,在执行查询和返回结果时,我遇到了麻烦。我正在使用准备好的语句,但是值和结果的绑定方式让我困惑。经过一番研究,我想出了一个接受查询和参数的函数:

    public function psQuery( $query, $params )
    {
        $this->stmt = parent::prepare( $query );
        call_user_func_array( array($this->stmt,'bind_param'), $params );
        $this->stmt->execute();
    }
    

    我的问题是,从中得到结果的最好方法是什么?我需要使用bind_result,然后提取每一行,然后关闭语句。我宁愿为每一行得到一个关联数组-这是可能的吗?

    3 回复  |  直到 11 年前
        1
  •  4
  •   Bill Karwin    15 年前

    我在工作 Zend_Db_Adapter_Mysqli Zend_Db_Statement_Mysqli 因为我们想让它符合 PDO PDOStatement 接口。这相当困难,因为mysqli坚持让您绑定变量以获得结果的方式令人困惑,以及 P住院 .

    如果你想看到代码 Zend_Db ,特别注意功能 Zend_Db_Statement_Mysqli::_execute() fetch() . 基本上, _execute() 方法使用绑定变量引用数组 call_user_func_array() . 复杂的部分是必须初始化数组,以便 bind_result() 函数获取引用。呃,这还不完全清楚,去看看代码吧。

    或者使用PDO的MySQL驱动程序。这就是我穿你的鞋要做的。

        2
  •  1
  •   karim79    15 年前

    我会看一下 Zend_Db 尤其是 mysqli adapter 看看他们是怎么做的。

        3
  •  0
  •   Kamil Szot    15 年前

    似乎您必须按照您所说的“我需要使用bind\u result,然后提取每一行,然后关闭语句”。

    我认为没有更简单的方法。