PDO パラメーター: テーブル名または列名を入力として受け入れられますか?
準備された PDO にテーブル名をパラメーターとして含めようとしています以下のコード スニペットに示すように、ステートメントは次のようになります。失敗:
$stmt = $dbh->prepare('SELECT * FROM :table WHERE 1'); if ($stmt->execute(array(':table' => 'users'))) { var_dump($stmt->fetchAll()); }
なぜこれは不可能ですか?
PDO パラメーターは、クエリの実行中に動的に割り当てられるデータ値を対象としています。一方、テーブル名と列名はデータベース スキーマの静的要素であり、パラメータ化には適していません。
テーブル名を含める安全な代替手段
安全に挿入するにはテーブル名を SQL クエリに含める場合は、データを手動でフィルタリングしてサニタイズすることをお勧めします。これは、クエリを動的に実行する関数にホワイトリストに登録された switch() ステートメントを組み込むことで実現できます。
function buildQuery( $get_var ) { switch($get_var) { case 1: $tbl = 'users'; break; } $sql = "SELECT * FROM $tbl"; }
特定のケースを設定し、無効なシナリオを処理することで、クエリは許可された条件でのみ実行されます。テーブル名。このアプローチにより、ユーザー入力が SQL クエリに直接影響を与えず、データの整合性が維持されます。
以上がSQL クエリのテーブル名または列名に PDO パラメータを使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。