2011-11-11 2 views
1

기본적으로 을 통해 mysqli::bind_param으로 전화하려고합니다.call_user_func_array with references

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