PHP TYPO3 SQL-Debug Objekt add

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
825
Hallo,

ich bin grade echt zu blöd, folgendes zu debuggen:

PHP:
$this->testRepository->add($test);
$this->persistenceManager->persistAll();

Hab alles was das Netz hergibt ergoogelt, aber ich bekomme immer die Fehlermeldung:

Code:
Argument 1 passed to ...::debugQuery() must be an instance of TYPO3\CMS\Extbase\Persistence\Generic\QueryResult, null given, called in Test.php on line 179

debugQuerry Function ist:

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;
    }

Kommentiere ich
PHP:
$this->testRepository->add($test);
aus, erfolgt auch kein Eintrag in der DB. Kommentiere ich es ein, erfolgt der Eintrag in der DB.
Ergänzung ()

Mit
PHP:
$GLOBALS['TYPO3_DB']->store_lastBuiltQuery = 1;
echo $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;
bekomme ich nur ein SELECT angezeigt. Ich brauche aber das INSERT.
 
Zuletzt bearbeitet:
An das rohe SQL zu kommen ist in TYPO3 nicht immer einfach, daher frage ich erst mal warum du überhaupt da ran möchtest? Wird dein Objekt nicht richtig persistiert? Das kann mehrere Gründe haben.

1. Dein Objekt ist nicht vollständig valide (wenn du in deiner Funktion / Aktion schon ein @donotvalidate als Annotation hast, dann nimm das mal raus).
2. Guck mal in die rohe SQL Datenbank mit einem PHPMyAdmin oder dem Adminer und schau mal ob dein Objekt vllt. doch in der Tabelle landet und nur eben nicht auf der "pid", auf der du es erwartest, weil deine PersistenceStoragePageId nicht richtig gesetzt ist.
 
Mir wird ein anderer Inhalt in die Datenbank geschrieben, als ich bei einem var_dump erhalte. Und zwar bei dem Datum.

https://php.net/manual/en/datetime.setdate.php

Ich habe '2018-09-24 00:00:00.000000' drin stehen, aber im SQL landet '2018-09-23'. Problem ist hier, dass es '2018-09-24' sein müsste. Auch in dem SELECT steht die 24 und keine 23. Daher wollte ich mir das INSERT anschauen. Denn bis vor dem "add" ist alles richtig.

PHP:
object(DateTime)#1466 (3) {
    ["date"]=>
    string(26) "2018-09-24 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(13) "Europe/Berlin"
  }

Bei php5.6 funktionierte es. Bei php7.2 nicht.
 
DateTime ist ebenfalls ein wenig "buggy" in TYPO3, da ist ein Kollege im Laufe dieser oder nächster Woche auch fleißig mit Debugging beschäftigt ;) Wobei ich anstatt "buggy" wohl eher "verwirrend" sagen sollte. Der eigentliche "Bug" betrifft nur die Backend-DateTime Felder zur direkten Pflege.
Was TYPO3 generell machen möchte ist immer ein DateTime als UTZ in der Datenbank zu speichern, daher hast du dort ein anderes Datum stehen als du z.B. im Frontend in einem Formular einspeist, was du dann in DateTime umwandelst und speichern möchtest. Beim Aufruf der zugehörigen get-Funktion (also z.B. im Fluidtemplate mit {news.datetime->f:format.date(.....)} sollte er das in der Ausgabe eigentlich wieder zurück "wandeln" und die Zeitzone ausgeben die entweder in deiner TYPO3 Config bzw. der Server Config hinterlegt ist.
Im Backend-Feld hingegen steht es dann aber falsch, weil er dort nicht konvertiert (das Problem hatte ich zumindest mal bei 6.2 oder 7.6, weiß nicht mehr). Relativ fehlerfrei fährst du mit "normalen" Timestamps, da ist das handling nicht so komplex und bisher auch fehlerfrei innerhalb von TYPO3.
 
Mit Frontend hatte ich auch gelesen. Benötige dies nur als Task, dass einfach die Werte in die DB schreiben soll. Es hat ja vorher funktioniert. Jetzt mit TYPO3 und php7.2 ist er ein Tag zurück.

Edit:
Ich habe es jetzt mit Timestamp gemacht und läuft.
 
Zuletzt bearbeitet:
Datumsfelder immer als timestamp. Damit ist man am flexibelsten und man hat weniger Probleme. Ob das jetzt am typo3 liegt oder an deiner server konfiguration wird so nicht ersichtlich
Was steht den nach einen Klick auf das Scheduler Module im Backend für eine Zeit? ;-)
 
Zurück
Oben