php PDOはクエリ内の匿名パラメータ(「?」)を編集可能な値に置き換えます
P粉654894952
2023-09-02 11:38:14
<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>
まず、 の代わりに 名前付きパラメータ を使用することを検討してください? 代码>。この場合、何も置き換える必要はありません。名前付きパラメータは明確で、ログに表示するのが非常に簡単で、デバッグ目的でほとんどの dbms クライアントでサポートされています。
名前付きパラメーターが (現在のコードベースのサイズまたはその他の理由により) 使用できない場合は、主に 2 つの方法があります。
後者のアプローチを選択した場合、これを迅速かつ汚いやり方で行う方法の例を次に示します。
複数の手順で置換:をパラメータまたはクエリに現れる可能性が非常に低い別の文字に置き換えて、パラメータを準備します。例えば###\?###。
正規表現を使用してパラメータを置換します。これは
?に置き換えると
(?結果内のすべての \?
に置き換えます。
使用しないでください。この置き換えにより、次のいずれかまたはすべてが実装される可能性があります: SQL インジェクション,
最初のクエリにパラメータとして (コメントなどで)?- が含まれている場合、結果は不正確になります。
最初のクエリまたはパラメータに置換文字列 (この例では - \?
リーリー
- 出力:
編集:
定数文字列および引用符で囲まれた名前内の疑問符の影響を軽減するには、次の置換を使用してみてください:) が含まれている場合、結果は不正確になります。
リーリー
リーリー
"`' で囲まれたブロックの外側の ?
を置き換えるだけです。デモは
ここでご覧いただけます。