2011-11-11 4 views
1

私は基本的にでmysqli::bind_paramに電話しようとしています。call_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

この問題に対処するその他の質問がいくつかあります。そのうちの1つは次のとおりです。そのうちの1つです:http://stackoverflow.com/questions/295016/is-it-possible-to-pass-parameters-by-reference-using-call-user -func-array – deviousdodo

答えて

5

mysqli_stmt::bind_param()状態のマニュアルページで2番目の音符:

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

関連する問題