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

警告:PDOStatement ::execute():SQLSTATE [HY093]:無効なパラメーター番号:パラメーターが...filetextで定義されていません

    位置パラメータを使用する場合、 execute()に渡すパラメータの配列 序数配列である必要があります。同様に、名前付きパラメーターを使用する場合、配列は連想配列である必要があります。

    動作を確認するためのテストは次のとおりです。

    $stmt = $db->prepare("SELECT ?, ? ,?");
    
    $params = array( 'a', 'b', 'c' );
    // OK
    if ($stmt->execute($params)) {
      print_r($stmt->fetchAll());
    }
    
    $params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
    // ERROR!
    if ($stmt->execute($params)) {
      print_r($stmt->fetchAll());
    }
    
    $stmt = $db->prepare("SELECT :A, :B, :C");
    
    $params = array( 'a', 'b', 'c' );
    // ERROR!
    if ($stmt->execute($params)) {
      print_r($stmt->fetchAll());
    }
    
    $params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
    // OK
    if ($stmt->execute($params)) {
      print_r($stmt->fetchAll());
    }
    

    PHPの現在のバージョンでは、連想配列キーはしないことに注意してください。 プレフィックスとしてを付ける必要があります @prodigitalsonのコメントとして。 以前のバージョンのPHPでは、配列キーにプレフィックスが必要でした。

    また、単一のクエリで位置パラメータと名前付きパラメータを混在させようとしたときに、バグや予測できない動作が発生したことにも言及する価値があります。 異なるではどちらのスタイルも使用できます アプリでクエリを実行しますが、特定のクエリに対していずれかのスタイルを選択しました。




    1. MySQLでパーセンテージとして数値をフォーマットする

    2. PostgreSQLを使用している場合、役割が存在せず、データベースを作成できません

    3. JUnitテストケース用にMySQLをメモリ内で実行する方法はありますか?

    4. sqliteをMysqlに同期する方法