如何在PHP中抽象mysqli预处理语句?

时间:2009-09-07 00:47:00

标签: php mysql prepared-statement

我正在使用自己的类进行数据库查询,扩展了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 个答案:

答案 0 :(得分:4)

由于我们希望使其符合Zend_Db_Adapter_MysqliZend_Db_Statement_Mysqli接口,因此我在PDOPDOStatement类上工作了很多工作。这非常费力,因为MySQLi坚持让你绑定变量以获得结果的混乱方式,以及PDOStatement支持的各种获取模式。

如果您想查看Zend_Db中的代码,请特别注意这些功能 Zend_Db_Statement_Mysqli::_execute()fetch()。基本上,_execute()方法使用call_user_func_array()绑定变量引用数组。棘手的部分是你必须初始化数组,以便bind_result()函数获取引用。呃,那不是很清楚,所以去看看代码。

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

答案 1 :(得分:1)

我会看看Zend_Db的实施情况,特别是mysqli adapter,看看他们是如何做的。

答案 2 :(得分:0)

看来你必须做你所说的“我需要使用bind_result,然后获取每一行,然后关闭语句”

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