deleteclient.php version 0.02ff
deleteclient.php version 0.02ff
Hier eine neue, etwas vollständigere Version des deleteclient.php scripts für Contenido Version 4.5.3.
Diese löscht weiteren Tabellen die mit idClient verknüpften Datensätze.
edit: durch neuere version ersetzt, siehe unten
Diese löscht weiteren Tabellen die mit idClient verknüpften Datensätze.
edit: durch neuere version ersetzt, siehe unten
Zuletzt geändert von knb am Mi 16. Nov 2005, 14:06, insgesamt 1-mal geändert.
Gruss,
Knut
Knut
da du es erwähnst...
lang_bereich, lang_key, lang_value, data, config_client, config
sind irrelevant da sie in den aktuellen releases nicht mehr verwendet werden...
das posting hättest du ruhig ans andere ranhängen können
lang_bereich, lang_key, lang_value, data, config_client, config
sind irrelevant da sie in den aktuellen releases nicht mehr verwendet werden...
das posting hättest du ruhig ans andere ranhängen können
*** make your own tools (wishlist :: thx)
deleteclient.php version 0.03
noch einmal dasselbe script mit leicht überarbeitetem Hinweistext und Versionsgeschichte.
TODO: klären was mit cat_tree passieren soll.
edit: durch neuere Version ersetzt, siehe unten
TODO: klären was mit cat_tree passieren soll.
edit: durch neuere Version ersetzt, siehe unten
Zuletzt geändert von knb am Mi 16. Nov 2005, 14:07, insgesamt 1-mal geändert.
Gruss,
Knut
Knut
0.06: INNER JOIN Syntax weg, multiple-table-DELETE noch drin
Code: Alles auswählen
<?php
/* Dieses Script löscht die meisten Tabelleneinträge
* von einem Mandanten ($old_idclient) .
* Version 0.07 20060524
*
* 0.07 Bugfix: $clients_lang wurde nicht richtig gesetzt
* 0.06: Hinweistexte verbessert , toten Code entfernt (ein bisschen ist wohl noch drin), INNER JOIN Syntax weg
* 0.05: Neuaufbau von cat_tree wird auch "simuliert"
* 0.04: 20051028: mehr Tabellen: Module translations, newslettergroups und newslettergroupmembers, art_spec werden auch gelöscht.
* 0.03: nur Hinweistexte korrigiert, keine Änderungen am code
* 0.02: mehr tabellen hinzugenommen
* 0.01: minimalversion, proof-of-concept
* Für Contenido 4.5.+ , 4.6.x .
*
* 4.4.x ungetestet - sollte größtenteils auch gehen aber einige Tabellen existierten da noch nicht => Fehler (ignorierbar)
*
* Mysql DB muss auf version 4 oder höher sein. version 3.23 hat schwierigkeiten mit dem generierten SQL Code.
* Autor: Knut Behrends
* Status: FUNKTIONSFÄHIG aber möglw. unvollständig (Tabellen von installierten Plugins werden ignoriert)
* im Datenmodell bleiben dann eventuell einige mit nichts mehr verknüpfte Datensätze zurück.
*
* TODO: einbauen LOCK Tables vor jedem DELETE FROM ...
* TODO: einbauen Fallunterscheidung: Contenidoversion bestimmen => Tabellenauswahl
* TODO: alternativ: if exists Tablename ...delete from
* TODO: toten Code entfernen
* TODO: INNER JOIN Syntax ändern zu WHERE Klausel Syntax (WHERE tabA.idClient = tabB.idClient)
*
* Scriptcode z.T. auf Grundlage von CopyClient Script von A. Womatschka
* http://www.contenido.org/forum/viewtopic.php?t=5377&highlight=copy+client
*
* Datum: 2005-Sep-15
* Zuletzt geändert am: 2006-05-24
*/
/* Viele Tabellen werden vom Script verändert. Datenbank daher besser vorher sichern.
*/
/* Anleitung:
* Kopiere die .php-Datei mit diesem Script in das Contenido-Verzeichnis
* z.B. contenido/tools/deleteclient.php
* 1. Contenido db dump machen
* 2. Abmelden von Contenido (falls noch eingeloggt)
* 3. Script starten und optionen auswählen
* 4. nachschauen was wirklich passiert ist
*/
if (file_exists( '../includes/startup.php'))
{
include_once ('../includes/startup.php'); // 4.5.3
} else {
include_once ('../includes/config.php');
}
cInclude ("includes", 'functions.general.php');
$cfg["debug"]["backend_exectime"]["fullstart"] = getmicrotime();
cInclude ("includes", 'functions.i18n.php');
cInclude ("includes", 'functions.api.php');
cInclude ("includes", 'functions.general.php');
cInclude ("includes", 'functions.database.php');
cInclude ("classes", 'class.xml.php');
cInclude ("classes", 'class.navigation.php');
cInclude ("classes", 'class.template.php');
cInclude ("classes", 'class.backend.php');
cInclude ("classes", 'class.notification.php');
cInclude ("classes", 'class.area.php');
cInclude ("classes", 'class.action.php');
cInclude ("classes", 'class.layout.php');
cInclude ("classes", 'class.treeitem.php');
cInclude ("classes", 'class.user.php');
cInclude ("classes", 'class.group.php');
cInclude ("classes", 'class.cat.php');
cInclude ("classes", 'class.client.php');
cInclude ("classes", 'class.inuse.php');
cInclude ("classes", 'class.table.php');
cInclude ("includes", 'functions.str.php');
page_open(array('sess' => 'Contenido_Session',
'auth' => 'Contenido_Challenge_Crypt_Auth',
'perm' => 'Contenido_Perm'));
i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang);
cInclude ("includes", 'cfg_language_de.inc.php');
/* Instanzen der DB_Contenido */
$db = new DB_Contenido; // strMakeTreeTable funktioniert nur mit globalem $db ?
$cfg["debug"]["backend_exectime"]["start"] = getmicrotime();
?>
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="styles/contenido.css" />
<script type="text/javascript" src="scripts/general.js"></script>
<style type="text/css">
<!--
/* Cascading Style Sheet */
BODY,P,TD { font-family : verdana, arial, helvetica, sans-serif; }
BODY,P,TD { font-size : 11px; }
A:active,A:link,A:visited { text-decoration : none; }
A:hover { text-decoration : underline; }
P { text-align : justify; line-height: 140%; }
.red { color : #FF0000; }
.grey { color : #333333; }
.darkgrey { color : #525169; }
.blue { color : #0055dd; }
.white { color : #FFFFFF; }
-->
</style>
</head>
<body style="margin: 10px">
<h2 class="red"><b>CONTENIDO CLIENT BACKEND DELETION SCRIPT</b></h2>
<p class="red"><b>Dieses Script löscht einen Contenido Mandanten/Client aus der Mysql Datenbank.</b></p>
<ol>
<li>(notwendig) Sicherstellen dass mysql Version 4.0 oder höher ist. Script funktioniert nicht mit mysql Release 3.23!</li>
<li>(empfohlen) contenido mysql Datenbank sichern. PHP Code dieses Scripts ansehen.</li>
<li>(erledigt?) Melde dich als sysadmin an Contenido an (oder mit einem anderen Account welches Sysadmin Recht hat)</li>
<li>(optional) Merke dir zur Dokumentation den Namen und die ID des zu löschenden Mandanten. Dieses Script arbeitet mit der ID. Dieser Parameter idclient wird später nicht mehr verfügbar sein.</li>
<li>(optional) Eingeloggte User benachrichtigen, denn Kategoriebaum wird neu aufgebaut, alle Artikel in Bearbeitung entsperrt. </li>
<li>(optional) Abmelden von Contenido, falls mit anderem Browserfenster noch eingeloggt. </li>
<li>(optional) Im Formular "Simulationsmodus" + Mandanten auswählen und abschicken, SQL-Code ansehen und ggf. zur Dokumentation speichern</li>
<li> Mandanten auswählen und abschicken. Mandant wird gelöscht.</li>
</ol>
<h3>Anmerkungen:</h3>
<p>Dieses Script hat KEINE "Rückgängig machen" Funktionalität. Stattdessen alte Datenbanksicherung wieder einspielen.<br>
Das Script greift direkt auf die mysql Tabellen zu und löscht nur die von idClient abhängigen Datenbankeinträge.</p>
<p> Es werden gelöscht bzw neu aufgebaut:
</p>
<ul>
<li>Clientbezogene Backend-Nutzerrechte an Objekten</li>
<li>Cached Code</li>
<li>Statistikdaten</li>
<li>Communications Tabelle</li>
<li>Upload Tabelleneinträge</li>
<li>Plugin Registrations</li>
<li>DB Filesystem Einträge</li>
<li>User-defined Client-Properties</li>
<li>Links</li>
<li>Newsletter und Newsletter Recipients</li>
<li>Artikel (Inhalte und Metadaten, Metatags, Spezifikationen)</li>
<li>cat_tree (Kategoriebaum - betrifft ALLE Mandanten!)</li>
<li>Module Modulgeschichte, Modulsprachversionen</li>
<li>Templates</li>
<li>Layouts</li>
<li>Container </li>
<li>Kategorien </li>
<li>Newslettergroups und Newsletter-Groupmembers</li>
<li>Dem Client zugeordnete Frontendgroups und Frontend-Users sowie -Rechte</li>
<li>der Client selbst</li>
</ul>
<p>Es werden NICHT gelöscht</p>
<ul>
<li>Keywords (Löschvorgang kann recht lang dauern - PHP codezeile ist auskommentiert)</li>
<li>System Logs Tabellen (Action Log)</li>
<li>Unbenutzte (veraltete) Tabellen data, config_client, config, lang_bereich, lang_key, lang_value</li>
<li>Comments (wenn Modul comment installiert) und weitere selbst oder von Plugins angelegte Tabellen</li>
</ul>
<p>Das Directory auf dem Webserver für den gelöschten Client<br>
müsste per ftp-Tool oder von der Kommandozeile aus gelöscht werden,
um den Mandanten noch vollständiger zu entfernen.</p>
<p>Zu Tabellen siehe auch <a href="http://www.contenido.org/forum/viewtopic.php?t=4600&highlight=conkeywords">Kurzbeschreibung</a> und <a href="http://www.contenido.org/opensourcecms/de/upload/pdf/contenido.db.model.pdf">Datenbankschema.</a></p>
<?php
!isset($sim) ? $simulate = false : $simulate = true ; //default: simulate
$SessID = $sess->id;
$cinuse= $cfg["tab"]["inuse"];
$cnews= $cfg["tab"]["news"];
$cnews_rcp=$cfg["tab"]["news_rcp"];
$ccontent=$cfg["tab"]["content"];
$ccontainer=$cfg["tab"]["container"];
$clink=$cfg["tab"]["link"];
$clients_lang=$cfg["tab"]["clients_lang"];
$ccode = $cfg["tab"]["code"];
$cart_lang=$cfg["tab"]["art_lang"];
$cart=$cfg["tab"]["art"];
$cart_spec=$cfg["tab"]["art_spec"];
$ccat=$cfg["tab"]["cat"];
$ccatart=$cfg["tab"]["cat_art"];
$ccatlang=$cfg["tab"]["cat_lang"];
$cstat=$cfg["tab"]["stat"];
$cstatarchive=$cfg["tab"]["stat_archive"];
$cclients=$cfg["tab"]["clients"];
$cmetatag= $cfg["tab"]["meta_tag"];
$ccontainerconf=$cfg["tab"]["container_conf"];
$ctplconf=$cfg["tab"]["tpl_conf"];
$ctpl=$cfg["tab"]["tpl"];
$clay=$cfg["tab"]["lay"];
$cmod=$cfg["tab"]["mod"];
$crights=$cfg["tab"]["rights"];
$clang=$cfg["tab"]["lang"];
$ckeywords=$cfg["tab"]["keywords"];
$cuser_prop=$cfg["tab"]["user_prop"];
$cgroup_prop=$cfg["tab"]["group_prop"];
$cfrontendusers=$cfg["tab"]["frontendusers"];
$cfrontendpermissions=$cfg["tab"]["frontendpermissions"];
$cfrontendgroupmembers=$cfg["tab"]["frontendgroupmembers"];
$cfrontendgroups=$cfg["tab"]["frontendgroups"];
$cnews_groupmembers=$cfg["tab"]["news_groupmembers"];
$cnews_groups=$cfg["tab"]["news_groups"];
$cproperties=$cfg["tab"]["properties"];
$cdbfs=$cfg["tab"]["dbfs"];
$cupl=$cfg["tab"]["upl"];
$cmod_translations=$cfg["tab"]["mod_translations"];
$cmod_history=$cfg["tab"]["mod_history"];
$cplugins=$cfg["tab"]["plugins"];
$ccommunications=$cfg["tab"]["communications"];
$sql = "SELECT * FROM ".$cclients." ORDER BY idclient ASC";
$db->query($sql);
while ($db->next_record()) {
$ArrClients[$db->f("idclient")] = $db->f("name");
}
//$form wird 20 zeilen weiter unten benutzt
$form['table'] = '<table><tr><td width="220" align="right">%s</td><td>%s</td></tr><table>';
$form['header'] = '<select name="%s">'."\n";
$form['footer'] = '</select>';
$form['select'] = '<option value="%s"%s>%s (ID = %s)</option>'."\n";
$form['selected'] = ' selected="selected"';
if (is_array($ArrClients)) {
foreach ($ArrClients as $key => $value) {
if ($key == $old_idclient)
$form['source'] .= sprintf($form['select'], $key, $form['selected'], $value, $key);
else
$form['source'] .= sprintf($form['select'], $key, "", $value, $key);
}
}
$stop = false;
if (!isset($old_idclient) ) {
echo "Bitte wählen Sie...";
$stop = true;
}
if ($stop) {
echo '<form action="'.$PHP_SELF.'">'."\n";
echo '<input type="hidden" name="contenido" value="'.$SessID.'">'."\n";
$chksim = 'Nur Simulation <input name="sim" type="checkbox" value="on" checked>';
echo sprintf($form['table'], "CLIENT:" ,sprintf($form['header'],"old_idclient").$form['source'].$form['footer']);
echo sprintf($form['table'], $chksim , '<input type="submit" name="submit" value="Löschen!">');
echo '</form>'."\n";
page_close();
die();
}
$old_client_Name="";
/* Ermittle Kundennamen und prüfe die Gültigkeit der idclient-Nummern */
$sql = "SELECT name, idclient, frontendpath from ".$cclients." WHERE (idclient=".$old_idclient.")";
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db->next_record())
{
if ($db->f("idclient")==$old_idclient) {
$old_client_Name=trim($db->f("name"));
$frontendpath = trim($db->f("frontendpath"));
}
}
if ($old_client_Name=="")
{
/* Irgendwas stimmt nicht. vermutlich sind die verwendeten idclient-Nummern falsch */
$Meldung="Zu dem verwendeten Mandantennummern (idclient) ".$old_idclient. " gibt es keinen Mandanten-Namen. Überprüfen Sie die Mandanten-Nummer (idclient) in Ihrem Script. Die Ausführung wird abgebrochen.";
echo "<hr><h3 class='red'>Fehler: <BR>".$Meldung."</h3><hr>";
page_close();
die(); /* Scriptausführung abbrechen */
}
echo "<h3 class='grey'>Ermittlung der Spracheinstellung des Clients/Mandanten...</h3>";
$sql = "SELECT * from ".$clients_lang." WHERE (idclient=".$old_idclient.")";
$db->query($sql);
$merk_idlang_old=0;
while($db->next_record())
{
if ($db->f("idclient")==$old_idclient) $merk_idlang_old=$db->f("idlang");
/*Merke hier die SprachID des alten Mandanten */
/*Nicht benutzt*/
} /* End While */
/* echo "<h3 class='darkgrey'>Sprach-ID des Mandanten: idlang = ".$merk_idlang_old."</h3>"; */
/* Alles OK....leg los */
/* Nun die Baum-Struktur der Kategorien neu aufbauen ??? (steht in Tabelle con_cat_tree) */
/* Wirklich erforderlich für Löschvorgang? Fürs Kopieren, ja! - knb 20051010*/
if ($simulate){//aus globaler form variable
echo "<hr><h1 class='darkgrey'>Simulationsmodus: Lösche den Mandanten >".$old_client_Name."< (idclient ".$old_idclient."):</h1><hr>";
} else {
echo "<hr><h1 class='red'>Lösche den Mandanten >".$old_client_Name."< (idclient ".$old_idclient."):</h1><hr>";
}
echo "<h1 class='red'>START</h1>";
$sql = " DELETE FROM ". $cinuse;
executeSQL($sql, "Entsperre ALLE Objekte, Tabelle $cinuse", "Alle Objekte entsperrt");
$sql = " DELETE FROM ". $ccode. " where idclient = $old_idclient ;";
executeSQL($sql, "Lösche Code aus Cache..., Tabelle $ccode", "Cache geleert");
$sql = " DELETE FROM " . $cstat . " where idclient = $old_idclient ";
executeSQL($sql, "Lösche Statistiktabellen,Tabellen $cstat", "Statistiktabelle $cstat geleert");
$sql = " DELETE FROM " . $cstatarchive . " where idclient = $old_idclient; ";
executeSQL($sql, "Lösche Statistiktabellen,Tabelle $cstatarchive", "Statistiktabelle $cstatarchive geleert");
// Newsletter löschen, Newsletter recipients
$sql = <<<SQL
/* DELETE $cnews.*
FROM $cclients INNER JOIN $cnews ON $cclients.idclient = $cnews.idclient
WHERE ((($cclients.idclient)=$old_idclient));*/
DELETE $cnews.* FROM $cclients , $cnews WHERE $cclients.idclient = $cnews.idclient AND $cclients.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Newsletter für Mandanten..., Tabelle ".$cnews, "Newsletter gelöscht");
$sql = <<<SQL
/* DELETE $cnews_rcp.*
FROM $cclients INNER JOIN $cnews_rcp ON $cclients.idclient = $cnews_rcp.idclient
WHERE ((($cclients.idclient)=$old_idclient)) */
DELETE $cnews_rcp.* FROM $cclients , $cnews_rcp WHERE $cclients.idclient = $cnews_rcp.idclient AND $cclients.idclient=$old_idclient ;
SQL;
executeSQL($sql, "Lösche Newsletter Recipients für Mandanten..., Tabelle $cnews_rcp", "Newsletter Recipients gelöscht");
/*****************************************************************************************/
$sql = <<<SQL
DELETE $ccommunications.*
FROM $ccommunications
WHERE ((($ccommunications.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Communications Tabelle ".$cproperties, "Communications Tabelle gelöscht");
/* Tabellen die idClient als FK haben */
//Properties
$sql = <<<SQL
DELETE $cproperties.*
FROM $cproperties
WHERE ((($cproperties.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Properties..., Tabelle ".$cproperties, "Properties gelöscht");
//DB Filesystem Einträge
$sql = <<<SQL
DELETE $cdbfs.*
FROM $cdbfs
WHERE ((($cdbfs.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche DB Filesystem Einträge, Tabelle ".$cdbfs, "DB Filesystem Einträge gelöscht");
//Uploads
$sql = <<<SQL
DELETE $cupl.*
FROM $cupl
WHERE ((($cupl.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Uploads..., Tabelle ".$cupl, "Uploads gelöscht");
//Plugins
$sql = <<<SQL
DELETE $cplugins.*
FROM $cplugins
WHERE ((($cplugins.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Plugins..., Tabelle ".$cplugins, "Plugins gelöscht");
//Artikelspezifikationen
$sql = " DELETE FROM $cart_spec where client = $old_idclient ;";
executeSQL($sql, "Lösche Artikelspezifikationen..., Tabelle $cart_spec", "Artikelspezifikationen gelöscht");
//keywords
$sql = <<<SQL
/*
DELETE $ckeywords.*
FROM ($crights INNER JOIN $clang ON $crights.idlang = $clang.idlang) INNER JOIN $ckeywords ON $clang.idlang = $ckeywords.idlang
WHERE ((($crights.idclient)= $old_idclient));
*/
DELETE $ckeywords.*
FROM $crights , $clang , $ckeywords
WHERE $clang.idlang = $ckeywords.idlang AND $crights.idlang = $clang.idlang AND $crights.idclient= $old_idclient;
SQL;
// kann recht lange dauern
executeSQL($sql, "Lösche Keywords für Sprachversion der Artikel..., Tabelle ".$ckeywords, "Keywords gelöscht");
//sprachen
$sql = <<<SQL
/* DELETE $clang.*
FROM $crights INNER JOIN $clang ON $crights.idlang = $clang.idlang
WHERE ((($crights.idclient)= $old_idclient));*/
DELETE $clang.* FROM $crights , $clang WHERE $crights.idlang = $clang.idlang AND $crights.idclient= $old_idclient;
SQL;
executeSQL($sql, "Lösche Sprachen für Artikel..., Tabelle ".$clang, "Sprachen gelöscht");
//rechte in Backenduserverwaltung
$sql = <<<SQL
DELETE $crights.*
FROM $crights
WHERE ((($crights.idclient)= $old_idclient));
SQL;
executeSQL($sql, "Lösche Rechte für Objekte..., Tabelle ".$crights, "Backenduserrechte an Objekten gelöscht");
/*****************************************************************************************/
/*ARTIKEL Löschen*/
// Metatags löschen
$sql = <<<SQL
/*
DELETE $cmetatag.*
FROM ($cart_lang
INNER JOIN $cart ON $cart_lang.idart=$cart.idart)
INNER JOIN $cmetatag ON $cart_lang.idartlang=$cmetatag.idartlang
WHERE ((($cart.idclient)=$old_idclient));
*/
DELETE $cmetatag.*
FROM $cart_lang , $cart , $cmetatag
WHERE $cart_lang.idartlang=$cmetatag.idartlang AND $cart_lang.idart=$cart.idart AND $cart.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Metatags für Artikel..., Tabelle ".$cmetatag, "Metatags gelöscht");
// lösche Links zu Artikeln
$sql = <<<SQL
/* DELETE $clink.*
FROM $clink INNER JOIN $cart ON $clink.idart = $cart.idart
WHERE ((($cart.idclient)=$old_idclient));*/
DELETE $clink.* FROM $clink , $cart WHERE $clink.idart = $cart.idart AND $cart.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Links zu Artikeln..., Tabelle ".$clink, "Links gelöscht");
//Content Löschen
$sql = <<<SQL
/*
DELETE $ccontent.*
FROM ($ccontent
INNER JOIN $cart_lang ON $ccontent.idartlang = $cart_lang.idartlang)
INNER JOIN $cart ON $cart_lang.idart = $cart.idart
WHERE ((($cart.idclient)=$old_idclient)) */
DELETE $ccontent.* FROM $ccontent , $cart_lang , $cart
WHERE $cart_lang.idart = $cart.idart AND $ccontent.idartlang = $cart_lang.idartlang AND $cart.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Texte der Artikel, Tabelle ".$ccontent, "Content gelöscht");
/* ermittel alle Einträge des zu Löschenden Mandanten*/
//$sql = "DELETE from ".$cart_lang." where idlang = ".$merk_idlang_old."";
$sql = <<<SQL
/* DELETE $cart_lang.*
FROM $cart INNER JOIN $cart_lang ON $cart.idart = $cart_lang.idart
WHERE ((($cart.idclient)=$old_idclient));*/
DELETE $cart_lang.* FROM $cart , $cart_lang WHERE $cart.idart = $cart_lang.idart AND $cart.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Metadaten der Artikel, Tabelle ".$cart_lang, "Metadaten gelöscht");
/* ermittel alle Artikel des zu Löschenden Mandanten */
$sql = "DELETE from ".$cart." where idclient=".$old_idclient;
executeSQL($sql, "Lösche Artikel, Tabelle ".$cart, "Die Artikel wurden gelöscht.");
echo "<hr>";
/*****************************************************************************************/
/* KATEGORIEN Löschen */
// lösche verknüpfungen kategorie => artikel
$sql = <<<SQL
/*
DELETE $ccatart.*
FROM $cart INNER JOIN $ccatart ON $cart.idart = $ccatart.idart
WHERE ((($cart.idclient)=$old_idclient)); */
DELETE $ccatart.* FROM $cart , $ccatart WHERE $cart.idart = $ccatart.idart AND $cart.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Zuordnungen der Artikel zu den Kategorien, Tabelle ".$ccatart, "Kategorie-Zuordnungen gelöscht");
//User-defined Properties, gebunden an cat_lang
$sql = <<<SQL
/*
DELETE $cuser_prop.*
FROM ($ccat
INNER JOIN $ccatlang ON $ccat.idcat = $ccatlang.idcat)
INNER JOIN $cuser_prop ON $ccatlang.idcatlang = $cuser_prop.idcatlang
WHERE ((($ccat.idclient)=$old_idclient));
*/
DELETE $cuser_prop.* FROM $ccat , $ccatlang , $cuser_prop WHERE $ccatlang.idcatlang = $cuser_prop.idcatlang AND $ccat.idcat = $ccatlang.idcat AND $ccat.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche User-defined Properties, Tabelle ".$cuser_prop, "User-defined Properties gelöscht");
//Group-defined Properties, gebunden an cat_lang
$sql = <<<SQL
/*
DELETE $cgroup_prop.*
FROM ($ccat
INNER JOIN $ccatlang ON $ccat.idcat = $ccatlang.idcat)
INNER JOIN $cgroup_prop ON $ccatlang.idcatlang = $cgroup_prop.idcatlang
WHERE ((($ccat.idclient)=$old_idclient)); */
DELETE $cgroup_prop.*
FROM $ccat , $ccatlang , $cgroup_prop
WHERE $ccatlang.idcatlang = $cgroup_prop.idcatlang AND $ccat.idcat = $ccatlang.idcat AND $ccat.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Group-defined Properties, Tabelle ".$cgroup_prop, "Group-defined Properties gelöscht");
/* Nun müssen die Bezeichnungen der Kategorien gelöscht werden (steht in Tabelle con_cat_lang) */
$sql = <<<SQL
/* DELETE $ccatlang.*
FROM $ccat
INNER JOIN $ccatlang ON $ccat.idcat=$ccatlang.idcat
WHERE ((($ccat.idclient)=$old_idclient)); */
DELETE $ccatlang.* FROM $ccat , $ccatlang WHERE $ccat.idcat=$ccatlang.idcat AND $ccat.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Kategoriebezeichnungen , Tabelle ".$ccatlang, "Die Kategoriebezeichnungen wurden gelöscht.");
/* lese aus der Tabelle con_cat alle Kategorien des zu Löschenden Mandanten ($old_idclient) aus */
$sql = "DELETE from ".$ccat." where idclient=".$old_idclient;
executeSQL($sql, "Lösche die Kategorien/Menüs, Tabelle ".$ccat, "Die Kategorien wurden gelöscht.");
/* Nun die Baum-Struktur der Kategorien neu aufbauen ??? (steht in Tabelle con_cat_tree) */
/* Wirklich erforderlich für Löschvorgang? Fürs Kopieren, ja! - knb 20051010*/
echo "<hr><h2 class='red'>--Neuaufbau Tabelle *Cat_Tree (betrifft ALLE Mandanten)</h2><hr>"; /* Contenido Funktion in includes\functions.str.php */
if ($simulate){//aus globaler form variable
echo "<h3 class='blue'>--Simulationsmodus strRemakeTreeTable() </h3>";
echo "<h3 class='blue'>--Die Funktion strRemakeTreeTable() aus functions.str.php wurde NICHT ausgeführt</h3> (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)";
} else {
strRemakeTreeTable(); /* Contenido Funktion in includes\functions.str.php */
echo "<h3 class='red'>Die Funktion strRemakeTreeTable() aus functions.str.php wurde ausgeführt</h3> (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)";
}
echo "<h3>--Neuaufbau von *Cat_Tree abgeschlossen</h3>"; /* Contenido Funktion in includes\functions.str.php */
/*****************************************************************************************/
/*CONTAINER Löschen - sollte passieren bevor templates gelöscht werden*/
/*CONTAINER CONF Löschen - */
$sql = <<<SQL
/* DELETE $ccontainerconf.*
FROM ($ctpl
INNER JOIN $ctplconf ON $ctpl.idtplcfg = $ctplconf.idtplcfg)
INNER JOIN $ccontainerconf ON $ctplconf.idtplcfg = $ccontainerconf.idtplcfg
WHERE ((($ctpl.idclient)=$old_idclient));*/
DELETE $ccontainerconf.* FROM $ctpl , $ctplconf , $ccontainerconf
WHERE $ctplconf.idtplcfg = $ccontainerconf.idtplcfg
AND $ctpl.idtplcfg = $ctplconf.idtplcfg AND $ctpl.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche die Container Config für Templates, Tabelle ".$ccontainerconf, "Container Confs wurden gelöscht.");
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */
$sql = <<<SQL
/* DELETE $ccontainer.*
FROM $ccontainer
INNER JOIN $ctpl ON $ccontainer.idtpl = $ctpl.idtpl
WHERE ((($ctpl.idclient)=$old_idclient));
*/
DELETE $ccontainer.* FROM $ccontainer , $ctpl WHERE $ccontainer.idtpl = $ctpl.idtpl AND $ctpl.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche die Container, Tabelle ".$ccontainer, "Die Container wurden gelöscht.", "Die Bezeichnungen der Kategorien wurden gelöscht.");
/*****************************************************************************************/
/*TEMPLATES Löschen*/
$sql = <<<SQL
/* DELETE $ctplconf.*
FROM ($cclients
INNER JOIN $ctpl ON $cclients.idclient = $ctpl.idclient)
INNER JOIN $ctplconf ON $ctpl.idtplcfg = $ctplconf.idtplcfg
WHERE ((($cclients.idclient)=$old_idclient)); */
DELETE $ctplconf.* FROM $cclients , $ctpl , $ctplconf
WHERE $ctpl.idtplcfg = $ctplconf.idtplcfg AND $cclients.idclient = $ctpl.idclient AND $cclients.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Templates-Konfiguration, Tabelle ". $ctplconf, "Templates-Konfigurationen gelöscht");
/* Lösche nun die Daten der Tabelle con_Templates */
$sql = "DELETE from ".$ctpl." where idclient=".$old_idclient."";
executeSQL($sql, "Lösche Templates, Tabelle ". $ctpl, "Templates gelöscht");
/*****************************************************************************************/
/*LAYOUTS Löschen*/
$sql = "DELETE from ".$clay." where idclient=".$old_idclient;
executeSQL($sql, "Lösche Layouts, Tabelle ". $clay, "Layouts gelöscht");
/*****************************************************************************************/
/*Module Löschen*/
/* ermittel alle Module des zu Löschenden Kunden */
$sql = <<<SQL
/* DELETE $cmod_translations.*
FROM $cmod INNER JOIN $cmod_translations ON $cmod.idmod = $cmod_translations.idmod
WHERE ((($cmod.idclient)=$old_idclient));*/
DELETE $cmod_translations.*
FROM $cmod , $cmod_translations
WHERE $cmod.idmod = $cmod_translations.idmod AND $cmod.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Module Translations, Tabelle $cmod_translations" , "Module Translations gelöscht");
$sql = "DELETE $cmod_history.* FROM $cmod_history WHERE ((($cmod_history.idclient)=$old_idclient))";
executeSQL($sql, "Lösche Module History, Tabelle ". $cmod_history , "Module History gelöscht");
$sql = "DELETE from ".$cmod." where idclient=".$old_idclient;
executeSQL($sql, "Lösche Modules, Tabelle ". $cmod, "Modules gelöscht");
/* ############################################################## */
$sql = <<<SQL
/* DELETE $cnews_groupmembers.*
FROM $cnews_groupmembers INNER JOIN $cnews_groups ON $cnews_groupmembers.idnewsgroup = $cnews_groups.idnewsgroup
WHERE ((($cnews_groups.idclient)=$old_idclient));*/
DELETE $cnews_groupmembers.*
FROM $cnews_groupmembers , $cnews_groups
WHERE $cnews_groupmembers.idnewsgroup = $cnews_groups.idnewsgroup AND $cnews_groups.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Newsletter Group Members , Tabelle ". $cnews_groupmembers , "Newsletter Group Members gelöscht");
$sql = <<<SQL
DELETE $cnews_groups.*
FROM $cnews_groups
WHERE ((($cnews_groups.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Newsletter Groups, Tabelle ". $cnews_groups , "Newsletter Groups gelöscht");
//idclient aus frontend* tabellen rauslöschen
$sql = <<<SQL
/* DELETE $cfrontendpermissions.*
FROM $cfrontendgroups
INNER JOIN $cfrontendpermissions ON $cfrontendgroups.idfrontendgroup = $cfrontendpermissions.idfrontendgroup
WHERE ((($cfrontendgroups.idclient)=$old_idclient));*/
DELETE $cfrontendpermissions.*
FROM $cfrontendgroups , $cfrontendpermissions
WHERE $cfrontendgroups.idfrontendgroup = $cfrontendpermissions.idfrontendgroup AND $cfrontendgroups.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Frontend Permissions, Tabelle ". $cfrontendpermissions , "Frontend Permissions gelöscht");
$sql = <<<SQL
/* DELETE $cfrontendgroupmembers.*
FROM $cfrontendgroupmembers INNER JOIN $cfrontendusers ON $cfrontendgroupmembers.idfrontenduser = $cfrontendusers.idfrontenduser
WHERE ((($cfrontendusers.idclient)=$old_idclient));*/
DELETE $cfrontendgroupmembers.*
FROM $cfrontendgroupmembers , $cfrontendusers
WHERE $cfrontendgroupmembers.idfrontenduser = $cfrontendusers.idfrontenduser AND $cfrontendusers.idclient=$old_idclient;
SQL;
executeSQL($sql, "Lösche Frontend Group Members , Tabelle ". $cfrontendgroupmembers , "Frontend Group Members gelöscht");
$sql = <<<SQL
DELETE $cfrontendgroups.*
FROM $cfrontendgroups
WHERE ((($cfrontendgroups.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Frontend Groups, Tabelle ". $cfrontendgroups , "Frontend Groups history gelöscht");
$sql = <<<SQL
DELETE $cfrontendusers.*
FROM $cfrontendusers
WHERE ((($cfrontendusers.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Frontendusers, Tabelle ". $cfrontendusers , "Frontendusers gelöscht");
/*****************************************************************************************/
/* Client löschen Löschen*/
$sql = "DELETE from ".$cclients." where idclient=".$old_idclient;
executeSQL($sql, "Lösche CLIENT ". $cclients, "Client gelöscht");
//echo "<p class='darkgrey'>Es wurden alle Sprachen, Nutzerrechte an Objekten, Newsletter, Links, Newsletter-Recipients, Metatags, Artikel, Kategorien, Container, Templates, Layouts, und Module gelöscht.";
//echo "<br>Und natürlich der Client selbst.<br>";
echo "<h1 class='red'>FERTIG</h1>";
echo "<h3 class='grey'>Das Directory <br>$frontendpath<br>auf dem Webserver wurde nicht gelöscht. <br>
Es sollte möglicherweise per ftp-Tool oder von der Kommandozeile aus gelöscht werden.</h3>";
?>
</body>
</html>
<?php
// simple function to wrap redundant things up
function executeSQL($sql=false, $msg1, $msg2) {
global $db, $cfg, $simulate;
if ($sql) {
echo "<hr><h2 class='grey'>--$msg1</h2><hr>\n";
//echo SQl if simulate is checked
if ($simulate){//aus globaler form variable
echo "<h3 class='grey'>--Simulationsmodus<br>$sql</h3>\n";
} else {
$db->query($sql);
echo "<h3 class='blue'>Ausgeführt: $sql</h3>\n";
}
$err = mysql_error();
if($err == ''){
echo "<h3 class='blue'>--$msg2</h3>\n";
} else {
echo "<h3 class='red'>--FAILURE of SQL<br>$sql<br> DB said:<br>$err</h3>\n";
$err="";
}
//echo "<h1><font color='#0055dd'>--...Done.</font></h1>";
}
}
?>
Zuletzt geändert von knb am Mi 24. Mai 2006, 11:48, insgesamt 3-mal geändert.
Gruss,
Knut
Knut
-
- Beiträge: 15
- Registriert: Di 17. Jan 2006, 11:47
- Kontaktdaten:
Hallo Knut
ich probiere gerade dein Script deleteclient aus. Das soll ja lauffähig sein. Allerdings verwende ich hier die Version 4.6.4.
Bei der Ausführung erhalte ich jedoch einen Parse Error in Line 333. Dort steht eine Anweisung
// ab hier werden Parse - Errrors erzeugt!
$sql = <<<SQL
DELETE $cnews.*
FROM $cclients INNER JOIN $cnews ON $cclients.idclient = $cnews.idclient
WHERE ((($cclients.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Newsletter für Mandanten..., Tabelle ".$cnews, "Newsletter gelöscht");
ich bin kein Experte in php, aber diese Anweisung verstehte ich nun gar nicht, zumal bis dahin eine völlig andere Syntax verwendet wurde.
Liegt dies jetzt an den unterschiedlichen Versionen oder ist die heir wirklich noch ein unvollendeter Code, der noch überarbeitet werden muss?
Ich versuche nämlich gerade einen neuen Mandanten anzulegen, der auf den gleichen Standards basiert wie unser Mandat 1, aber immer wieder bekomme ich schon Probleme, wenn ich zu dem neu angelegten Mandaten eine Sprache definieren will. Die Sprache "deutsch" ist jedoch schon definiert. Wie kann ich nun die gleiche Sprache auch für den Mandanten 2 benutzen? In der Administration kann ich für einen neuen Mandanten immer nur neue Sprache definieren, aber das macht dow wohl wirklich keine Sinn , oder ?
Gruss
Horst Wetzel
ich probiere gerade dein Script deleteclient aus. Das soll ja lauffähig sein. Allerdings verwende ich hier die Version 4.6.4.
Bei der Ausführung erhalte ich jedoch einen Parse Error in Line 333. Dort steht eine Anweisung
// ab hier werden Parse - Errrors erzeugt!
$sql = <<<SQL
DELETE $cnews.*
FROM $cclients INNER JOIN $cnews ON $cclients.idclient = $cnews.idclient
WHERE ((($cclients.idclient)=$old_idclient));
SQL;
executeSQL($sql, "Lösche Newsletter für Mandanten..., Tabelle ".$cnews, "Newsletter gelöscht");
ich bin kein Experte in php, aber diese Anweisung verstehte ich nun gar nicht, zumal bis dahin eine völlig andere Syntax verwendet wurde.
Liegt dies jetzt an den unterschiedlichen Versionen oder ist die heir wirklich noch ein unvollendeter Code, der noch überarbeitet werden muss?
Ich versuche nämlich gerade einen neuen Mandanten anzulegen, der auf den gleichen Standards basiert wie unser Mandat 1, aber immer wieder bekomme ich schon Probleme, wenn ich zu dem neu angelegten Mandaten eine Sprache definieren will. Die Sprache "deutsch" ist jedoch schon definiert. Wie kann ich nun die gleiche Sprache auch für den Mandanten 2 benutzen? In der Administration kann ich für einen neuen Mandanten immer nur neue Sprache definieren, aber das macht dow wohl wirklich keine Sinn , oder ?
Gruss
Horst Wetzel
Hallo Horst,
Es hat wohl nichts mit der Contenido Version zu tun.
Wahrscheinlich benutzt Du mysql 3.23. Dieses Release kommt mit der verwendete INNER JOIN Syntax nicht klar (die Tabelle news ist die erste Tabelle vom Script die per Join von verknüpften Datesätzen befreit wird, die Statements zuvor greifen nur auf einzelen Tabellen zu, sieh selbst). Ist zwar SQL Standard, aber mysql 3.23 unterstützte es nicht.
Siehe auch Kommentar im Scriptheader.
Man müsste die SQL statements umschreiben aber das ist mir zu aufwendig da mysql 3.23 nicht mehr so viel verwendet wird. Abwärtskompatibilität hat Grenzen.
Die Syntax ist anders da auf die mysql Tabellen direkt zugegriffen wird. Das Script weist auch darauf hin.
Daher muss man auch contenido sysadmin sein um es zu benutzen.
Dein Problem mit der Sprache versteh ich gerade nicht, das kann vielleicht jemand anders beantworten.
Es hat wohl nichts mit der Contenido Version zu tun.
Wahrscheinlich benutzt Du mysql 3.23. Dieses Release kommt mit der verwendete INNER JOIN Syntax nicht klar (die Tabelle news ist die erste Tabelle vom Script die per Join von verknüpften Datesätzen befreit wird, die Statements zuvor greifen nur auf einzelen Tabellen zu, sieh selbst). Ist zwar SQL Standard, aber mysql 3.23 unterstützte es nicht.
Siehe auch Kommentar im Scriptheader.
Man müsste die SQL statements umschreiben aber das ist mir zu aufwendig da mysql 3.23 nicht mehr so viel verwendet wird. Abwärtskompatibilität hat Grenzen.
Die Syntax ist anders da auf die mysql Tabellen direkt zugegriffen wird. Das Script weist auch darauf hin.
Daher muss man auch contenido sysadmin sein um es zu benutzen.
Dein Problem mit der Sprache versteh ich gerade nicht, das kann vielleicht jemand anders beantworten.
Gruss,
Knut
Knut
-
- Beiträge: 15
- Registriert: Di 17. Jan 2006, 11:47
- Kontaktdaten:
Hallo Knut
Wenn ich dich richtig verstanden habe sollte dieser Code also so unter der von mir eingesetzten Version 4.0.12 von mySQL funktionieren ?
Aber was ist das für eine PHP - Syntax "$sql = <<<SQL ..." ?
Kannst du mir vielleicht eine Stelle nennen, woch das mal nachlesen kann? Ich möchte ja nur gerne wieder etwas dazulernen und herausfinden, warum ich hier eine Fehlermeldung bekomme.
Gruss
Horst
Wenn ich dich richtig verstanden habe sollte dieser Code also so unter der von mir eingesetzten Version 4.0.12 von mySQL funktionieren ?
Aber was ist das für eine PHP - Syntax "$sql = <<<SQL ..." ?
Kannst du mir vielleicht eine Stelle nennen, woch das mal nachlesen kann? Ich möchte ja nur gerne wieder etwas dazulernen und herausfinden, warum ich hier eine Fehlermeldung bekomme.
Gruss
Horst
Dieses <<<SQL Konstrukt nennt sich "Here Document" und sollte unter diesem Stichpunkt in jedem Buch über Shell-Programmierung beschrieben sein.
Oder Google: "Here Document" PHP
Es ermöglicht das komfortable Eingeben langer Multiline-Strings im Programmcode.
Auch PHP bietet seit PHP 4, glaub ich, diese Here-Document Syntax an, nur eben mit den 3 < Zeichen und nicht wie sonst in Perl oder Shellscript üblich mit zweien.
Hm du sagst, auch Mysql 4.0.12 verschluckt sich an der INNER JOIN Syntax? Komisch, also ich habe 4.1 und da gehts auf jeden Fall.
Hatte noch kein Feedback erhalten zum Script.
Vielleicht sollte ich die Statements doch umschreiben sodass die Join-Bedingung in der Where - Klausel steht.
Es sind nur so viele Statements! Mal sehen ob ich ein Tool dafür finde.
Kann also ne Weile dauern, da ich noch anderes zu tun habe.
Oder Google: "Here Document" PHP
Es ermöglicht das komfortable Eingeben langer Multiline-Strings im Programmcode.
Auch PHP bietet seit PHP 4, glaub ich, diese Here-Document Syntax an, nur eben mit den 3 < Zeichen und nicht wie sonst in Perl oder Shellscript üblich mit zweien.
Hm du sagst, auch Mysql 4.0.12 verschluckt sich an der INNER JOIN Syntax? Komisch, also ich habe 4.1 und da gehts auf jeden Fall.
Hatte noch kein Feedback erhalten zum Script.
Vielleicht sollte ich die Statements doch umschreiben sodass die Join-Bedingung in der Where - Klausel steht.
Es sind nur so viele Statements! Mal sehen ob ich ein Tool dafür finde.
Kann also ne Weile dauern, da ich noch anderes zu tun habe.
Gruss,
Knut
Knut
Habe es jetzt doch umgeschrieben und die INNER JOIN Syntax in delete statements ersetzt durch komplexe WHERE Klauseln... es geht trotzdem nicht für mysql 3.23.
Habe noch mal recherchiert, hier vorläufig zur Doku:
Es sind anscheinend mehrere Dinge der von mir verwendeten SQL Syntax die nur bedingt abwärtskompatibel sind:
(ansi-sql) INNER JOIN im SELECT statement: ab mysql 3.23.26
INNER JOIN im DELETE statement, genauer in FROM klausel eines DELETE statements: ab mysql 4.1 (?)
multiple-table delete (DELETE tab1.* FROM tab1,tab2 WHERE tab1.pk = tab2.pk): ab mysql 4.0.0.
Habe noch mal recherchiert, hier vorläufig zur Doku:
Es sind anscheinend mehrere Dinge der von mir verwendeten SQL Syntax die nur bedingt abwärtskompatibel sind:
(ansi-sql) INNER JOIN im SELECT statement: ab mysql 3.23.26
INNER JOIN im DELETE statement, genauer in FROM klausel eines DELETE statements: ab mysql 4.1 (?)
multiple-table delete (DELETE tab1.* FROM tab1,tab2 WHERE tab1.pk = tab2.pk): ab mysql 4.0.0.
Zuletzt geändert von knb am Mi 24. Mai 2006, 09:28, insgesamt 1-mal geändert.
Gruss,
Knut
Knut
-
- Beiträge: 5478
- Registriert: Di 2. Mär 2004, 21:11
- Wohnort: Halchter, wo sonst? ;-)
- Kontaktdaten:
Ich weiss nicht, ob ICH es richtig verstanden habe, aber wenn die Frage lautet, ob man fuer jeden Mandanten die Sprache "Deutsch" angelegt werden muss, falls mehrere Mandanten deutschsprachige Inhalte haben, dann lautet die Antwort "ja", weil die Sprache Deutsch von Mandant 1 fuer Mandant 2 unsichtbar ist.knb hat geschrieben:Dein Problem mit der Sprache versteh ich gerade nicht, das kann vielleicht jemand anders beantworten.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
Um es anders zu formulieren: So verrückt es klingt, man muss pro Mandant deutsch wieder aufs Neue definieren (und erhält entsprechend höhere IDs). Im ersten Augenblick macht es keinen Sinn (da eine Sprache als global aufgefasst werden kann), im zweiten Blick wird die Ursache ersichtlich: Mandanten sind komplett voneinander getrennt. Daher ist die Sprache getrennt zu definieren.
Gruß
HerrB
Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net