2013-02-23 67 views
2

匹配的參數個數這是我的函數,它創建了事先準備好的聲明:mysqli_stmt ::變量bind_param數不事先準備好的聲明

function query($query, $values_array) { 

if ($stmt = $link->prepare($query)) { 

    for ($i = 1; $i < count($values_array); $i++) { 
    if (!$stmt->bind_param($values_array[0][$i-1], $values_array[$i])) { 
     return false; 
    } 
    } 

if (!$stmt->execute()) { 
    return false; 
} 
$result = $stmt->get_result(); 
$stmt->close(); 
} 

return $result; 
} 

$查詢

insert into table (var1, var2, var3, var4, var5, var6) values (?, ?, ?, ?, ?, ?) 

$ values_array是

array(7) { 
[0]=> 
string(6) "diisii" 
[1]=> 
float(9) 
[2]=> 
int(1) 
[3]=> 
int(1) 
[4]=> 
string(5) "now()" 
[5]=> 
int(1) 
[6]=> 
int(1) 
} 

我找不出這個問題,因爲這個錯誤只是綁定參數時插入語句。 Select語句毫無問題地工作!

+0

'now()'不起作用,因爲它作爲文字字符串傳遞。你可以嘗試使用另一個' - > bind_param'簽名來傳遞類型字符串和所有參數,'call_user_func_array(array($ stmt,「bind_param」),$ values_array)' – mario 2013-02-23 16:16:50

+0

離開now()時出現同樣的錯誤。是的,我知道call_user_func_array函數,但是我需要重構我不想做的$ values_array。 – Chris 2013-02-23 16:25:11

回答

1

這是一個清晰的例子,顯示爲什麼mysqli完全無法使用預處理語句。
要麼使用PDO要麼手動解析自定義佔位符,如safemysql

不同於mysqli的,PDO有2個大的事,使準備的語句可用:

  • 通過綁定佔位符,或者通過使用bindValue()或傳遞數組​​。
  • 返回查詢結果爲通常數組而不是單獨變量的奇怪綁定。
+0

剛剛經過測試的PDO,它的工作沒有問題。多麼奇怪的問題...... +1 – Chris 2013-02-23 18:34:38

相關問題