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, $bind) {
return preg_replace('/?/', is_numeric($bound) ? $bound : '"' . $bound . '"', $sql, 1);
}, $this->query);</pre>
<p>바꾸시겠습니까? 실제 값: </p>
<pre class="brush:php;toolbar:false;">$data = 배열(
'항목' => '1,
'입력' => '괜찮으세요.'
);</pre>
<pre class="brush:php;toolbar:false;">UPDATE `list` set `item`=?,`type`=? WHERE (`id` = ?) ;
UPDATE `list` set `item`="1",`type`="괜찮으세요." WHERE (`id` = 1) ;</pre>
<p>그러나 값에 ?가 포함되어 있으면 다음과 같이 됩니다. </p>
<pre class="brush:php;toolbar:false;">$data = 배열(
'항목' => '1,
'입력' => '괜찮으세요?'
);</pre>
<pre class="brush:php;toolbar:false;">UPDATE `list` set `item`="1",`type`="괜찮으세요2" WHERE (`id` = ?) ; </pre>
<p>바인딩만 가능하도록 하려면 어떻게 해야 하나요? 교체되었습니다. </p>
먼저 대신 이름이 지정된 매개변수를 사용해 보세요. 代码>. 이 경우 아무것도 바꿀 필요가 없습니다. 명명된 매개변수는 명확하고 로그에 표시하기 매우 쉬우며 디버깅 목적으로 대부분의 dbms 클라이언트에서 지원됩니다.
이름이 지정된 매개변수를 사용할 수 없는 경우(현재 코드베이스가 크거나 다른 이유로 인해) 두 가지 주요 접근 방식이 있습니다.
후자의 방법을 선택하는 경우 빠르고 깔끔하게 수행하는 방법의 예는 다음과 같습니다.
여러 단계로 교체:
?
替换为其他极不可能出现在参数或查询中的内容来准备参数。例如?
.?
,但不会匹配第一步中的替换。如果用?
替换,则为(?
?
替换为?
를 모두 포함합니다.참고: 이 대체 결과는 절대 프로그램의 쿼리로 사용되어서는 안 됩니다. 이 대체품은 다음 중 일부 또는 전부를 구현할 가능성이 있습니다.
?
가 매개변수로 포함된 경우(예: 주석) 결과가 정확하지 않습니다.?
)이 포함되어 있으면 결과가 정확하지 않습니다.출력:
으아악편집: 상수 문자열과 인용된 이름 내 물음표의 영향을 줄이려면 다음 대체 방법을 사용해 보세요.
으아악"`'
로 인용된 블록 외부의"`'
引用的块之外的?
만 대체합니다.데모를 여기에서 볼 수 있습니다.
이것은 완전한 기능을 갖춘 파서가 아니라는 점을 명심하세요. 예를 들어 댓글에 대해서는 알지 못합니다. 따라서 잘못된 대체 가능성이 여전히 높습니다.