2012-08-09 2 views
0

여기에 답을 달았지만 내 문제는 무엇인지 알 수없는 질문이 많이 있습니다.php mysqli bind_param 틀린 매개 변수 수

속성으로 저장되는 mysqli를 사용하는 DB 클래스. 준비, 바인딩 및 실행은 마법 호출 메서드로 트리거됩니다.

public static function __callStatic($name, $arg) 
{ 
    echo '<pre>'; 
    var_dump($arg); 
    echo '</pre>'; 
    if($name == 'Prepare'){ 
     self::$Stmt = self::$mysqli->prepare(implode(', ', $arg)); 
     $return = self::$Stmt; 
    }elseif($name == 'Bind') 
     $return = self::$Stmt->bind_param(implode(', ', $arg)); 
    elseif($name == 'Execute') 
     $return = self::$Stmt->execute(); 
    else 
     $return = self::$mysqli->$name(implode(', ', $arg)); 
    if(!self::GetErr()) 
     return $return; 
} 

또한 SQL 문을 생성하는 클래스가 있습니다. ...

DB::Prepare(SQL::Table('account')->Insert([ 
    'UName' => '?', 
    'FName' => '?', 
    'LName' => '?', 
    'Email' => '?', 
    'Password' => '?', 
    'RecQuestion' => '?', 
    'RecAnswer' => '?', 
    'Admin' => '?' 
])); 
DB::Bind('sssssssi', $userName, $fName, $lName, $email, $password, $recQ, $recA, $admin); 
DB::Execute(); 

함께가는 8 종 8 개 값이있는 내가 볼 수 있듯이 : 여기

INSERT INTO account (UName, FName, LName, Email, Password, RecQuestion, RecAnswer, Admin) VALUES (?, ?, ?, ?, ?, ?, ?, ?) 

코드입니다 :이 준비 문에서 사용되는 OUPUT입니다

도 여기에 DB :: 바인딩이

array(9) { 
    [0]=> 
    string(8) "sssssssi" 
    [1]=> 
    string(4) "user" 
    [2]=> 
    string(5) "first" 
    [3]=> 
    string(4) "last" 
    [4]=> 
    string(15) "[email protected]" 
    [5]=> 
    string(64) "$2a$10$Tw4eOkUYA6SX8WP8XJfKZeFfOM9htVRJyP0d1iYlka0jNCV/qPGzazakT" 
    [6]=> 
    string(7) "recover" 
    [7]=> 
    string(64) "$2a$10$LrfK2EdkRi6pPdx1tUtPWe8p24T8ISdQHYhW0N06RjbvCrU4Flqiie4jU" 
    [8]=> 
    int(1) 
} 
+1

'DB :: 바인드 ('sssssssi', $ 이름, $ FNAME, $ LNAME, $ 이메일, $ 암호, $ recQ, $ RECA, $ 관리자); ' 거기에는 9 명이 있습니다. 당신은 정말로이 'sssssssi'가 필요합니까? – deex

+0

그렇습니다. 어떻게해야할까요? 첫 번째는 8 가지 유형과 8 가지 값입니다. 지난 번 확인한 http://php.net/manual/en/mysqli-stmt.bind-param.php – Yamiko

+0

1) $ userName, 2) $ fName, 3) $ lName, 4) $ email, 5) $ password, 6) $ recQ, 7) $ recA, 8) $ admin은 9 번째 값을 갖는가? – Yamiko

답변

1

implode(', ', $arg) retu를 호출 할 때를위한 var_dump($arg)의 출력 하나의 매개 변수를 얻고 그래서 단일 문자열을 rns. 이 문제를 해결하는 적절한 방법은 사용하는 것입니다. call_user_func_array();

그러나 그 것처럼 보일 수도 있습니다. bind_param()은 arguements가 값이 아닌 참조로 전달 될 것으로 기대합니다. __callStatic($name, $arg)에는 값의 배열이 있고 참조가 없으므로이 값을 참조하는 로컬 복사본이 필요합니다.

솔루션 :

elseif($name == 'Bind'){ 
    foreach($arg as &$v) 
     $Arg[] = &$v; 
    $return = call_user_func_array(array(self::$Stmt, 'bind_param'), $Arg); 
} 
관련 문제