2012-10-19 22 views
0

我一直在使用MySQLi,並且在大多數情況下發現它非常有用,但是當涉及到動態查詢時,bind_param()會下降。反正即時通訊使用函數返回數組引用完好? - 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

至於我可以解決我在做正確的事情,以保持引用完好無損在返回數組中?

任何建議是非常歡迎。

+1

這是我建議通過MySQLi使用PDO_mysql的原因很大一部分。 MySQLi API在很多方面都很荒謬。但是,如果內存服務,您需要執行'$ array_of_params =&$ foo ['bind_params'];',因爲我還不完全清楚。 – DaveRandom

+0

檢查[mysqli或PDO - 有什麼優點和缺點?](http://stackoverflow.com/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons)和[Moving從MySQL到mysqli或pdo?](http://stackoverflow.com/questions/770782/moving-from-mysql-to-mysqli-or-pdo) –

+0

**並在頂部檢查[PDO與MySQLi:哪你應該使用?](http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/)** –

回答

0

原來你也需要傳遞參數。

所以

function &generateQueryDropDowns($coreSkill,$region){} 

成爲

function &generateQueryDropDowns(&$coreSkill,&$region){} 

,現在按預期工作。