私はMySQLiを使用してきましたが、ほとんどの場合、MySQLiが非常に便利であることがわかりましたが、動的クエリに関しては、bind_param()が失敗します。とにかく私は使用しています
call_user_func_array(array($stmt, 'bind_param'), $array_of_params);
これを回避することができ、私のコードは正常に機能しました。ただし、$ array_of_paramsを決定するためのさまざまなifステートメントがあったため、少し面倒でした。
if($switch=="coreSkill_only"){
$array_of_params[0]='s';
$array_of_params[1]=&$coreSkill;
}else if($switch=="region_only"){
$array_of_params[0]='s';
$array_of_params[1]=&$region;
}else if($switch=="coreSkill_region"){
$array_of_params[0]='si';
$array_of_params[1]=&$coreSkill;
$array_of_params[2]=&$region;
}
そのため、実際のクエリ実行を処理するメソッドを乱雑にするのではなく、すべての条件付きのものをそのように独自のメソッドに固定することにしました。
function &generateQueryDropDowns($coreSkill,$region){
$queryDetails=array();
$query="select id,title,location,salary,employer,image from jobs where";
$switch="";
$and=0;
$array_of_params=array();
if($coreSkill!="Any"){
$query.=" coreSkill=?";
$and=1;
$override=1;
$switch="coreSkill_only";
$array_of_params[0]='s';
$array_of_params[1]=&$coreSkill;
}
if($region!="Any"){
if($and==1){
$query.=" and";
$switch="coreSkill_region";
$array_of_params[0]='si';
$array_of_params[1]=&$coreSkill;
$array_of_params[2]=&$region;
}else{
$switch="region_only";
$array_of_params[0]='s';
$array_of_params[1]=&$region;
}
$query.=" region=?";
$override=1;
}
$queryDetails['query']=$query;
$queryDetails['switch']=$switch;
$queryDetails['override']=$override;
$queryDetails['bind_params']=$array_of_params;
return $queryDetails;
}
そして、私はそれを元のメソッドからそう呼んでいます
$foo = &$this->generateQueryDropDowns($coreSkill,$region);
$query=$foo['query'];
$switch=$foo['switch'];
$override=$foo['override'];
$array_of_params=$foo['bind_params'];
if($stmt = $connection->prepare($query)) {
call_user_func_array(array($stmt, 'bind_param'), $array_of_params);
etc....
しかし、参照について次のエラーが発生します
PHP Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference
http://www.php.net/manual/en/language.references.return.phpによると
戻り配列で参照をそのまま維持するためにすべてを正しく実行することができる限り、
どんなアドバイスでも大歓迎です。