簡體   English   中英

bind_param 錯誤 - 類型定義字符串中的元素數與綁定變量數不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM