Mysql
 sql >> Base de données >  >> RDS >> Mysql

erreur bind_param - Le nombre d'éléments dans la chaîne de définition de type ne correspond pas au nombre de variables de liaison

En regardant votre création dynamique de vos espaces réservés :

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

Il semble donc les avoir créés avec ' citations. Les espaces réservés n'ont pas besoin de guillemets.

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

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

Ensuite, lors de l'attribution de types, vous n'avez pas besoin qu'ils soient également cités :

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

Sidenote :Notez que vous devrez également appeler dynamiquement bind_param via call_user_func_array() puisque vous allez utiliser un tableau. Cette partie en parle en profondeur .

Bien que je suggère/préfère utiliser le ->execute() de PDO :

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

Une autre façon d'utiliser 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();