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

プリペアドステートメントを使用したMySQLのLIMITキーワード

    問題は次のとおりです:

    $comments = $db->prepare($query); 
    /* where $db is the PDO object */ 
    $comments->execute(array($post, $min, $max));
    

    PDOStatement ::execute() のマニュアルページ 言う(私の強調):

    パラメータ

    input_parameters 実行中のSQLステートメントにバインドされたパラメーターと同じ数の要素を持つ値の配列。 すべての値はPDO::PARAM_STRとして扱われます

    したがって、パラメータは文字列として挿入されるため、最終的なSQLコードは次のようになります。

    LIMIT '0', '10'
    

    これは、MySQLが数値にキャストせず、解析エラーをトリガーする特定のケースです:

    mysql> SELECT 1 LIMIT 0, 10;
    +---+
    | 1 |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)
    
    mysql> SELECT 1 LIMIT '0', '10';
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1
    

    ドキュメント 言わなければならない:

    LIMIT 句を使用して、SELECTによって返される行数を制限できます。 声明。 LIMIT 1つまたは2つの数値引数を取ります。これらは両方とも非負の整数定数である必要がありますが、次の例外があります。

    • プリペアドステートメント内で、LIMIT パラメータは?を使用して指定できますプレースホルダーマーカー。

    • ストアドプログラム内で、LIMIT パラメータは、整数値のルーチンパラメータまたはローカル変数を使用して指定できます。

    選択肢は次のとおりです。

    • タイプを設定できるように、パラメータを1つずつバインドします:

      $comments->bindParam(1, $post, PDO::PARAM_STR);
      $comments->bindParam(2, $min, PDO::PARAM_INT);
      $comments->bindParam(3, $min, PDO::PARAM_INT);
      
    • これらの値をパラメータとして渡さないでください:

      $query = sprintf('SELECT id, content, date
          FROM comment
          WHERE post = ?
          ORDER BY date DESC
          LIMIT %d, %d', $min, $max);
      
    • エミュレートされた準備を無効にします(MySQLドライバーには、数値引数を引用するバグ/機能があります):

      $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
      


    1. SQL Server:プールされた接続間での分離レベルのリーク

    2. OracleCloudInfrastructureのコンパートメントについて知っておくべき7つのこと

    3. OracleからPostgreSQLまたはYugabyteDBにデータを転送するSQLcl🅾🐘🚀

    4. Linux上の.NETをODBCデータソースに接続する