In allen DB-Tabellen nach bestimmter Zugriffsebenen-ID (access) suchen (PHP-Script, Stand: Joomla 3.4.3)
Ich wollte beim Entrümpeln im Backend eines mächtigen Joomlas, viele Inhalte, verschiedene Komponenten, Menüs usw., eine überflüssige User-Zugriffsebene löschen. Ich bekam die Meldung "Fehler: Sie können diese Zugriffsebene nicht löschen, da sie von Inhalten verwendet wird". Ein PHP-Script half beim Finden, weil das Suchen per Filter zu zeitaufwendig oder gar nicht möglich war.
Im Joomla-Wurzelverzeichnis lege ich mir eine PHP-Datei findInDb.php an und füge folgenden Code ein.
<?php
// Konfiguration:
// Wert nach dem gesucht werden soll, z.B. die ID einer Zugriffsebene:
$findThisValue = 3;
// Spalte in der gesucht werden soll:
$findInFieldname = 'access';
?>
<?php
// Joomla framework laden
define('_JEXEC', 1);
if (file_exists(__DIR__ . '/defines.php')){
include_once __DIR__ . '/defines.php';
}
if (!defined('_JDEFINES')){
define('JPATH_BASE', __DIR__);
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
// In DB-Tabellen suchen
$db = JFactory::getDbo();
$q = $db->getQuery(true);
$q->select('*')->where($db->qn($findInFieldname) . ' = ' . $db->q($findThisValue));
// Alle Tabellen als Liste:
$tables = $db->getTableList();
// Tabelle für Tabelle durchlaufen.
echo '<h1>Start der Ausgabe</h1>';
foreach ($tables as $table)
{
// Spaltenbezeichner der aktuellen Tabelle als Liste holen:
$cols = $db->getTableColumns($table, true);
// Gibt es die zu durchsuchende Spalte überhaupt?
if (array_key_exists($findInFieldname, $cols))
{
$q->clear('from')->from($db->qn($table));
$db->setQuery($q);
// Alle gefundenen Ergebnisse / datensätze.
$rows = $db->loadAssocList();
// Nur wenn was gefunden, dann Ausgabe der Ergebnisse.
if (!empty($rows))
{
echo '<h1>'.$table.'</h1>';
echo '<pre>';
// Relevantes Feld gelb einfärben und Datensatz ausgeben
echo str_replace(
'['.$findInFieldname.']',
'<span style="background-color:yellow;">['.$findInFieldname.']</span>',
print_r($rows, true)
);
echo '</pre>';
}
}
}
Danach sehe ich im Backend nach, welche ID die zu löschende Zugriffsebene hat und trage sie im Code (Zeile 4, $findThisValue) ein, in meinem Beispiel ist es die ID 3.
Die ACL-Zugriffebene hat in Joomla-Tabellen üblicherweise den Feldbezeichner access, den ich in Zeile 6 ($findInFieldname) eintrage.
Das Script könnte also auch für die tabellenübergreifende Suche in anderen Datenbank-Feldern verwendet werden, bspw. nach state oder published etc. pp. Klappt allerdings nur mit Zahlenwerten / numerischen Werten.
Nach der Konfiguration rufe ich das Script via Browser auf: http://example.org/findInDb.php (example.org ist zu ersetzen durch die Webadresse, mit der Sie die Startseite Ihres Joomla-Frontends aufrufen).
Es werden nur Tabellen der aktuellen Joomladatenbank angezeigt, in der die Suche was gefunden hat. Wem die Tabellennamen reichen, um damit dann im Backend weiterzusuchen, kann die Zeilen 44 bis 51 des Codes ja einfach deaktivieren bspw. durch ein vorangestelltes Gatterzeichen (#) vor jede dieser Zeilen.
Beachten Sie, dass die Ausgabe evtl. auch Tabellen ausgibt, die für das Joomla gar nicht relevant sind. Also bei den ausgegebenen Tabellen auf den jeweiligen Tabellenpräfix achten! Gelegentlich gibt es ja z.B. Tabellen mit Präfix bak_ , die da noch von alten Installationen in der selben Datenbank rumdümpeln wie die, die von Joomla aktuell verwendet werden.
Nachtrag wegen Email-Nachfrage:Dieser Code sucht nur in der Datenbank, ändert nichts! Anhand der ausgegebenen Daten, die meist ausreichend Informationen bzgl. der "schuldigen" Erweiterung und Eintrag beinhalten, müssen Sie selbst im Backend die betreffenden Einträge ändern / löschen.
Nachtrag wegen Email-Nachfrage: Den Tabellenpräfix, den Ihr Joomla verwendet, finden Sie im Beckend unter System > konfiguration > Tabulator Server > Datenbank-Einstellungen. Im Script oben müssen Sie jedoch den Präfix NICHT eingeben.
Aufräumen!
Vergessen sie nicht, das PHP-Skript nach getaner Arbeit wieder vom Server zu löschen.
Download
Per Rechtsklick und Ziel speichern unter (oder ähnlich).
Vor oder nach Upload auf Ihren Server Dateiendung .txt in .php ändern!