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

php PDOはクエリ内の匿名パラメータ(「?」)を編集可能な値に置き換えます

<p>匿名パラメータ (<code>?</code>) を実際のパラメータに置き換えたときに SQL クエリがどのようになるかを示す方法が欲しいです。 </p><p> これは読みやすさとデバッグを目的とした <strong> のみ </strong> であり、実際のクエリとしては使用されません。 </p> <p>この関数はほとんどの場合に機能することがわかりました: </p> <pre class="brush:php;toolbar:false;">return array_reduce($this->bindValues, function ($sql, $binding) { return preg_replace('/\?/', is_numeric($binding) ? $binding : '"' . $binding . '"', $sql, 1); }, $this->query);</pre> <p>交換しますか?実際の値: </p> <pre class="brush:php;toolbar:false;">$data = array( 'アイテム' => '1, 'type' => '大丈夫ですか。' );</pre> <pre class="brush:php;toolbar:false;">UPDATE `list` set `item`=?,`type`=? WHERE (`id` = ?) ; UPDATE `list` set `item`="1",`type`="Are you ok." WHERE (`id` = 1) ;</pre> <p>しかし、値に ? が含まれる場合、次のようになります: </p> <pre class="brush:php;toolbar:false;">$data = array( 'アイテム' => '1, 'type' => '大丈夫ですか?' );</pre> <pre class="brush:php;toolbar:false;">UPDATE `list` set `item`="1",`type`="Are you ok2" WHERE (`id` = ?) ; </pre> <p>これをバインドのみにするにはどうすればよいですか?交換されました。 </p>
P粉654894952P粉654894952386日前465

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

  • P粉619896145

    P粉6198961452023-09-03 10:06:17

    まず、 の代わりに 名前付きパラメータ <代码> を使用することを検討してください? 。この場合、何も置き換える必要はありません。名前付きパラメータは明確で、ログに表示するのが非常に簡単で、デバッグ目的でほとんどの dbms クライアントでサポートされています。

    名前付きパラメーターが (現在のコードベースのサイズまたはその他の理由により) 使用できない場合は、主に 2 つの方法があります。

    1. SQL クエリ パーサーを使用します。最も信頼性の高い結果が得られます。
    2. ある種の自作の「置換」を使用します。その結果は決して理想的または完全に信頼できるものではありませんが、パフォーマンスと開発の両方の点で高速である必要があります。

    後者のアプローチを選択した場合、これを迅速かつ汚いやり方で行う方法の例を次に示します。

    複数の手順で置換:

    1. ? をパラメータまたはクエリに現れる可能性が非常に低い別の文字に置き換えて、パラメータを準備します。例えば###\?###。 正規表現を使用してパラメータを置換します。これは ?
    2. に一致しますが、最初のステップの置換とは一致しません。
    3. \? に置き換えると (? 結果内のすべての \?
    4. ? に置き換えます。
    5. 注:
    この置換の結果は、プログラム内のクエリとして

    使用しないでください。この置き換えにより、次のいずれかまたはすべてが実装される可能性があります: SQL インジェクション,

    最初のクエリにパラメータとして (コメントなどで)
      ?
    • が含まれている場合、結果は不正確になります。
    • 最初のクエリまたはパラメータに置換文字列 (この例では
    • \?) が含まれている場合、結果は不正確になります。
    • リーリー
    • 出力: リーリー
    • 編集:
    定数文字列および引用符で囲まれた名前内の疑問符の影響を軽減するには、次の置換を使用してみてください:

    リーリー

    "`' で囲まれたブロックの外側の ?

    を置き換えるだけです。

    デモは ここ でご覧いただけます。

    これは完全に本格的なパーサーではないことに注意してください。たとえば、コメントについては認識されません。したがって、誤った置換が行われる可能性は依然として高いです。

    返事
    0
  • キャンセル返事