Alle Artikel einer Kategorie löschen

Gesperrt
Micha33
Beiträge: 37
Registriert: Fr 16. Jan 2004, 00:34
Wohnort: Berlin
Kontaktdaten:

Alle Artikel einer Kategorie löschen

Beitrag von Micha33 » Di 12. Apr 2005, 11:28

Hallo Forum,

ich betreue eine Seite mit einer sehr hohen Artikelrotation, d.h. viele Artikel werden nach einem bestimmten Zeitraum über die Zeitsteuerung in eine Offline-Kategorie bzw. Baum "Trash" verschoben und offline gesetzt.

Ich suche jetzt nach einer Möglichkeit diese Kategorie komplett zu leeren, ohne jeden einzelnen Artikel über den "Löschen"-Button zu entfernen.

Am besten wäre da wohl ein direktes Datebank-Query geeignet in der Art:

Code: Alles auswählen

DELETE * FROM XXX WHERE idcat = <idcat_von Trash> 
Natürlich müssten ja aus mehreren Tabellen die Artikel gelöscht werden, nur weiss ich nicht aus welchen genau. Client und Language wären egal.

Könnte einer von den Profis unter Euch mir mal diese Abfrage formulieren.

Vielen Dank
Micha

emergence
Beiträge: 10644
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Di 12. Apr 2005, 13:04

na ja die sauberste methode wäre das mittels einer contenido funktion erledigen zu lassen...

functions.con.php

-> conDeleteart

das einzige was du dann noch benötigen würdest eine auflistung aller artikel in dieser kategorie

würde in etwa so aussehen:

Code: Alles auswählen

	$whichidcat = 10; // die kategorie in der alle enthaltenen artikel gelöscht werden sollen.

	$sql = "SELECT
				a.idart AS idart
			FROM
				".$cfg["tab"]["art_lang"]." AS a,
				".$cfg["tab"]["art"]." AS b,
				".$cfg["tab"]["cat_art"]." AS c
			WHERE
				a.idlang	= '".$lang."' AND
				a.idart 	= b.idart AND
				b.idclient	= '".$client."' AND
				b.idart 	= c.idart AND
				c.idcat 	= '".$whichidcat."'";

	$db->query($sql);

	while ( $db->next_record() ) {
		conDeleteart($db->f("idart"));
    }
für etwaige schäden die dieser code verursacht, übernehme ich keinerlei verantwortung...
*** make your own tools (wishlist :: thx)

Micha33
Beiträge: 37
Registriert: Fr 16. Jan 2004, 00:34
Wohnort: Berlin
Kontaktdaten:

Beitrag von Micha33 » Di 12. Apr 2005, 14:13

Hi emergence,

Danke für die schnelle Antwort.

Wie hast Du Dir denn die Umsetzung gedacht?

Soll der obige Code an das Ende der functions.con.php angehangen werden? Werden dann bei jedem inkludieren der Datei automatisch die Artikel aus der Kategorie gelöscht? Also quasi bei jedem Starten vom Backend?

Wäre ja nicht schlecht aber was gäbe es denn noch für Möglichkeiten.

Micha

emergence
Beiträge: 10644
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Di 12. Apr 2005, 14:24

Micha33 hat geschrieben:Wie hast Du Dir denn die Umsetzung gedacht?
daran hab ich noch gar nicht gedacht...
Soll der obige Code an das Ende der functions.con.php angehangen werden? Werden dann bei jedem inkludieren der Datei automatisch die Artikel aus der Kategorie gelöscht? Also quasi bei jedem Starten vom Backend?
ähm nein, die position würd ich nicht nehmen...
Wäre ja nicht schlecht aber was gäbe es denn noch für Möglichkeiten.
einen entsprechenden cronjob bauen...

einen artikel in einem anderen verzeichniss mit dem modul snippets
dort kannst du den code reinstellen... sobald du den artikel aufrufen würdest, würden die artikel in der angegebenen kategorie gelöscht.*

möglichkeiten gibt es viele...
man könnte sogar soweit gehen die artikeleigenschaften aufzuboren und bei der zeitsteuerung die option nach ablauf löschen einbauen...

