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();