[SQL] Extbase은 - 쿼리에서 SQL을 생성 얻을
SQLExtbase은 - 쿼리에서 SQL을 생성 얻을
난 내 TYPO3 확장에서 일부 데이터베이스 테이블을 싶어. 확장은 extbase을 기반으로합니다.
쿼리는 항상 아무 것도 반환하지 않습니다하지만 데이터가 존재
나는 이것을 시도했다 :
$query = $this->createQuery();
$query->statement('SELECT * FROM `my_table`
WHERE field = ? ORDER BY date DESC LIMIT 1',
array($condition));
$results = $query->execute();
이:
$query = $this->createQuery();
$query->matching($query->equals('field', $condition));
$query->setOrderings(array('date' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
$query->setLimit(1);
$results = $query->execute();
모두 반환 결과로 널 (null).
이 클래스는 버그가 어디 있는지 찾기 위해 생성하는 SQL을 얻을 수 있습니까?
좀 extbase 영속 클래스에보고했지만 단서를 찾지 못했습니다
편집하다: 관심이있는 사람들을 위해 .. 나는 "솔루션"을 발견했다.
당신이 문 () 메소드를 사용하여 쿼리를 작성하는 경우, 당신은이 기능으로 쿼리를 인쇄 할 수 있습니다
echo $query->getStatement()->getStatement();
그것은 자리를 대체하지 않습니다. 그러나이 방법으로 변수를 얻을 수 있습니다
var_dump($query->getStatement()->getBoundVariables());
최고의 솔루션 그게 전부 내가 extbase 확장을 편집하지 않고, 발견
해결법
-
==============================
1.그것이 많은 도움이 사용 매우 편안 아니다 있지만,이 코드를 확인하십시오 :
그것이 많은 도움이 사용 매우 편안 아니다 있지만,이 코드를 확인하십시오 :
일반적으로 당신은 buildQuery (배열 $ SQL) 방법의 끝 부분에이 코드가 필요합니다 (*) - 바로 반환 $ 문 앞에;
if (in_array("your_table_name", $sql['tables'])) { var_dump($statement); print_r($statement); }
(*) 클래스 파일 :
당신은 같은 $ 쿼리 가져 오는 후 조건을 추가, \ TYPO3 \ CMS \ 코어 \ 데이터베이스 \ DatabaseConnection :: exec_SELECTquery 방법 내에서 시도 할 수 있습니다 (트림이 중요!)를 :
public function exec_SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy = '', $limit = '') { $query = $this->SELECTquery($select_fields, $from_table, $where_clause, $groupBy, $orderBy, $limit); if (trim($from_table) == 'fe_users') { DebuggerUtility::var_dump($query); } // rest of method
-
==============================
2.TYPO3 6.2에서는 쿼리를 디버깅하는 Extbase DebuggerUtility를 사용할 수 있습니다.
TYPO3 6.2에서는 쿼리를 디버깅하는 Extbase DebuggerUtility를 사용할 수 있습니다.
() 실행> $ 질의 - 전에이 코드를 추가합니다 :
/** @var Typo3DbQueryParser $queryParser */ $queryParser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbQueryParser'); \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->parseQuery($query));
-
==============================
3.지금까지 어떤 포럼에서 언급 된 모든 TYPO3 핵심 코드와하지를 변경하지 않고 쉬운 방법은 PHP를 사용한다 "직렬화 ()"방법 :
지금까지 어떤 포럼에서 언급 된 모든 TYPO3 핵심 코드와하지를 변경하지 않고 쉬운 방법은 PHP를 사용한다 "직렬화 ()"방법 :
$result = $query->execute(); echo (serialize($result));
결과 개체에서 당신은 SQL 쿼리를 찾을 수 있습니다 ( "문을,"...)
-
==============================
4.biesiors 응답 개선 :
biesiors 응답 개선 :
Extbase가 buildQuery ()를 호출 한 후 약간의 자리를 대체, 당신은 단지 $ this-> replacePlaceholders ($ SQL, $ 매개 변수, $ TABLENAME) 후 getObjectDataByQuery ()에 디버그 출력을 배치하는 것을 선호 할 수;
if (strpos($sql, "your_table_name.")) { debug($sql, 'my debug output'); };
또한,보다 효율적으로 사용 디버그 () 대신 위해서 var_dump의 (). [파일 : TYPO3 \ sysext \ extbase \ 클래스 \ 지속성 \ 일반 \ 저장 \ Typo3DbBackend.php. 버전 6.1]에서 라인 339 :
-
==============================
5.
$query = $this->createQuery(); $query->getQuerySettings()->setReturnRawQueryResult(TRUE); $getHotelInfo = 'SELECT * FROM `my_table` WHERE field = ? ORDER BY date DESC LIMIT 1'; return $query->statement($getHotelInfo)->execute();
쿼리를 실행하면 저장소에 대한 쓰기 'setReturnQueryResult'에있다
-
==============================
6.난 그냥 $ _GET을 조건으로, 위의 코드 조각을 확장했다. 디버깅을 위해, 단지 APPEND? "dbg_table = tx_some_of_my_tables"주소, 그리고 당신에게있는 거 갈 준비 ;-)
난 그냥 $ _GET을 조건으로, 위의 코드 조각을 확장했다. 디버깅을 위해, 단지 APPEND? "dbg_table = tx_some_of_my_tables"주소, 그리고 당신에게있는 거 갈 준비 ;-)
if (in_array($_GET['dbg_table'], $sql['tables'])) { echo('<div style="background: #ebebeb; border: 1px solid #999; margin-bottom: 20px; padding: 10px;"><pre style="white-space: normal">'.$statement.'</pre></div>'); }
-
==============================
7.TYPO3 6.1을 사용할 때 문을 디버깅 할 클리너 방법은 Typo3DbBackend의 쿼리 파서를 사용하는 것입니다.
TYPO3 6.1을 사용할 때 문을 디버깅 할 클리너 방법은 Typo3DbBackend의 쿼리 파서를 사용하는 것입니다.
$parser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbBackend'); $params = array(); $queryParts = $parser->parseQuery($query, $params); \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('query', 'my_extension', 1, array('query' => $queryParts, 'params' => $params));
파서는 생성 된 SQL 구문의 다른 부분을 포함하는 배열을 반환합니다.
TYPO3 6.2와 parseQuery 방법은 Typo3DbQueryParser으로 이동하고 두 번째 파라미터를 잃었다.
-
==============================
8.난 SYS "배열 하에서 typo3conf / LocalConfiguration.php 파일이 설정 제안
난 SYS "배열 하에서 typo3conf / LocalConfiguration.php 파일이 설정 제안
'SYS' => array( ...... 'displayErrors' => 1, 'sqlDebug' => 1 ....... )
다음 의도적으로 쿼리에 잘못된 필드 이름을 작성하고 다음 코드를 실행합니다. 이 마지막 쿼리가 오류로 실행이 표시됩니다.
from https://stackoverflow.com/questions/13084863/extbase-get-created-sql-from-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 는 SQL 트랜잭션의 동시성 처리 (0) | 2020.05.28 |
---|---|
[SQL] 다중 열 외래 키 제약 조건 (0) | 2020.05.28 |
[SQL] 열로 날짜를 동적으로 회동하는 방법 (0) | 2020.05.28 |
[SQL] PostgreSQL을 데이터베이스에 이미지를 삽입 (0) | 2020.05.28 |
[SQL] SQL 문자열에 문자열의 첫 번째 발생을 교체 (0) | 2020.05.28 |