PDO가있는 PHP에서 최종 SQL 매개 변수화 쿼리를 확인하는 방법은 무엇입니까? [복제]
이 질문에는 이미 답변이 있습니다.
PHP에서 매개 변수화 된 쿼리로 PDO로 MySQL 데이터베이스에 액세스 할 때 모든 토큰을 교체 한 후 최종 쿼리를 어떻게 확인할 수 있습니까?
데이터베이스에서 실제로 실행되는 것을 확인하는 방법이 있습니까?
그래서 나는 기록에 대한 완전한 해결책을 갖기 위해 마침내 내 자신의 질문에 대답 할 것이라고 생각합니다. 그러나 Ben James와 Kailash Badu에게 감사의 말을 전합니다.
짧은 답변 
 Ben James가 언급 한 바와 같이 : NO . 
토큰이있는 쿼리 및 매개 변수가 데이터베이스에 별도로 전송되므로 전체 SQL 쿼리가 PHP 측에 존재하지 않습니다. 데이터베이스 측에서만 전체 쿼리가 존재합니다.
PHP 측에서 토큰을 교체하는 함수를 만들려고해도 교체 프로세스가 SQL 프로세스와 동일하다는 것을 보장하지는 않습니다 (토큰 유형, bindValue 대 bindParam 등의 까다로운 것들 ...)
해결 방법 
 Kailash Badu의 답변을 자세히 설명합니다. 모든 SQL 쿼리를 로깅하면 서버에서 실제로 실행되는 것을 볼 수 있습니다. mySQL을 사용하면 my.cnf (또는 내 경우 Wamp 서버의 경우 my.ini)를 업데이트하고 다음과 같은 줄을 추가하면됩니다.
log=[REPLACE_BY_PATH]/[REPLACE_BY_FILE_NAME]
프로덕션에서 이것을 실행하지 마십시오!
매개 변수 값이있는 준비된 명령문을 사용하는 것은 단순히 SQL 문자열을 동적으로 작성하는 다른 방법이 아닙니다. 데이터베이스에서 준비된 명령문을 작성한 후 매개 변수 값만 보내십시오.
따라서 아마도 데이터베이스로 보내지는 것은 PREPARE ..., SET ...그리고 마지막 이 될 것 EXECUTE ...입니다.
SELECT * FROM ...같은 쿼리가 실제로 데이터베이스로 전송되지 않았기 때문에 동등한 결과를 생성하더라도, 와 같은 SQL 문자열을 얻을 수 없습니다.
을 사용할 수 있습니다 PDOStatement->debugDumpParams. PHP 문서를 참조하십시오 .
준비된 명령문으로 실행 된 정확한 쿼리를 보려면 쿼리 로그를 확인합니다.
처음에는 PDO를 모니터링하기 위해 로깅을 설정하는 것을 피했습니다. PDO가 번거로울 것이라고 생각했기 때문에 전혀 어렵지는 않습니다. MySQL을 재부팅 할 필요는 없습니다 (5.1.9 이후).
이 SQL을 phpMyAdmin 또는 높은 db 권한이있는 다른 환경에서 실행하십시오.
SET GLOBAL general_log = 'ON';
터미널에서 로그 파일을 마무리하십시오. 광산은 여기에 있었다 :
>sudo tail -f /usr/local/mysql/data/myMacComputerName.log
이 터미널 명령으로 mysql 파일을 검색 할 수 있습니다.
>ps auxww|grep [m]ysqld
PDO가 모든 것을 탈출한다는 것을 알았으므로 쓸 수 없습니다.
$dynamicField = 'userName';
$sql = "SELECT * FROM `example` WHERE `:field` = :value";
$this->statement = $this->db->prepare($sql);
$this->statement->bindValue(':field', $dynamicField);
$this->statement->bindValue(':value', 'mick');
$this->statement->execute();
그것이 생성하기 때문에 :
SELECT * FROM `example` WHERE `'userName'` = 'mick' ;
오류가 발생하지 않았으며 빈 결과 만 나타납니다. 대신에 사용해야했습니다
$sql = "SELECT * FROM `example` WHERE `$dynamicField` = :value";
얻을
SELECT * FROM `example` WHERE `userName` = 'mick' ;
완료되면 다음을 실행하십시오.
SET GLOBAL general_log = 'OFF';
그렇지 않으면 통나무가 커질 것입니다.
실제 쿼리를 인쇄하기 위해 수행 한 것은 약간 복잡하지만 작동합니다. :)
내 문장에 변수를 할당하는 방법에는 다음과 같은 다른 변수가 있습니다.
$this->fullStmt = str_replace($column, '\'' . str_replace('\'', '\\\'', $param) . '\'', $this->fullStmt);
여기서 : 
 $column내 토큰 
 $param은 토큰 에 할당되는 실제 값입니다. 토큰 
 $this->fullStmt이 교체 된 인쇄 전용 명세서입니다.
실제 PDO 할당이 발생하면 토큰을 단순히 값으로 대체합니다.
I hope I did not confuse you and at least pointed you in right direction.
The easiest way it can be done is by reading mysql execution log file and you can do that in runtime.
There is a nice explanation here:
How to show the last queries executed on MySQL?
I don't believe you can, though I hope that someone will prove me wrong.
I know you can print the query and its toString method will show you the sql without the replacements. That can be handy if you're building complex query strings, but it doesn't give you the full query with values.
I think easiest way to see final query text when you use pdo is to make special error and look error message. I don't know how to do that, but when i make sql error in yii framework that use pdo i could see query text
'Programming' 카테고리의 다른 글
| Linux에서 쓰기 손실을 유발하는 I / O 오류에 대처하기위한 프로그램 작성 (0) | 2020.06.23 | 
|---|---|
| 왜 Kotlin에서 Java 정적 필드를 대체하기 위해“companion object”를 사용합니까? (0) | 2020.06.23 | 
| 브라우저에서 마우스 휠 속도 정상화 (0) | 2020.06.23 | 
| `void_t`는 어떻게 작동합니까 (0) | 2020.06.23 | 
| .net 4에서 async-await 사용 (0) | 2020.06.23 |