2011-11-11 75 views
1

我基本上試圖通過call_user_func_array調用mysqli::bind_paramcall_user_func_array與參考

這裏是我的功能:

function Insert($table, $values=array(), $flags=0) { 
    $field_count = count($values); 

    if($field_count > 0) { 
     $fields = implode(',',array_keys($values)); 
     $placeholders = implode(',',array_repeat('?',$field_count)); 
    } else { 
     $fields = ''; 
     $placeholders = ''; 
    } 

    if($flags > 0) { 
     $flag_arr = array(); 
     if($flags & self::LOW_PRIORITY) $flag_arr[] = 'LOW_PRIORITY'; 
     if($flags & self::DELAYED) $flag_arr[] = 'DELAYED'; 
     if($flags & self::HIGH_PRIORITY) $flag_arr[] = 'HIGH_PRIORITY'; 
     if($flags & self::IGNORE) $flag_arr[] = 'IGNORE'; 
     $flags_str = implode(' ',$flag_arr); 
    } else { 
     $flags_str = ''; 
    } 

    $sql = "INSERT $flags_str INTO $table ($fields) VALUES ($placeholders)"; 
    $stmt = $this->mysqli->prepare($sql); 
    if($stmt === false) { 
     throw new Exception('Error preparing MySQL statement.<br/>MSG: '.$this->mysqli->error.'<br/>SQL: '.$sql); 
    } 

    if($field_count > 0) { 
     $types = ''; 
     foreach($values as $val) { 
      if(is_int($val)) $types .= 'i'; 
      elseif(is_float($val)) $types .= 'd'; 
      elseif(is_string($val)) $types .= 's'; 
      else $types .= 'b'; 
     } 
     $params = array_merge(array($types),array_values($values)); 
     call_user_func_array(array($stmt,'bind_param'),$params); 
    } 

    $stmt->execute(); 
    return $stmt; 
} 

call_user_func_array線出現問題。我得到這個錯誤:

Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given

我明白這個問題,我只是不知道如何解決它。

作爲一個例子,該功能可以被稱爲是這樣的:

$db->Insert('pictures',array('views'=>1)); 

而且var_dump($params)會產生這樣的:

array 
    0 => string 'i' (length=1) 
    1 => int 1 

那麼,有沒有一種方法來調用mysqli::bind_param與可變數量的參數,或以某種方式使我的數組引用?

+0

還有一些其他問題可以解決這個問題 - 其中之一:http://stackoverflow.com/questions/295016/is-it-possible-to-pass-parameters-by-reference-using-call-user -func-array – deviousdodo

回答

5

在手冊中的第二注爲mysqli_stmt::bind_param()狀態:

Care must be taken when using mysqli_stmt_bind_param() in conjunction with call_user_func_array(). Note that mysqli_stmt_bind_param() requires parameters to be passed by reference, whereas call_user_func_array() can accept as a parameter a list of variables that can represent references or values.

有一個solution張貼在手冊中的用戶評論部分。簡而言之,您創建一個接受數組並返回一個重複數組的元素,該元素的元素是對源數組中元素的引用。

編輯:原來有一對SOquestions就此。

+0

剛剛也找到了。謝謝 :) – mpen