sql >> データベース >  >> RDS >> Mysql

bind_paramerror-型定義文字列の要素数がバインド変数の数と一致しません

    プレースホルダーの動的な作成を見てください:

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

    補足:bind_paramも動的に呼び出す必要があることに注意してください call_user_func_array()を介して 配列を使用するので。このパートでは、徹底的に 説明します 。

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



    1. 警告:mysqli ::mysqli():( HY000 / 1045):ユーザー'データベース'@'localhost'(パスワード:NOを使用)のアクセスが拒否されました

    2. PHPmailer-電子メールの複数の送信

    3. MySQLバイナリとchar文字セットバイナリ

    4. データベースおよびリレーショナルデータベース管理システム(RDBMS)とは