我一直在使用MySQLi,并且在大多数情况下发现它非常有用,但是当涉及动态查询时,bind_param()会失败。无论如何我正在使用
call_user_func_array(array($stmt, 'bind_param'), $array_of_params);
允许我解决这个问题,我的代码运行良好。然而它有点乱,因为我有各种if语句来确定$ array_of_params,就像这样
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
至于我可以解决我正确地做所有事情以保持引用在返回数组中完整无缺?
非常欢迎任何建议。
答案 0 :(得分:0)
原来你需要将参数作为参考传递。
所以
function &generateQueryDropDowns($coreSkill,$region){}
变为
function &generateQueryDropDowns(&$coreSkill,&$region){}
现在它按预期工作。