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