SQL-Queries Debuggen in Typo3

29. September 2014 | 12 Kommentare

TYPO3 Tutorials by undkonsorten BerlinOft kommt es vor das das frisch gebaute Repository keine Ergebnisse zurück liefert. Meistens fehlt dann nur eine gesetzte Storage PID. Doch was wenn sich das Repository weiterhin hartnäckig weigert Ergebnisse zurück zu liefern?

Dann wird es Zeit etwas tiefer in die Materie einzusteigen und ordentlich zu debuggen.

Zunächst macht es Sinn, sich seine gebauten Constraints anzuschauen und genau zu überlegen ob dort ein Logikfehler vorliegt. Ich baue meine Queries meist so:

PHP (Repository)

$constraints = array();
 
if($demand->getListMode()=="archive"){
  $archivConstraints[] = $query->lessThan('start', time());
  $archivConstraints[] = $query->logicalOr(
    array(
    0=>$query->equals('end', 0),
    1=>$query->lessThan('end', time())
    )
  );
  $constraints[] = $query->logicalAnd($archivConstraints);
}
 
if (is_array($searchWords) && count($searchWords)) {
  foreach($searchWords as $searchWord){
    $searchWordConstraint = array();
    foreach ($searchFields as $field) {
      //Search for each word seperatly
      $searchWordConstraint[] = $query->like($field, '%' . $searchWord . '%');
    }
    $searchConstraints[] = $query->logicalOr($searchWordConstraint);
  }
  $constraints[] = $query->logicalAnd($searchConstraints);
}

Constraints ausgaben (var_dump)

Jetzt kann man die gebauten Constraints debuggen, indem man folgende Zeile in seinen php-Code einfügt:

PHP

\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($constraints);

Dies bringt uns zu folgendem Ergebnis:


Bildschirmfoto - 26.09.2014 - 11:36:14

Liegt hier kein Logikfehler vor, hilft nur noch ein Blick in die SQL-Query die von Extbase tatsächlich gebaut wird.

SQL-Query debuggen

Früher konnte man in sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php in der buildQuery() Funktion das Statement debuggen, das geht aber seit Typo3 6.2 nicht mehr.

Daher habe ich eine Funktion geschrieben die ein QueryResult erfordert und dessen SQL-Query zurückgeliefert.

PHP

/**
* Debugs a SQL query from a QueryResult
*
* @param \TYPO3\CMS\Extbase\Persistence\Generic\QueryResult $queryResult
* @param boolean $explainOutput
* @return void
*/
public function debugQuery(\TYPO3\CMS\Extbase\Persistence\Generic\QueryResult $queryResult, $explainOutput = FALSE){
  $GLOBALS['TYPO3_DB']->debugOutput = 2;
  if($explainOutput){
    $GLOBALS['TYPO3_DB']->explainOutput = true;
  }
  $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = true;
  $queryResult->toArray();
  DebuggerUtility::var_dump($GLOBALS['TYPO3_DB']->debug_lastBuiltQuery);
 
  $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = false;
  $GLOBALS['TYPO3_DB']->explainOutput = false;
  $GLOBALS['TYPO3_DB']->debugOutput = false;
}

Aufgerufen wird sie im Controller:

PHP

$events = $this->eventRepository->findDemanded($demand, $limit);
$this->debugQuery($events);

Ergebnis:

Bildschirmfoto - 26.09.2014 - 11:28:22

Der Trick dabei ist, das wenn $queryResult->toArray(); aufgerufen wird das SQL-Statement neu ausgeführt wird.

Fröhliches debuggen.

Ähnliche Artikel:

Meta-Daten



12 Kommentare

Auch mal Kommentieren:

Kommentar