sql >> Databáze >  >> RDS >> Mysql

bind_param error - Počet prvků v řetězci definice typu neodpovídá počtu proměnných vazby

Při pohledu na vaše dynamické vytváření vašich zástupných symbolů:

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

Zdá se, že je vytváříte pomocí ' citace. Zástupné symboly nepotřebují uvozovky.

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

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

Pak při přiřazování typů nepotřebujete, aby byly také uvedeny:

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

Vedlejší poznámka:Pamatujte, že také budete muset dynamicky volat bind_param prostřednictvím call_user_func_array() protože budete používat pole. Tato část o tom pojednává důkladně .

I když bych navrhoval/raději používal 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);

Další způsob pomocí 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();



  1. AWS rds - Jak číst z repliky čtení uvnitř aplikace Java?

  2. Vytváříte obslužnou rutinu protokolování pro připojení k Oracle?

  3. Jak vrátit tabulku z funkce MySQL

  4. Databáze se neaktualizuje automaticky pomocí MySQL a Pythonu