* ist die schnellste möglichkeit
*** make your own tools (wishlist :: thx)

Micha33
Beiträge: 37
Registriert: Fr 16. Jan 2004, 00:34
Wohnort: Berlin
Kontaktdaten:

function conDeleteart

Beitrag von Micha33 » Mi 20. Apr 2005, 13:13

Hi emergence,

ich hab das Modul Snippets eingebaut und es sollte eingentlich alles soweit funktionieren.

in einem anderen Thread:

http://contenido.org/forum/viewtopic.ph ... sc&start=0

habe ich über eine fehlerhafte Funktion con Deleteart gelesen und die Funktion mit der dort geposteten Version ersetzt. Daraufhin erhielt ich bei der Testlöschung eines Artikels über Contenido folgende Fehlermeldung:

Code: Alles auswählen

Fatal error: Call to undefined function: isstartarticle() in c:\contenido\htdocs\444\contenido\includes\functions.con.php on line 690
Frage: Ist das Ersetzen der gefixten Funktion bei Contenido 4.4.4. überhaupt noch nötig?

Vielen Dank
Micha

emergence
Beiträge: 10644
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: function conDeleteart

Beitrag von emergence » Mi 20. Apr 2005, 17:26

Micha33 hat geschrieben:Ist das Ersetzen der gefixten Funktion bei Contenido 4.4.4. überhaupt noch nötig?
noch nötig, ähm nein
da gehts nur um daten müll in der db in zwei tabellen...
der bugfix bezieht sich nur auf die entwickler version (cvs_head)
*** make your own tools (wishlist :: thx)

Micha33
Beiträge: 37
Registriert: Fr 16. Jan 2004, 00:34
Wohnort: Berlin
Kontaktdaten:

Re: function conDeleteart

Beitrag von Micha33 » Do 21. Apr 2005, 10:48

Hi emergence,

Danke. Ich hab die Funktion jetzt wieder im Originalzustand.

Ich habe jetzt die Funktion ausprobiert, jedoch scheint conDeleteart Probleme mit der Schleife zu haben.

Code: Alles auswählen

   $db->query($sql); 

   while ( $db->next_record() ) { 
      //conDeleteart($db->f("idart")); 
      echo $db->f("idart");
      $a++;
      echo "<br>";
    }
echo "$a Artikel gelöscht...";
Ich habe diese um ein Paar echos erweitert, um mir den Status anzeigen zu lassen. Solange der Funktionsaufruf auskommentiert ist, läuft die Schleife komplett durch und gibt mir die Artikelnummern der Artikel in der Kategorie 43 aus und am Ende die Gesamtanzahl.

Aktiviere ich jedoch die Funktion, läuft die Schleife nur einmal durch, der erste Artikel wird gelöscht und als Ausgabe erhalte ich

Code: Alles auswählen

1 Artikel gelöscht...
jedoch ohne die idart des Artikels.

irgend eine Idee?

Micha

emergence
Beiträge: 10644
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 21. Apr 2005, 10:54

ach ja
conDeleteart verwendet $db die aus dem global scope angefordert wird...
hab mir die funktion nicht weiters angesehen...

verwendet für deine schleife eine andere $db variable -> zb $db2

vorher solltest du sicher stellen das die variable natürlich zur verfügung steht....

ein $db2 = new Db_Contenido(); sollte das erledigen...

Code: Alles auswählen

   $db2->query($sql); 

   while ( $db2->next_record() ) { 
      //conDeleteart($db2->f("idart")); 
      echo $db2->f("idart"); 
      $a++; 
      echo "<br>"; 
    }
*** make your own tools (wishlist :: thx)

Micha33
Beiträge: 37
Registriert: Fr 16. Jan 2004, 00:34
Wohnort: Berlin
Kontaktdaten:

Beitrag von Micha33 » Do 21. Apr 2005, 12:08

Hi emergence

Super, jetzt hat es geklappt. 473 Atikel auf einen Schlag gelöscht.

Allerdings hat er auf meinem WAMP dafür knapp 10min bei voller Systemauslastung duch den mysql-Server gebraucht.

