9

まとめようとしているプロジェクトでは、PHP のオブジェクト リレーショナル マッピング ソリューションを作成して実装しました。懐疑論者や夢想家が「いったいどうやって?」と叫ぶ前に、リラックスしてください-私は遅い静的バインディングを機能させる方法を見つけていません-私はできる限り最善の方法でそれを回避しています.

いずれにせよ、私は現在クエリにプリペアド ステートメントを使用していません。なぜなら、bind_params()またはbind_result()メソッドに可変数の引数を渡す方法が思いつかなかったからです。

可変数の引数をサポートする必要があるのはなぜですか? 私のモデルのスーパークラス (私のソリューションをハッキングされた PHP ActiveRecord 志望者と考えてください) は、クエリが定義されている場所であり、たとえば、find() メソッドは、バインドする必要があるパラメーターの数を認識していません。 .

ここで、引数リストを作成して文字列を eval() に渡すことをすでに考えましたが、その解決策はあまり好きではありません。独自のセキュリティ チェックを実装してステートメントを渡すだけです。

これを実現する方法について、何か提案 (または成功事例) がある人はいますか? この最初の問題を解決するのを手伝ってくれれば、結果セットのバインドに取り組むことができるかもしれません (テーブル構造を決定するための最初のクエリが必要な場合は、より困難になるか、少なくともリソースを大量に消費すると思われます)。

4

5 に答える 5

12

PHPでは、を使用して関数またはメソッドに可変数の引数を渡すことができますcall_user_func_array。メソッドの例は次のとおりです。

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

関数は、配列内の各メンバーが独自の引数として渡された状態で呼び出されます。

于 2008-08-16T10:58:05.587 に答える
1

$array_of_params が値自体ではなく、変数へのリンクの配列であることを確認する必要があります。次のようにする必要があります。

$array_of_params[0] = &$param_string; //link to variable that stores types

その後...

$param_string .= "i";
$user_id_var = $_GET['user_id'];//
$array_of_params[] = &$user_id_var; //link to variable that stores value

それ以外の場合 (値の配列の場合)、次のようになります。

PHP 警告: mysqli_stmt::bind_param() へのパラメータ 2 は参照であると予想されます


もう 1 つの例:

$bind_names[] = implode($types); //putting types of parameters in a string
for ($i = 0; $i < count($params); $i++)
{
   $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3...
   $$bind_name = $params[$i]; //create a variable with this name and put value in it
   $bind_names[] = & $$bind_name; //put a link to this variable in array
}

そしてブーン:

call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 
于 2011-08-30T09:03:23.973 に答える
0

編集は許可されていませんが、コードを信じています

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

$stmtの前の参照は必要ありません。$stmtはオブジェクトであり、はそのオブジェクトのメソッドであるためbindparams、参照は必要ありません。そのはず:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

詳細については、コールバック関数に関するPHPのマニュアルを参照してください。」

于 2008-09-17T05:45:35.987 に答える
0
call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

私の環境ではうまくいきませんでしたが、この答えは私を正しい軌道に乗せました。実際に機能したのは:

$sitesql = '';
$array_of_params = array();
foreach($_POST['multiselect'] as $value){
    if($sitesql!=''){
        $sitesql .= "OR siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }else{
        $sitesql = " siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }
}

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'");
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params);
$stmt->execute();
于 2010-04-04T20:11:05.623 に答える