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

プリペアドステートメントでテーブル名をパラメータ化できますか?

    あなたの質問に対する簡単な答えは「いいえ」です。

    厳密な意味では、データベースレベルでは、プリペアドステートメントでは、SQLステートメントの「値」ビットにのみパラメーターをバインドできます。

    これについての考え方の1つは、「ステートメントの実行時に、その意味を変更せずに置き換えることができるもの」です。テーブル名は、SQLステートメント自体の有効性(つまり、有効な列名)を決定し、実行時に変更するとSQLステートメントが有効かどうかが変わる可能性があるため、これらのランタイム値の1つではありません。

    少し高いレベルでは、PDOなどのデータベースにプリペアドステートメントを実際に送信するのではなく、プリペアドステートメントのパラメータ置換をエミュレートするデータベースインターフェイスでも、プレースホルダーをどこでも使用できる可能性があります(プレースホルダーはに送信される前に置き換えられるため)これらのシステムのデータベース)の場合、テーブルプレースホルダーの値は文字列になり、データベースに送信されるSQL内にそのように囲まれるため、SELECT * FROM ? mytableを使用 パラメータは実際にはSELECT * FROM 'mytable'を送信することになります。 無効なSQLであるデータベースへ。

    最善の策は、続行することです

    SELECT * FROM {$mytable}
    

    しかし、あなたは絶対に $mytableの場合、最初にチェックするテーブルのホワイトリストが必要です。 ユーザー入力から来ています。




    1. SQLサーバーにファイルが存在するかどうかを確認しますか?

    2. to_number()関数がPostgreSQLでどのように機能するか

    3. コマンドラインからのPostgreSQLCSVインポート

    4. PostgreSQLのSTRING_AGG()関数