ホームページ >バックエンド開発 >PHPチュートリアル >変数 LIKE 条件を使用して安全な MySQLi プリペアド ステートメントを作成する方法

変数 LIKE 条件を使用して安全な MySQLi プリペアド ステートメントを作成する方法

DDD
DDDオリジナル
2024-12-04 11:39:151473ブラウズ

How to Build a Secure MySQLi Prepared Statement with Variable LIKE Conditions?

mysqli プリペアド ステートメントとして変数 LIKE 条件を使用した SELECT クエリを構築する

ユーザー入力を扱う場合、次のような問題を防ぐためにステートメントを準備することが不可欠です。 SQL インジェクションを実行し、データの整合性を確保します。 LIKE 条件の数が可変の場合、これは困難になります。

問題の概要

コード スニペットは、ユーザー入力に基づいて LIKE 条件を動的に作成することで、この問題を解決しようとします。 。ただし、プリペアド ステートメントのパラメータを正しくフォーマットできません。

解決策

解決策は、プレースホルダではなくパラメータの前後に % ワイルドカードを配置することです。これにより、クエリのフィルタリングにパラメータが確実に使用されます。

詳細な説明

  1. 成分の初期化:

    a. OR を使用して WHERE 句式の配列を作成します。
    b.値のデータ型 (この場合は文字列) を決定します。
    c.データ型とパラメータを単一の配列に結合します。

  2. 条件の準備:

    a.ユーザー入力を一意の値の配列に変換します。
    b.値ごとに、LIKE 式を作成します。
    c.データ型とワイルドカード値を含めるようにパラメーター配列を更新します。

  3. クエリの準備:

    a。基本的な SELECT * クエリから始めます。
    b.条件がある場合は、動的式を含む WHERE 句を追加します。

  4. パラメータをバインドして実行します:

    a。スプラット演算子 (...) を使用して、パラメーター配列をプリペアド ステートメントにバインドします。
    b.ステートメントを実行し、結果があれば取​​得します。

コード例:

$string = "Bill N_d Dave";

$conditions = [];
$parameters = [''];
foreach (array_unique(explode(' ', $string)) as $value) {
    $conditions[] = "name LIKE ?";
    $parameters[0] .= 's';
    $parameters[] = "%{$value}%";
}

$query = "SELECT * FROM info";
if ($conditions) {
    $stmt = $mysqli->prepare($query . ' WHERE ' . implode(' OR ', $conditions));
    $stmt->bind_param(...$parameters);
    $stmt->execute();
    $result = $stmt->get_result();
} else {
    $result = $conn->query($query);
}

foreach ($result as $row) {
    echo "<div>{$row['name']}</div>\n";
}

補足:

  • 条件が指定されていない場合は、WHERE なしでクエリを実行します。
  • 必要に応じて、addcslashes() を使用してユーザー入力内のワイルドカードをエスケープすることを検討してください。

以上が変数 LIKE 条件を使用して安全な MySQLi プリペアド ステートメントを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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