8

私はかなり長い間これに対する答えを探していましたが、これまで誰もこの問題を回避できなかったようです. 多分あなたの何人かはこれについて私を助けることができ、喜んで助けてくれます...それは素晴らしいことです!

私は現在、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);
    }

    // ...
}
4

1 に答える 1

1

これらのクラスはそのまま使用するように設定されていたので、mysqli の独自の実装が必要な場合は、mysqli_* 関数を使用して独自のラッパーを作成する必要があります。

mysqli オブジェクトは拡張できますが、その構造または階層を変更したい場合、このアプローチは最終的に失敗します。

また、これらのメソッドのほとんどは入力データを信頼するため、安全な接続を維持しようとしている場合は、世の中にある 999 のデータベース抽象化レイヤーの 1 つを試して、ニーズに合うようにそのコードを拡張してみませんか?

于 2012-12-05T12:28:47.233 に答える