Problemstellung

Ich nutze für verschiedene Joomla Installationen [also auch verschiedene Tabellen-Prefixe der Art xyz_], die gleiche Datenbank. Gibt es eine Möglichkeit, bei der ich alle Tabellen mit einem bestimmten Präfix gleichzeitig löschen kann? Oder noch besser, einen Weg, bei dem ich angebe, welche Tabellen mit welchem Präfix ich behalten will und alle anderen werden gelöscht?

Quelle: https://forum.joomla.de/thread/12382-tabellen-l%C3%B6schen/?postID=76807#post76807

Lösungsansatz mit Joomla-Code

Dass vorher Datenbank-Backups gemacht werden müssen... selbstredend.

Der Code geht davon aus, dass die Datenbank nur Joomla-Tabellen enthält, also alle einen üblichen Joomla-Prefix haben.

Die Prefix-Prüfung geschieht anhand des ersten Teils des Tabellennamens, also der Anfangsteil inklusive ersten Unterstrich _.

Wo man den Code in Joomla einsetzt? Beispielsweise an den Anfang der Template index.php und Seite ein mal aufrufen oder in einen Modul-Override oder ...


$options = array(
    'driver' => 'mysqli',
    'host' => 'localhost',
    'user' => 'userName',
    'password' => 'Ct8tApDU6tYcsJtw',
    'database' => 'dataBaseName',
    'prefix' => ''
);

$db = JDatabaseDriver::getInstance($options);
$tables = $db->getTableList();
$queries = '';

// Auszuschließende Tabellen-Prefixe inklusive Unterstrich:
$excludePrefix = ['e0mxh_', 'furleka_'];

foreach ($tables as $table)
{
    // Paranoia
    if (strpos($table, '_') === false)
    {
        continue;
    }

    $prefix = explode('_', $table)[0] . '_';

    if (!in_array($prefix, $excludePrefix))
    {
        $query = 'DROP TABLE IF EXISTS `' . $table . '`';
        $queries .= $query . ' ' . PHP_EOL;
        $db->setQuery($query);
        $db->execute();
    }
}

echo ' DONE' . print_r($queries, true) . '';exit;