bind_paramを動的に構築するために、他のSO投稿でこれを見つけました。
call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);
誰かが私のためにこれを平易な英語で分解できますか?最初の引数が配列であることに特に迷いました。
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])
私の知る限り、たとえば
$userid == "ALL"
mysqli-statement-Objectのbind_paramメソッドに結果を渡すことはできません。これは、このメソッドがパラメーターを参照によって渡す必要があるためです。明らかに、これは「インプレース」で評価された式の結果では不可能です。
回避策として、プログラムの2番目の部分をに変更しました
$userIdEmpty = $userid == "ALL";
$locationEmpty = $location = "ALL";
$stmt->bind_param( "siiiii",
"active", $userid, $userIdEmpty,
$location, $locationEmpty,
$limit);
このように、ブール演算の結果は参照によって渡すことができます。
これを行うには、はるかに簡単な方法があります。
このプリペアドステートメントを作成します。
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_id
intに変換すると、数値の文字列表現の場合はその値になり、それ以外の場合はゼロになります。式$userid == "ALL"
はブール値に評価され、。に渡されbind_param
ます。bind_param
パラメータがブール値(フォーマット文字列はstring、int、double、blobのみを理解する)であるとは言えないため、bind_paramはブール値をintに変換します。これは私たちにとって有効です。
データベース内のuser_idまたはlocation_idがゼロでない限り、問題はありません。