ホームページ >データベース >mysql チュートリアル >準備されたステートメントで動的テーブル名とフィールド名を安全に使用するにはどうすればよいですか?

準備されたステートメントで動的テーブル名とフィールド名を安全に使用するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-08 17:10:12564ブラウズ

How Can I Safely Use Dynamic Table and Field Names in Prepared Statements?

準備されたステートメントを使用して識別子とキーワードをバインドする

問題:

動的クエリの作成プリペアドステートメントを使用していますが、テーブル名、フィールド名、または構文キーワードの結果は空の配列になります。

コード:

function search_db($db, $searchTerm, $searchBy, $searchTable){
    try{
        $stmt = $db->prepare('
            SELECT 
                * 
            FROM 
                ?
            WHERE 
                ? LIKE ?
        ');
        $stmt->bindParam(1, $searchTable);
        $stmt->bindParam(2, $searchBy);
        $stmt->bindValue(3, '%'. $searchTerm.'%');
        $stmt->execute();
    } catch(Exception $e) {
        return array();
    }
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

期待される結果:
データベースからの結果の配列.

実際結果:
空の配列

原因:
準備されたステートメントはデータ リテラルのみをバインドでき、識別子 (テーブル名やフィールド名など) や構文はバインドできません。キーワード。

解決策:

動的識別子またはキーワードを使用するには、次の手順に従います。

  1. 識別子の形式:

    • で囲むバッククォート内の識別子: "identifier".
    • 識別子内のバッククォートを 2 倍にしてエスケープします: "identifier".
  2. ホワイトリスト動的値:

    • 許可された識別子またはキーワードのリストを作成します。
    • 使用する前に、動的値をホワイトリストと照合して確認します。

変更済みコード:

$field = "`" . str_replace("`", "``", $field) . "`";
$table = "`" . str_replace("`", "``", $table) . "`";
$sql = "SELECT * FROM $table WHERE $field = ?";

キーワード:

必要に応じて、動的キーワードもホワイトリストに登録して検証します。これらのガイドラインに従うことで、準備されたステートメントに動的識別子とキーワードを安全に含めることができます。

以上が準備されたステートメントで動的テーブル名とフィールド名を安全に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。