![](/img/trans.png)
[英]Mysqli error with bind_param(): Number of elements in type definition string doesn't match number of bind variables
[英]bind_param error - Number of elements in type definition string doesn't match number of bind variables
我有一個准備用於 SQL 查詢的數組,因此請按照以下步驟操作以使其盡可能安全。 嘗試以下操作:
首先,我內爆數組 - 我希望字符串結果顯示為 'string1'、'string2'、'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_repeat 使用 bind_param,這就是出錯的地方:
$statement->bind_param(str_repeat('\'s\',', count($finalArray)), ...$finalArray);
我得到:
mysqli_stmt::bind_param(): 類型定義字符串中的元素數與綁定變量數不匹配
有誰知道我為什么會得到這個以及我如何解決它?
查看您對占位符的動態創建:
$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);
旁注:請注意,您還必須通過call_user_func_array()
動態調用bind_param
因為您將使用數組。 這部分討論得很透徹。
雖然我建議/更喜歡使用 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.