2016-10-05 10 views
1

배열을 함수의 매개 변수로 전달하려고하는데 문제가 있습니다. 여기에 함수가 있습니다.

$stmt->bind_param(); 

나는 이것을 연구하고이 사용할 수 있다는 것을 발견했다 :

이 내 개발 서버에서 잘 작동
$stmt->bind_param(...$values); 

(PHP 7.0.0)을,하지만 난 다른 서버 (PHP로를 입력 할 때 예기치 않은

구문 오류, 추가 연구시

')'기대, 내가 트라이 : 5 *), 나는 다음과 같은 오류가 발생했습니다 '.' D :

call_user_func_array(array($stmt, 'bind_param'), $values); 

이 오류 얻었다 :

call_user_func_array()는 마찬가지로 * 파라미터 1, 제 배열 부재 유효한 클래스 이름이 아닌 유효한 콜백이거나

개체 예상 사이드 노트, 나는 단지 매개 변수를 입력 할 수 있고 모든 것이 잘 될 것이라고 알고 있지만, 나는 함수를 필요로하는 어떤 수의 매개 변수를 취할 수있는 함수가 필요하다. 당신이 bind_param에 참조가 아닌 값을 전달하기 때문에

function updateId($id, $data){ 

    $mysqli = dbConnect::connect(); 

    $sm=array(); 
    $values=array(); 
    $dataString = array(); 

    foreach($data as $column=>$value){ 
     $dataString[] = ($column .'= ?'); 
     $values[] = $value; 
     if(gettype($value)==="string"){ 
      $sm[] = 's'; 
     }elseif(gettype($value)==="integer"){ 
      $sm[] = 'i'; 
     }elseif(gettype($value)==="double"){ 
      $sm[] = 'd'; 
     }else{ 
      $sm[] = 'b'; 
     } 
    } 

    $dataString = implode(', ',$dataString); 
    $sm = implode('',$sm); 

    $prepString = "UPDATE $this->tablename SET $dataString WHERE id=$id"; 

    array_unshift($values, $sm); 

    $stmt = $mysqli->prepare($prepString); 
    $stmt->bind_param(...$values); 
    $stmt->execute() or die($stmt->error); 
    $stmt->close(); 
    $mysqli->close(); 

} 
+0

실제 코드를 보여 주면 더 나은 응답을 얻을 수 있습니다. – RiggsFolly

+0

자명하다. _first 배열 멤버가 유효한 클래스 이름 또는 객체가 아니다. – AbraCadaver

+0

도움이된다면 그것을 제공 할 수 있지만 발달 서버에서 작동한다. 모든 오류는 해당 행을 가리 킵니다. – Blaise

답변

1

당신은 오류가 점점 :

여기 기능입니다. call_user_func_array을 사용할 수 있지만 전달한 값이 참조인지 확인해야합니다. 당신이로 달성 할 수 이것은 다음과

$values[] = $value; 

이것 :이

변경

$values[] = &$data[$column]; 

그리고 (이미했던 것처럼)이 변경이로

$stmt->bind_param(...$values); 

을 :

call_user_func_array(array($stmt, 'bind_param'), $values); 
+0

정말 고마워요. $ values ​​[] = $ value;의 차이점은 무엇입니까? 및 $ 값 [] = & $ 데이터 [$ 열]; – Blaise

+1

루프 뒤에 배열을'var_dump '할 때 차이점을 볼 수 있습니다. 변경된 코드에서는 각 값 앞에'&'기호가 표시됩니다. 실제 값을 나타내는 포인터 (또는 주소)입니다. 이것은'bind_param'이 필요로하는 것입니다. 나는 그것이 당신의 경우가 아닌 출력 매개 변수를 다루는 것을 가능하게하기 위해 이것을 필요로한다고 가정하지만, 저장 프로 시저/함수를 호출 할 때 그럴 수 있습니다. – trincot

+0

차가움. 정말 고맙습니다! – Blaise

관련 문제