ホームページ  >  に質問  >  本文

MySQL ステートメントに PHP 変数を含める方法

目次に値を挿入しようとしています。 VALUES に PHP 変数がない場合は正常に動作します。ただし、変数 $typeVALUES に入れると、機能しません。私が何を間違えたのでしょうか?

ああああ

P粉595605759P粉595605759420日前578

全員に返信(2)返信します

  • P粉239089443

    P粉2390894432023-09-17 12:00:21

    SQL インジェクションを回避するには、挿入ステートメントは次のようになります:

    リーリー

    返事
    0
  • P粉036800074

    P粉0368000742023-09-17 10:48:29

    MySQL ステートメントに PHP 変数を追加するためのルールはシンプルで簡単です:

    1.準備されたステートメントを使用する

    このルールはクエリの 99% に適用され、クエリにも適用されます。 SQL データ リテラル (または単純に SQL 文字列または数値) を表す変数は、準備されたステートメントを介して追加する必要があります。例外なく。

    この方法は 4 つの基本的なステップで構成されます:

    • SQL ステートメントで、すべての変数 プレースホルダー
    • に置き換えます。
    • 取得したクエリを準備します
    • 変数をプレースホルダーにバインドする
    • クエリの実行
    一般的なすべての PHP データベース ドライバーでこれを実現する方法は次のとおりです:

    使用
    mysqliデータリテラルを追加
    現在の PHP バージョンでは、1 回の呼び出しで準備/バインド/実行が可能です:

    リーリー

    古いバージョンの PHP を使用している場合は、明示的に準備/バインド/実行を行う必要があります:

    リーリー

    このコードは少し複雑ですが、これらすべての演算子の詳細な説明は、私の記事

    Mysqli を使用して INSERT クエリを実行する方法 と、プロセスを大幅に簡素化できるソリューションを参照してください。 。

    SELECT クエリの場合は、上記と同じ方法を使用できます:

    リーリー

    ただし、古いバージョンの PHP を使用している場合は、準備/バインド/実行ルーチンを実行し、使い慣れた

    を取得するために get_result() メソッドも呼び出す必要があります。 mysqli_result から、通常の方法でデータを抽出できます: リーリー

    PDO を使用してデータ リテラルを追加する
    リーリー
    PDO では、バインディング部分と実行部分を一緒にマージすることができ、非常に便利です。 PDO は名前付きプレースホルダーもサポートしており、これが非常に便利だと考える人もいます。

    2. ホワイトリスト フィルタリングを使用する

    SQL キーワード、テーブルまたはフィールド名、演算子などの他のクエリ部分は、

    ホワイトリスト を通じてフィルター処理する必要があります。

    キーワードや識別子 (データベース、テーブル、フィールド名) など、クエリの別の部分を表す変数を追加する必要がある場合があります。これはまれな状況ですが、備えておくことが最善です。

    この場合、変数は、スクリプトに記述された値のリスト

    明示的に と照合する必要があります。これについては、私の他の記事ユーザーの選択に基づいて ORDER BY 句にフィールド名を追加する:で詳しく説明しています。

    これは例です:

    リーリー リーリー

    このようなコードの後、

    $direction 変数と $orderby 変数は、許可されたバリアントの 1 つと等しいか、または次のいずれかになるため、SQL クエリに安全に挿入できます。 throw エラーが発生しました。

    最後に言及すべきことは、識別子も特定のデータベース構文に従ってフォーマットする必要があるということです。 MySQL の場合、識別子は

    backtick 文字で囲む必要があります。したがって、ORDER BY 例の最終的なクエリ文字列は次のようになります。 リーリー

    返事
    0
  • キャンセル返事