1

mysqli_prepeare()データベースにクエリを実行するための独自のライブラリを作成していて、メソッドをカプセル化したいmysqli_bindのですが、動的な数のパラメーターを持つ汎用メソッドを作成したいと考えています。つまり、たとえば次のように渡すことができます。

array("is", $integerId, $stringName). 

私が見つけた唯一の解決策は次のとおりです。

function prepeare($notEscapedSql, $attrs)
{
    $query = mysqli_prepare($this->dbConn, $notEscapedSql);

    $ref = new ReflectionClass('mysqli_stmt'); 
    $method = $ref->getMethod("bind_param"); 
    $method->invokeArgs($query,$attrs); 

}

以前のバージョンのphpではサポートされていないリフレクションを使用しているため、この問題を解決するエレガントな方法ではないため、デバッグにあまり時間をかけませんでした。解決策や提案はありますか?

4

2 に答える 2

2

これを行うためにReflectionクラスを使用する理由と、オブジェクト$queryを返す which を使用しなかった理由がわかりません。mysqli_stmt

さらに、配列を 2 番目のパラメーターinvokeArgsとして取ります。そのため、関数の 2 番目のパラメーターでcall_user_func_arraytypehint を使用することをお勧めします。arrayprepeare

以下を使用できますcall_user_func_array

function prepeare($notEscapedSql, array $attrs)
{
    $mysqli_stmt = mysqli_prepare($this->dbConn, $notEscapedSql);
    call_user_func_array(array($mysqli_stmt, "bind_param"), $attrs);
    return $mysqli_stmt;
}
于 2013-05-18T20:13:47.513 に答える
1

call_user_func_array を使用しない理由は、遅いからです。リフレクションは新しいですが、より高速です。bind_param を動的に呼び出すのはちょっと面倒ですが、コメントにたくさんの例があります。

http://php.net/manual/en/mysqli-stmt.bind-param.php

基本的に、次のようなことを行う必要があります。

//arrays
$paramList = some array of parameters.
$binderList = array();
$tmpList = array();

//reflection
$ref = new ReflectionClass('mysqli_stmt'); 
$method = $ref->getMethod("bind_param");

    //loop through and perform pointer arithmetic. I know, this is horrible
    for($i=0; $i<$numParams; $i++) {
    $tmp = $paramList[$i];
    $tmpList[] = $tmp;
    $binderList[] = &$tmpList[$i]
    }

//invoke the bind_param dynamically and execute.
$method->invokeArgs($res,$binderList);   
$res->execute();  
于 2013-07-25T20:54:57.293 に答える