0

これが私が現在それを行う方法です:

$db->query(sprintf('INSERT INTO pages (title, content) VALUES ("%s", "%s")',
    $db->e​​sc($title),
    $db->e​​sc($content)));

ご覧のとおり、上記のクエリの各文字列を $db->e​​sc() メソッドに渡すことで、各文字列を手動でエスケープしています。

最初に、準備済みステートメントを使用したくないことを示します。

私が思いつく最良のアイデアは、$db->query() メソッドで sprintf() をラップし、各文字列変換仕様で $db->e​​sc() を自動的に呼び出すことです。次のようにします。

$db->query('INSERT INTO pages (title, content) VALUES ("%s", "%s")',
    $タイトル、
    $コンテンツ);

それは私には素晴らしいように見えますが、今私の質問は、フォーマット文字列からすべての文字列変換仕様を正しく解析し、それぞれの引数で $db->e​​sc() を呼び出す方法です (すべてを sprintf() に渡す前に) ?

別の方法でやりますか?

4

2 に答える 2

1

まず、準備済みステートメントを使用することを示します。あなたが話している非常に自動の「エスケープ
」(と呼ばれる必要がありますが)は、まさに準備されたステートメントです。 プリペアド ステートメントは、必ずしもデータベースでサポートされているネイティブのプリペアド ステートメントに基づいている必要はありません。準備されたステートメントの一般的な考え方は、プレースホルダーでクエリ部分を表し、プレースホルダーを実際のデータに置き換えるときに何らかのフォーマットを適用することです。つまり、あなたのアプローチはすでにプレースホルダー AKA 準備済みステートメントを使用しています。

しかし、あなたが見逃した重要なことがいくつかあります

  • 「逃げる」ことはの役にも立ちません。代わりに適切なフォーマットを適用する必要があります
  • 適切な文字列の書式設定には、引用符エスケープのいずれかが必要であるため、準備済みステートメント ハンドラーは両方を適用する必要があります。
  • 複数の異なる SQL リテラルがあり、それぞれに異なるフォーマットが必要です。したがって、実際の要件を満たすために、単一のesc()機能に頼ることはできません。

それで、ここに行きます-あなたが求めているそのようなラッパーのコードは、正しいフォーマットを行います。したがって、クエリはPDOと同じくらい安全です。ただし、PDO にはすべての制限があります。

したがって、クエリに追加される可能性のあるすべてのものを適切にフォーマットしたい場合は、別のラッパー、より複雑なものが必要になります: safeMysql

于 2013-05-08T05:35:08.487 に答える