2015-05-21 33 views
1

我有一個數組,我正在準備SQL查詢,所以按照步驟使其儘可能安全。嘗試以下操作:bind_param錯誤 - 類型定義字符串中元素的數量不匹配綁定變量的數量

首先我破滅的陣列 - 我想要的字符串結果出來爲「字符串1」,「字符串2」,「STRING3」等:

$in = "'" . implode("','", array_fill(0, count($finalArray), '?')) . "'"; 

我做我的查詢:

$query = <<<SQL 
UPDATE products SET `Status` = 'Reserved' WHERE `SerialNumber` in ($in); 
SQL; 
$query = <<<SQL 

,並準備語句變量:

$statement = $mysqli->prepare($query); 

然後我試圖與str_repea一個bind_param T,而這正是事情出錯:

$statement->bind_param(str_repeat('\'s\',', count($finalArray)), ...$finalArray); 

我得到:

mysqli_stmt :: bind_param():在類型定義字符串元素數不匹配綁定變量的數量

有誰知道我爲什麼得到這個以及如何解決它?

回答

1

看着你的佔位符的動態創建:

$in = "'" . implode("','", array_fill(0, count($finalArray), '?')) . "'"; 

所以似乎與'報價創建它們。佔位符不需要引用。

$in = implode(',', array_fill(0, count($finalArray), '?')); 

$query = "UPDATE products SET Status = 'Reserved' WHERE SerialNumber IN ($in)"; 
$statement = $mysqli->prepare($query); 

然後,在指定類型,你不需要他們還引述:

$statement->bind_param(str_repeat('s', count($finalArray)), $finalArray); 

旁註:留意,你也不必動態調用bind_paramcall_user_func_array()因爲你會使用數組。本部分討論thoroughly

雖然我建議/喜歡使用PDO的->execute()

$pdo = new PDO('mysql:host=localhost;dbname=DATABASE NAME', 'username', 'password'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$in = implode(',', array_fill(0, count($finalArray), '?')); 
$query = "UPDATE products SET Status = 'Reserved' WHERE SerialNumber IN ($in)"; 
$statement = $pdo->prepare($query); 
$statement->execute($finalArray); 

另一種方法使用Reflection

$in = implode(',', array_fill(0, count($finalArray), '?')); 
$type = str_repeat('s', count($finalArray)); 
$query = "UPDATE products SET Status = 'Reserved' WHERE SerialNumber IN ($in)"; 
$statement = $mysqli->prepare($query); 

$ref = new ReflectionClass('mysqli_stmt'); 
$method = $ref->getMethod('bind_param'); 
array_unshift($finalArray, $type); // prepend the 'sss' inside 
$method->invokeArgs($statement, $finalArray); 

$statement->execute(); 
+0

謝謝,懂了工作。 – Wes

+0

肯定@很高興這有幫助 – Ghost

相關問題