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

PDOPHPbindValueが機能しない

    問題はここにあります:

    $sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
    $stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
    

    $regGUIDは引用符で囲まれた文字列のコンマ区切りのリストだと思います。

    各クエリパラメータは、単一のスカラー値のみを受け入れます。 リストではありません 値の。

    したがって、2つの選択肢があります。

    1. 他のスカラー値にパラメーターを使用する場合でも、$regGUID文字列の補間を続行します。ただし、SQLインジェクションを回避するように注意する必要があるため、$regGUID文字列を正しく作成する必要があります。文字列全体でPDO::quote()を呼び出すことはできません。これにより、UUIDとコンマを含む単一の引用符で囲まれた文字列になります。各UUID文字列がエスケープされ、個別に引用符で囲まれていることを確認してから、リストを一緒に内挿し、IN句に補間する必要があります。

      $regGUIDs = explode(',', $regGUID);
      $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs);
      $regGUID = implode(',', $regGUIDs);
      $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
      
    2. explode() $ regGUIDを配列に追加し、配列内の要素ごとに1つのクエリパラメータを追加します。クエリパラメータプレースホルダーの動的リストを補間します。

      $regGUIDs = explode(',', $regGUID);
      $params = array_fill(1, count($regGUIDs), '?');
      $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
      

    配列のループでbindValue()を使用できますが、他のパラメーターも名前ではなく位置でバインドする必要があることに注意してください。 PDOには、同じクエリで2つの異なるスタイルのパラメータを混在させようとすると満足できないバグがあります。

    bindValue()を使用する代わりに、パラメーター値の配列をPDOStatement ::execute()に渡すだけです。これは、はるかに簡単です。

    $paramValues = $regGUIDs;
    $paramValues[] = $game;
    $results = $stmt->execute($paramValues);
    


    1. PHP 7 RC3:不足しているMySQLPDOをインストールする方法

    2. PostgreSQLでグループごとに最後の行を取得する方法

    3. GI12.1.0.2とセグメンテーション違反をコンパイルできません

    4. WindowsでのMySQLのオートコンプリート