私は持っている:
INSERT INTO post(title,message) VALUES (:title,:message)
ここで、:message
値には記号 (カンマを含む) を含むランダムなテキストがあります。
コンマ記号は、ステートメントの構成要素間の区切り記号であるため、次のようになります。
値をエスケープ :message
して、含まれているコンマを文字列コンテキストに保持し、区切り記号として解釈されないようにするにはどうすればよいですか?
その必要はありません。PDO の場合と同様に、準備済みステートメントを使用することの要点は、クエリの構造がデータとは別に送信されることです。これは、データ内の文字がクエリの構造の一部と混同されることがないことを意味します。
この点でクエリを安全にするために必要なことはすべて完了しました。
これはphp.netが言わなければならないことです。
クエリは 1 回だけ解析 (または準備) する必要がありますが、同じまたは異なるパラメーターを使用して複数回実行できます。クエリが準備されると、データベースはクエリを実行するための計画を分析、コンパイル、および最適化します。複雑なクエリの場合、同じクエリを異なるパラメーターで何度も繰り返す必要がある場合、このプロセスに時間がかかり、アプリケーションの速度が著しく低下する可能性があります。プリペアド ステートメントを使用することで、アプリケーションは分析/コンパイル/最適化のサイクルを繰り返す必要がなくなります。これは、プリペアド ステートメントが使用するリソースが少なくなるため、実行速度が速くなることを意味します。
準備済みステートメントのパラメーターは引用符で囲む必要はありません。ドライバーはこれを自動的に処理します。アプリケーションがプリペアド ステートメントのみを使用する場合、開発者は SQL インジェクションが発生しないことを確認できます (ただし、クエリの他の部分がエスケープされていない入力で構築されている場合、SQL インジェクションは依然として可能です)。