2008-08-15 2 views
7

마무리 할 프로젝트에서 필자는 PHP 용 객체 - 관계형 매핑 솔루션을 작성하고 구현했습니다. 의심과 몽상가가 "어떻게 지구에서?"라고 부르기 전에, 늦은 정적 바인딩 작업을 할 수있는 방법을 찾지 못했습니다. 가능한 최선의 방법으로 작업하고 있습니다.PHP + MYSQLI : 준비된 명령문을 사용한 변수 매개 변수/결과 바인딩

어쨌든 bind_params() 또는 bind_result() 메서드에 가변 개수의 인수를 전달할 수있는 방법이 없기 때문에 현재 쿼리 준비 문을 사용하지 않습니다.

가변 개수의 인수를 지원해야하는 이유는 무엇입니까? 내 모델의 수퍼 클래스 (해킹 된 PHP ActiveRecord wannabe로서의 내 솔루션)는 쿼리가 정의 된 곳이므로 find() 메서드는 바인딩하는 데 필요한 매개 변수의 수를 알지 못합니다 .

이제 인수 목록을 작성하고 eval()에 문자열을 전달하는 방법을 생각해 보았습니다.하지만이 솔루션을별로 좋아하지 않습니다. 저는 보안 점검을 구현하고 전달할 것입니다. 진술.

누구든지이 작업을 수행하는 방법에 대한 제안 (또는 성공 사례)이 있습니까? 이 첫 번째 문제를 해결하는 데 도움을 줄 수 있다면 결과 집합 (테이블 구조를 결정하기위한 초기 쿼리가 포함 된 경우 더 많은 리소스가 필요할 것으로 생각됩니다)을 바인딩 할 수 있습니다.

답변

13

PHP에서는 call_user_func_array을 사용하여 함수 또는 메서드에 가변 개수의 인수를 전달할 수 있습니다. 방법의 예는 다음과 같습니다

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params); 

함수는 자체의 인수로서 건네 배열의 각 부재라고한다.

+0

함수 이름은'bindparams' 대신'bind_param'이어야한다고 생각합니다. 적어도'mysqli' 버전에서는'$ stmt-> bindparams()'가 아닌'$ stmt-> bind_param()'을 사용합니다. 건배! –

1

내가 편집 할 수 없습니다입니다,하지만 난 코드 $ stmt에 앞의 참조가 필요하지 않습니다

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params); 

믿습니다. $stmt이 개체이고 bindparams이 해당 개체의 메서드이기 때문에 참조가 필요하지 않습니다. 자세한 내용은

call_user_func_array(array($stmt, 'bindparams'), $array_of_params); 

Callback Functions에 PHP 설명서를 참조하십시오 "

0
call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params); 

내 환경에서 나를 위해 작동하지만이 대답은 바른 길에 저를 설정하지 않은 무엇을 : 그것은해야합니다.. 실제로 일을했다 : 당신이있어

$sitesql = ''; 
$array_of_params = array(); 
foreach($_POST['multiselect'] as $value){ 
    if($sitesql!=''){ 
     $sitesql .= "OR siteID=? "; 
     $array_of_params[0] .= 'i'; 
     $array_of_params[] = $value; 
    }else{ 
     $sitesql = " siteID=? "; 
     $array_of_params[0] .= 'i'; 
     $array_of_params[] = $value; 
    } 
} 

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'"); 
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params); 
$stmt->execute(); 
2

$ array_of_params 변수에 링크의 배열이 있는지 확인하지 값들 나 자신. 해야한다 :

$array_of_params[0] = &$param_string; //link to variable that stores types 

그리고 ...(이 값의 배열 인 경우) 그렇지 않으면

$param_string .= "i"; 
$user_id_var = $_GET['user_id'];// 
$array_of_params[] = &$user_id_var; //link to variable that stores value 

당신은 얻을 것이다 :

PHP 경고 : 매개 변수 2를 mysqli_stmt하기 :: 참조


될 것으로 예상 bind_param을()

하나 더 예 :

$bind_names[] = implode($types); //putting types of parameters in a string 
for ($i = 0; $i < count($params); $i++) 
{ 
    $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3... 
    $$bind_name = $params[$i]; //create a variable with this name and put value in it 
    $bind_names[] = & $$bind_name; //put a link to this variable in array 
} 

및 BOOOOOM :

call_user_func_array(array ($stmt, 'bind_param'), $bind_names); 
관련 문제