2014-09-28 24 views
1

所以我有一個創建帳戶方法,並在其內部建立了一個名爲userInfo的關聯數組。這是陣列:如何在bind_param上使用implode?

$userInfo = array(
     'username' => $username, 
     'salt'  => $this->passwordHash('Extra Protection is a good thing'), 
     'password' => $this->passwordHash($password) 
    ); 

現在我正在嘗試使用implode和prepared語句。當它試圖綁定參數時,我似乎遇到了No data supplied for parameters in prepared statement錯誤。

以下是該語句:

if (! ($stmt = $this->Connection()->prepare("INSERT INTO " . $this->_info['Prefix'] . "users 
    (`".implode("`, `", array_keys($userInfo))."`) VALUES (?, ?, ?)"))) 
    { 
     echo 'Prepare Failed: ' . $stmt->error . '<br />'; 
    } 

    if (! $stmt->bind_param('sss', implode("', '", $userInfo))) 
    { 
     echo 'Bind Failed: ' . $stmt->error . '<br />'; 
    } 

    if (! $stmt->execute()) 
    { 
     echo 'Execute Failed: ' . $stmt->error . '<br />'; 
    } 

我最初使用real_escape_string和查詢並正確執行。這只是它不喜歡的準​​備好的陳述。

它有什麼問題?

+0

'implode(「','」,$ userInfo)給** **一個**字符串,而'bind_param('sss''期望**三個**字符串 – 2014-09-28 18:08:45

+0

@u_mulder我試着做's'但是同樣的問題... – user3481788 2014-09-28 18:09:31

+0

one's'表示你應該只有一個'?' ery文本,而不是'3'。 – 2014-09-28 18:10:14

回答

2

您不能正確理解預準備語句。每個插入的值將根據它的表字段定義進行準備。 這是你比如查詢:

INSERT 
    INTO users (`username`, `salt`, `password`) 
    VALUES ('john', 'somesalt', 'somepassword'); 

所以價值jonh將根據username字段設置,somesalt準備 - 根據salt

那麼,什麼是你的錯誤,在這裏(我跳過implode和等):

當你這樣做:

$stmt = $this->Connection()->prepare("INSERT INTO " 
    . $this->_info['Prefix'] 
    . "users (`user`, `salt`, `password`) values (?, ?, ?)"); 
$stmt->bind_param('sss', implode("', '", $userInfo)) 

這是錯誤的,因爲查詢需要3個字符串(s),每個字符串將根據字段設置進行準備,而您只給出一個字符串。

當你改成這樣:

$stmt = $this->Connection()->prepare("INSERT INTO " 
    . $this->_info['Prefix'] 
    . "users (`user`, `salt`, `password`) values (?)"); 
$stmt->bind_param('s', implode("', '", $userInfo)) 

這是錯的太多,因爲這裏來查詢錯誤。你想插入三個字段,但只給一個字段賦值。

讓您真正應該做的是:

$stmt = $this->Connection()->prepare("INSERT INTO " 
    . $this->_info['Prefix'] 
    . "users (`user`, `salt`, `password`) values (?, ?, ?)"); 
$stmt->bind_param('sss', $userInfo['username'], $userInfo['salt'], $userInfo['password']); 

那麼,到底這是不可能的mysqli使用implodebind_param(我希望這是mysqli的),如果你想知道熱利用bind_param與值的數組 - 你應該閱讀這個評論在php.net - http://ru2.php.net/manual/ru/mysqli-stmt.bind-param.php#104073

+0

謝謝,它沒有在我的腦海中引用每個元素,比如'$ userInfo ['key']'。它現在的作品:) – user3481788 2014-09-28 18:33:18

+0

這裏的大多數人不懂俄語,所以你最好鏈接到英文版的手冊 – Yang 2014-10-05 14:39:35