PHP PDO ersetzt den anonymen Parameter („?') in der Abfrage durch einen bearbeitbaren Wert
P粉654894952
2023-09-02 11:38:14
<p>Ich möchte zeigen, wie die SQL-Abfrage aussieht, wenn die anonymen Parameter (<code>?</code>) durch tatsächliche Parameter ersetzt werden. </p><p>
Dies dient <strong>nur</strong> der besseren Lesbarkeit und dem Debuggen und wird nicht als tatsächliche Abfrage verwendet. </p>
<p>Ich habe festgestellt, dass diese Funktion in den meisten Fällen funktioniert: </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>Ersetzen? und tatsächlicher Wert: </p>
<pre class="brush:php;toolbar:false;">$data = array(
'item' => '1,
'type' => 'Geht es dir gut?'
);</pre>
<pre class="brush:php;toolbar:false;">UPDATE `list` set `item`=?,`type`=? WHERE (`id` = ?) ;
UPDATE `list` set `item`="1",`type`="Sind Sie in Ordnung?" WHERE (`id` = 1) ;</pre>
<p>Aber wenn der Wert ? enthält, erhalte ich Folgendes: </p>
<pre class="brush:php;toolbar:false;">$data = array(
'item' => '1,
'type' => 'Geht es dir gut?'
);</pre>
<pre class="brush:php;toolbar:false;">UPDATE `list` set `item`="1",`type`="Are you ok2" </pre>
<p>Wie kann ich das so gestalten, dass es nur bindet? wurde ersetzt. </p>
首先,考虑使用命名参数而不是?代码>。在这种情况下,您不需要替换任何内容:命名参数清晰且相当容易在日志中显示,并且大多数 dbms 客户端都支持用于调试目的。
如果命名参数不可行(由于当前代码库较大或任何其他原因),您有两种主要方法:
如果您选择后一种方式,这里是如何快速而肮脏地完成它的示例:
分多个步骤进行替换:
?
替换为其他极不可能出现在参数或查询中的内容来准备参数。例如\?
。?
,但不会匹配第一步中的替换。如果用\?
替换,则为(?
\?
替换为?
。注意:此替换的结果不应永远用作程序中的查询。这种替代有可能实现以下任何或所有功能:
?
而不是作为参数(例如在注释中),结果不准确,\?
),结果将不准确。输出:
编辑:要尝试降低常量字符串和带引号的名称内问号的影响,您可以尝试使用此替换:
它仅替换用
"`'
引用的块之外的?
。可以在此处查看演示。
请记住,这不是完全成熟的解析器。例如,它不知道评论。因此错误替换的可能性仍然很大。