php PDO는 쿼리의 익명 매개변수('?')를 편집 가능한 값으로 바꿉니다.
P粉654894952
P粉654894952 2023-09-02 11:38:14
0
1
458

익명 매개변수(?)가 실제 매개변수로 대체될 때 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` = ?) ; 

바인딩만 가능하도록 하려면 어떻게 해야 하나요? 교체되었습니다.

P粉654894952
P粉654894952

모든 응답 (1)
P粉619896145

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

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

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

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

여러 단계로 교체:

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

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

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

출력:

으아악

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

으아악

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

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

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

    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿
    회사 소개 부인 성명 Sitemap
    PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!