2

クラスのメソッドに可変数の引数を渡そうとしています。これが私が呼び出そうとしているクラスの関数です:

class DbHelper{
....
    public function Execute($query, $params){
        $this->open();
        $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
        call_user_func_array(array($stmt, 'bind_param'), $params);  // 1
        return $stmt->execute() ? $stmt->num_rows : 'ERROR';
    }
....
}

関数を呼び出すために使用しているコードは次のとおりです。

....
$conn = new DbHelper();
$params = array('ss', $ID, $i);
$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', $params);
....

これによりエラーが発生します:

警告:mysqli_stmt :: bind_param()へのパラメーター2は参照であると予想され、値はオンラインの..mypath ..\dbhelper.phpで指定されます

数か月前の同じ問題に関する私の別の投稿(ここをクリックでは、以下のコードを使用するように提案された人もいます。

call_user_func_array(array($stmt, 'bind_param'), refValues($params));

function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0){ //Reference is required for PHP 5.3+
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}

これを再度使用すると、同じエラーが発生します。このような関数を呼び出すと($ paramsの前に&を追加):

$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', &$params); // 2

このエラーが発生します:

非推奨:呼び出し時の参照渡しは、オンラインの..mypath ..\save.phpで非推奨になりました

あるいは、私は関数のこの定義を試しましたDbHelper::Execute

public function Execute($query, $params){
    $this->open();
    $stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
    $stmt->{'bind_param'}($params); // 3
    return $stmt->execute() ? $stmt->num_rows : 'ERROR';
}

これを呼び出すと、エラーは次のように表示されます。

警告:オンラインの..mypath ..\dbhelper.phpにあるmysqli_stmt::bind_param()のパラメーター数が間違っています

一方、関数が適切に呼び出されている場合、パラメーター数はbind_paramに対して正しいです。

PHPのバージョンは5.3.8です。

何か助けてください?

4

1 に答える 1

3

あなたに提案された機能は、参照によっても受け入れる必要が$paramsあります。わずかに更新されたバージョンは次のとおりです。

function refValues(&$arr)
{
    //Reference is required for PHP 5.3+
    if (strnatcmp(phpversion(),'5.3') >= 0)
    {
        $refs = array();
        foreach(array_keys($arr) as $key)
        {
            $refs[$key] = &$arr[$key];
        }
        return $refs;
    }

    return $arr;
}
于 2012-11-26T20:29:14.390 に答える