Auf dem Linux Web-Server könnte das durchaus zu einem Absturz von Mysql oder zu einem vorzeitigen Abbruch des Scriptes führen und dadurch zu inkonsistenten Datensätzen, oder?

Was meinst Du? Wie könnte man das verhindern?

Micha

emergence
Beiträge: 10644
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 21. Apr 2005, 17:40

Micha33 hat geschrieben:Auf dem Linux Web-Server könnte das durchaus zu einem Absturz von Mysql oder zu einem vorzeitigen Abbruch des Scriptes führen und dadurch zu inkonsistenten Datensätzen, oder?
logisch...
Micha33 hat geschrieben:Was meinst Du? Wie könnte man das verhindern?
na ich würd vorher ein backup der db machen, bevor ich das script aufrufe...
sonst hab ich auf die schnelle keine wirkliche idee...
*** make your own tools (wishlist :: thx)

Micha33
Beiträge: 37
Registriert: Fr 16. Jan 2004, 00:34
Wohnort: Berlin
Kontaktdaten:

Beitrag von Micha33 » Mo 9. Mai 2005, 14:48

Hi emergence,

ich habe mir überlegt ein Limit für die zu löschenden Artikel zu setzen. Man muss zwar den Artikel dann solange aufrufen bis alle Artikel gelöscht worden sind, belastet aber den Server nicht allzu stark.

Hier meine Code nochmals:

Code: Alles auswählen

<?php   
$whichidcat = 43; // die kategorie in der alle enthaltenen artikel gelöscht werden sollen. 

   $sql = "SELECT 
            a.idart AS idart 
         FROM 
            ".$cfg["tab"]["art_lang"]." AS a, 
            ".$cfg["tab"]["art"]." AS b, 
            ".$cfg["tab"]["cat_art"]." AS c 
         WHERE 
            a.idlang   = '".$lang."' AND 
            a.idart    = b.idart AND 
            b.idclient   = '".$client."' AND 
            b.idart    = c.idart AND 
            c.idcat    = '".$whichidcat."'
            LIMIT 10"; 

   $db2 = new Db_Contenido(); 

   $db2->query($sql); 

   while ( $db2->next_record() ) { 
      //conDeleteart($db2->f("idart")); 
      echo $db2->f("idart");
      $a++;
      echo "<br>";
    }
echo "$a Artikel gelöscht...";
?>
Das Merkwürdige ist aber die folgende Ausgabe der Testabfrage ohne reale Löschung:

Code: Alles auswählen

457
459
442
443
444
100
101
104
106
215
14 Artikel gelöscht... 
Das Skript zählt zwar nur 10 Artikel auf meldet aber das 14 Artikel gelöscht wurden. Hängt das mit Artikeln zusammen, welche in mehreren Kategorien eingestellt waren?
Bei der Begrenzung auf 100 Artikel waren sogar einige doppelte Artikelnummern dabei.
Was passiert mit Artikeln, die aus einer Kategorie in den Trash verschoben worden sind in einer anderen Kategorie aber noch immer Online stehen?

Vielen Dank
Micha

emergence
Beiträge: 10644
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 9. Mai 2005, 15:26

Das Skript zählt zwar nur 10 Artikel auf meldet aber das 14 Artikel gelöscht wurden. Hängt das mit Artikeln zusammen, welche in mehreren Kategorien eingestellt waren?
ähm glaub ich nicht $a wird vermutlich schon belegt sein...

versuchs mal damit...

Code: Alles auswählen

   $counter = 0;

   while ( $db2->next_record() ) { 
      //conDeleteart($db2->f("idart")); 
      echo $db2->f("idart"); 
      $counter++; 
      echo "<br>"; 
    } 

    echo "$counter Artikel gelöscht..."; 
Bei der Begrenzung auf 100 Artikel waren sogar einige doppelte Artikelnummern dabei.
das wird mit bei mehrfach zugewiesenen artikel passieren...
Was passiert mit Artikeln, die aus einer Kategorie in den Trash verschoben worden sind in einer anderen Kategorie aber noch immer Online stehen?
keine ahnung... ich schätze mal der artikel wird in beiden kategorien verschwinden...
*** make your own tools (wishlist :: thx)

Gesperrt