2012-08-09 79 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語句的類。這是在準備語句中使用的輸出繼電器:

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

下面是代碼:

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個值去用它...

也在這裏是var_dump($arg)何時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 2012-08-09 02:29:30

+0

是的,這應該是怎麼回事?首先是8種類型,然後是8個值。 http://php.net/manual/en/mysqli-stmt.bind-param.php – Yamiko 2012-08-09 02:32:45

+0

我上次檢查。 1)$ userName,2)$ fName,3)$ lName,4)$ email,5)$ password,6)$ recQ,7)$ recA,8)$ admin wheres the 9th value? – Yamiko 2012-08-09 02:44:46

回答

1

implode(', ', $arg)換貨政輸出只有一個字符串,所以它只能得到一個參數。有關這方面的正確方法是使用call_user_func_array();

然而,它並不像看起來那麼明顯。 bind_param()預計參考文獻通過引用傳遞,而不是通過價值傳遞。 __callStatic($name, $arg)具有值的數組而不是引用,因此需要具有對這些值的引用的本地副本。

解決方案:

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