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.
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(); }
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();
echo $truncate->dump();
, brach das Skript und sagte: Schwerwiegender Fehler: Aufrufen einer Mitgliedsfunktion dump () auf null
->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
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.
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.