7

bind_paramを動的に構築するために、他のSO投稿でこれを見つけました。

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

誰かが私のためにこれを平易な英語で分解できますか?最初の引数が配列であることに特に迷いました。

4

3 に答える 3

16
array($stmt, 'bindparams') 

これは、オブジェクトのメソッドbind_paramsを識別するPHPの方法です。PHP5では、前$stmtにを使用する必要が&なくなったためです(mysqliはPHP 5であるため、以前の投稿ではグリッチのように見えます)。

ここで同様の例を見ることができます

それで

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

基本的には

$stmt->bind_params($array_of_params[0], $array_of_params[1] ... $array_of_params[N])
于 2009-04-16T07:39:34.470 に答える
2

私の知る限り、たとえば $userid == "ALL" mysqli-statement-Objectのbind_paramメソッドに結果を渡すことはできません。これは、このメソッドがパラメーターを参照によって渡す必要があるためです。明らかに、これは「インプレース」で評価された式の結果では不可能です。

回避策として、プログラムの2番目の部分をに変更しました

$userIdEmpty = $userid == "ALL";
$locationEmpty = $location = "ALL";
$stmt->bind_param( "siiiii", 
  "active", $userid, $userIdEmpty,
  $location, $locationEmpty,
  $limit);

このように、ブール演算の結果は参照によって渡すことができます。

于 2011-10-19T06:42:39.393 に答える
1

これを行うには、はるかに簡単な方法があります。

このプリペアドステートメントを作成します。

select * from mytable 
 where status = ? and (userid = ? or ?) 
 and (location = ? or ?)
 order by `date` desc, time desc
 limt ?

次のようにバインドする引数を渡します。

$stmt = $mysqli->prepare( [statement above] );
$stmt->bind_param( "siiiii", 
  "active", $userid, $userid == "ALL", 
  $location, $location == "ALL", 
  $limit); 

(user_id = ? or ?)user_idが最初に置き換えられたパラメーターと等しい場合、または2番目に置き換えられたパラメーターがtrueの場合、述語はtrueになります。

$user_idintに変換すると、数値の文字列表現の場合はその値になり、それ以外の場合はゼロになります。式$userid == "ALL"はブール値に評価され、。に渡されbind_paramます。bind_paramパラメータがブール値(フォーマット文字列はstring、int、double、blobのみを理解する)であるとは言えないため、bind_paramはブール値をintに変換します。これは私たちにとって有効です。

データベース内のuser_idまたはlocation_idがゼロでない限り、問題はありません。

于 2009-04-16T07:52:42.643 に答える