扩展mysqli_stmt以使用自定义的mysqli_result

Ivo*_*Ivo 7 php mysql oop mysqli

我一直在寻找这个问题的答案,但似乎以前没有人能解决这个问题.也许你们中的一些人能够并愿意帮我解决这个问题......那太好了!

我目前正在研究一个mysqli包装器并尝试为已准备好的语句实现自定义结果类,就像我已经为标准查询做的那样!似乎结果是在stmt的"执行"方法中生成的,但我仍然无法理解幕后发生了什么!

有没有办法(或黑客)将生成的结果指向我的结果类而不是普通的mysqli_result,就像使用常规查询一样?

只是为了得到一个想法,这里有一些来自代码的粘贴:

class extended_mysqli extends mysqli
{
    public function __construct()
    {
        call_user_func_array(array(get_parent_class($this), 'mysqli'), func_get_args());

        if ( $this->connect_errno )
        {
            throw new extended_mysqli_exception('database connection failure');
        }
    }

    public function query ($query, $binds = array())
    {
        if ( empty( $binds ) )
        {
            if ( $this->real_query($query) )
            {
                if ( $this->field_count )
                {
                    return new extended_mysqli_result($this, $query); // select, show, describe
                }
                else return true; // insert, update, delete
            }
            else return false; // fix 
        }
        else
        {
            $stmt = $this->prepare($query);

            if ( $stmt->bind_array($binds) )
            {
                return $stmt->execute() ? $stmt->get_result() : false;
            }
            else return false; 
        }
    }

    public function prepare($query)
    {
        return new extended_mysqli_stmt($this, $query);
    }

    // ...
}

class extended_mysqli_stmt extends mysqli_stmt
{
    public function __construct($link, $query)
    {
        parent::__construct($link);

        $this->prepare($query);
    }

    public function execute()
    {
        //  what do i do here ???
    }
}

class extended_mysqli_result extends mysqli_result implements countable, iterator, arrayaccess
{
    public function __construct($link, $mode = MYSQLI_STORE_RESULT)
    {
        parent::__construct($this->link = $link, $mode);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

小智 1

这些类按原样使用,因此如果您想要自己的 mysqli 实现,您应该使用 mysqli_* 函数编写自己的包装器。

mysqli 对象可以扩展,但如果您希望对其结构或层次结构进行任何更改,这种方法最终将失败。

此外,大多数方法都信任您的输入数据,因此,如果您尝试维护安全连接,为什么不尝试 999 个数据库抽象层之一并扩展该代码,使其满足您的需求呢?