>  Q&A  >  본문

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, $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>
P粉654894952P粉654894952436일 전495

모든 응답(1)나는 대답할 것이다

  • P粉619896145

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

    먼저 대신 이름이 지정된 매개변수<代码>를 사용해 보세요. . 이 경우 아무것도 바꿀 필요가 없습니다. 명명된 매개변수는 명확하고 로그에 표시하기 매우 쉬우며 디버깅 목적으로 대부분의 dbms 클라이언트에서 지원됩니다.

    이름이 지정된 매개변수를 사용할 수 없는 경우(현재 코드베이스가 크거나 다른 이유로 인해) 두 가지 주요 접근 방식이 있습니다.

    1. SQL 쿼리 파서를 사용하세요. 가장 신뢰할 수 있는 결과를 만들어 낼 것입니다.
    2. 직접 작성한 "대체자"를 사용하세요. 그 결과는 결코 이상적이거나 완전히 신뢰할 수는 없지만 성능과 개발 측면에서 모두 빨라야 합니다.

    후자의 방법을 선택하는 경우 빠르고 깔끔하게 수행하는 방법의 예는 다음과 같습니다.

    여러 단계로 교체:

    1. 추가하여 ? 替换为其他极不可能出现在参数或查询中的内容来准备参数。例如?.
    2. 정규식을 사용하여 매개변수를 바꾸면 일치합니다. ?,但不会匹配第一步中的替换。如果用 ? 替换,则为 (?
    3. 결과에 ? 替换为 ?를 모두 포함합니다.

    참고: 이 대체 결과는 절대 프로그램의 쿼리로 사용되어서는 안 됩니다. 이 대체품은 다음 중 일부 또는 전부를 구현할 가능성이 있습니다.

    • SQL 주입,
    • 초기 쿼리에 ?가 매개변수로 포함된 경우(예: 주석) 결과가 정확하지 않습니다.
    • 초기 쿼리나 매개변수에 대체 문자열(이 경우 ?)이 포함되어 있으면 결과가 정확하지 않습니다.
    으아악

    출력:

    으아악

    편집: 상수 문자열과 인용된 이름 내 물음표의 영향을 줄이려면 다음 대체 방법을 사용해 보세요.

    으아악

    "`'로 인용된 블록 외부의 "`' 引用的块之外的 ?만 대체합니다.

    데모를 여기에서 볼 수 있습니다.

    이것은 완전한 기능을 갖춘 파서가 아니라는 점을 명심하세요. 예를 들어 댓글에 대해서는 알지 못합니다. 따라서 잘못된 대체 가능성이 여전히 높습니다.

    회신하다
    0
  • 취소회신하다