it-swarm.com.de

Warum erstellt die truncateTable () -Methode eine leere Zeichenfolge für eine Abfrage und löscht keine Zeilen?

Ich habe den folgenden Code versucht, eine Tabelle abzuschneiden. Die Joomla-Dokumentation lässt mich glauben, dass dies funktionieren wird, aber es funktioniert nicht. Was vermisse ich?

$db = JFactory::getDbo();
truncate_query = $db->getQuery(true);
//$truncate_query = 'TRUNCATE ' . $db->quoteName('#__mytable');
$truncate_query->truncateTable($db->quoteName('#__mytable'));
$db->setQuery($truncate_query);
echo $truncate_query;
exit();

Die echo-Anweisung zeigt nichts an. Wenn ich die auskommentierte Zeile verwende, um das SQL manuell zu generieren, funktioniert es.

Der Grund, warum ich die Funktion truncateTable() verwenden möchte, ist, dass ich versuche, die Kürzung in eine Transaktion aufzunehmen. Wenn ich die manuelle Anweisung TRUNCATE verwende, wird die Tabelle auch dann noch abgeschnitten, wenn ein anderer Teil der Transaktion fehlschlägt. Dies ist ärgerlich, da die anderen Aussagen vom Erfolg der Kürzung abhängen. Wenn also die Tabelle geleert wird, obwohl dies nicht der Fall sein sollte, sind keine Daten mehr vorhanden, um die Transaktion erneut auszuführen.

1
Rob

Aktualisieren:

Es scheint, dass die Aufrufe setQuery() und execute() bereits im Funktionsumfang enthalten sind ...

From https://github.com/joomla/joomla-cms/blob/staging/libraries/joomla/database/driver.php

/**
 * Method to truncate a table.
 *
 * @param   string  $table  The table to truncate
 *
 * @return  void
 *
 * @since   11.3
 * @throws  RuntimeException
 */
public function truncateTable($table)
{
    $this->setQuery('TRUNCATE TABLE ' . $this->quoteName($table));
    $this->execute();
}

So rufen Sie die Kürzung auf/führen sie aus (ich habe sie gerade getestet und sie funktioniert):

class modTrunctestHelper
{
    public function deleteAllRows(){
        JFactory::getDbo()->truncateTable('#__guineapig');
    }
}

Ich habe auch eine Antwort auf Ihre wiederholte Stackoverflow-Frage mit einem anderen Wortlaut gepostet.


Ursprünglicher Beitrag:

Ich glaube, dieses Problem/dieser Bug sollte den Joomla-Kernentwicklern zur Kenntnis gebracht werden.

Ich kann bestätigen, dass ich das Problem reproduzieren konnte.

Ich habe ->truncateTable() auf meiner #__guineapig - Tabelle ausgeführt und dabei einige Kontrollpunkte eingefügt:

class modTrunctestHelper
{
    public function deleteAllRows(){
        $db = JFactory::getDbo();
        try {
            $truncate = $db->getQuery(true)
                           ->truncateTable('#__guineapig');
            // $truncate = 'TRUNCATE #__guineapig';
            // $truncate = $db->getQuery(true)
            //                ->delete('#__guineapig');
            echo $truncate->dump();
            $db->setQuery($truncate);
            $db->execute();
            echo $db->getAffectedRows() , 'Rows Of Data Deleted';
        } catch (Exception $e) {
            echo "Syntax Error" , $e->getMessage();
        }
    }
}
$TT = new modTrunctestHelper();
$TT->deleteAllRows();
  1. Wenn ich schrieb: echo $truncate->dump();, brach das Skript und sagte:

    Schwerwiegender Fehler: Aufrufen einer Mitgliedsfunktion dump () auf null

  2. Wenn ich ->dump() entfernt habe, um den Fehler zu vermeiden, kann die Ausführung einer null Zeichenfolge als Abfrage (duh) nichts Sinnvolles bewirken. Die Seite wird angezeigt:

    Syntax-Fehler

  3. Durch Ausführen der unformatierten Abfrage TRUNCATE #__guineapig (Über setQuery() und dann execute()) wurden alle Zeilen gelöscht und der automatisch inkrementierte Index wie erwartet zurückgesetzt. Für den Datensatz ist $db->getNumRows() ungeeignet und funktioniert nicht. während $db->getAffectedRows() eine Zählung von 0 erzeugte, weil das MySQL-Handbuch sagt:

    Kürzungsvorgänge geben keinen aussagekräftigen Wert für die Anzahl der gelöschten Zeilen zurück.

  4. Wenn Sie verzweifelt sind (und ich glaube nicht, dass Sie es müssen), um JDatabase-Methoden zu verwenden, könnten Sie verwenden delete(), das mit getAffectedRows() spricht, aber dies ist ein völlig anderer Prozess mit unterschiedlichen Verhaltensweisen. Insbesondere setzen DELETE Abfragen die automatische Inkrementierungszahl nicht zurück. In meinem früheren Link zum Handbuch erfahren Sie genau, was TRUNCATE Abfragen bewirken.
0
mickmackusa