Managed Server
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Artikel ohne Bestand über Datenbank löschen

    JuergenS

    • Fördermitglied
    • Beiträge: 60
    • Geschlecht:
    Artikel ohne Bestand über Datenbank löschen
    am: 14. Februar 2021, 22:19:39
    Hallo, in die Runde.

    Ich habe mal eine Frage: Kann man aus der Datenbank alle Artikel mit Bestand "0" löschen?
    Wenn die wieder Bestand haben, werden diese anschließend halt wieder neu importiert.

    Müsste doch machbar sein, oder?  Habe leider nichts im Forum darüber gefunden.

    Für Eure Hilfe schon jetzt besten Dank.
    Gruß
    Jürgen

    Linkback: https://www.modified-shop.org/forum/index.php?topic=41670.0

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #1 am: 14. Februar 2021, 22:49:51
    Kann dir beim Problem nicht helfen. Aber wäre es nicht sinnvoller diese nur zu deaktivieren? Denn wenn du sie später wieder anbietest und wieder aktivierst, wäre die url gleich. Vermute das wäre für Google besser.

    Gruß Timm

    JuergenS

    • Fördermitglied
    • Beiträge: 60
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #2 am: 14. Februar 2021, 23:13:40
    Hallo Timm,

    danke für Deine Info. Daran hatte ich auch schon gedacht. Allerdings werden es dann immer mehr Artikel. Weil halt auch einige keine neuen Bestände mehr erhalten, wollte ich zumindest mal die ganz alten Artikel löschen.

    So muss ich alle Kategorien durchschauen. Ich habe da jetzt wieder fast 2 Stunden dran gehockt. Bei ca. 5000 Artikel. Das macht nicht so wirklich Freude.

    Gruß
    Jürgen

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #3 am: 15. Februar 2021, 12:51:12
    Hallo Jürgen,

    mit folgender Datenbankabfrage mit z.B. phpMyAdmin kannst du ermitteln wie viele Artikel keinen Bestand haben, und ausserdem kannst du dann im Admin durch Eingabe der "products_id" diese Artikel direkt auswählen um sie zu löschen. Dies wäre, so denke ich, doch zumindest schon eine kleine Hilfe.

    Code: SQL  [Auswählen]
    SELECT products_id FROM products WHERE products_quantity < 1;

    PS:
    Wollte man ein PHP-Skript schreiben, welches in einem "Rutsch" alle Artikel ohne Bestand löscht, müsste man so ca. in 16 Datenbanktabellen Löschungen vornehmen, siehe nachfolgende Funktion.

    Code: PHP  [Auswählen]
      // removes a product + images + more images + content
      function remove_product($product_id) {
        // get content of product
        $product_content_query = xtc_db_query("SELECT content_file
                                                 FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                WHERE products_id = '"
    .(int)$product_id."'");
        // check if used elsewhere, delete db-entry + file if not
        while ($product_content = xtc_db_fetch_array($product_content_query)) {
           $duplicate_content_query = xtc_db_query("SELECT count(*) AS total
                                                      FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                     WHERE content_file = '"
    .xtc_db_input($product_content['content_file'])."'
                                                       AND products_id != '"
    .(int)$product_id."'");
           $duplicate_content = xtc_db_fetch_array($duplicate_content_query);
           if ($duplicate_content['total'] == 0) {
             if (is_file(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file'])) {
               @unlink(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file']);
             }
           }
           //delete DB-Entry
           xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_CONTENT." WHERE products_id = '".(int)$product_id."' AND (content_file = '".xtc_db_input($product_content['content_file'])."' OR content_file = '')");
        }

        $product_image_query = xtc_db_query("SELECT products_image
                                               FROM "
    .TABLE_PRODUCTS."
                                              WHERE products_id = '"
    .(int)$product_id."'");
        $product_image = xtc_db_fetch_array($product_image_query);

        $duplicate_image_query = xtc_db_query("SELECT count(*) AS total
                                                 FROM "
    .TABLE_PRODUCTS."
                                                WHERE products_image = '"
    .xtc_db_input($product_image['products_image'])."'");
        $duplicate_image = xtc_db_fetch_array($duplicate_image_query);

        if ($duplicate_image['total'] < 2) {
          xtc_del_image_file($product_image['products_image']);
        }

        //delete more images
        $mo_images_query = xtc_db_query("SELECT image_name
                                           FROM "
    .TABLE_PRODUCTS_IMAGES."
                                          WHERE products_id = '"
    .(int)$product_id."'");
        while ($mo_images_values = xtc_db_fetch_array($mo_images_query)) {
          $duplicate_more_image_query = xtc_db_query("SELECT count(*) AS total
                                                        FROM "
    .TABLE_PRODUCTS_IMAGES."
                                                       WHERE image_name = '"
    .xtc_db_input($mo_images_values['image_name'])."'");
          $duplicate_more_image = xtc_db_fetch_array($duplicate_more_image_query);
          if ($duplicate_more_image['total'] < 2) {
            xtc_del_image_file($mo_images_values['image_name']);
          }
        }

        //new module support
        $this->catModules->remove_product($product_id);

        xtc_db_query("DELETE FROM ".TABLE_SPECIALS." WHERE products_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS." WHERE products_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE products_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE xsell_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_IMAGES." WHERE products_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TO_CATEGORIES." WHERE products_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_DESCRIPTION." WHERE products_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_ATTRIBUTES." WHERE products_id = '".(int)$product_id."'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET." WHERE products_id = '" . (int)$product_id . "' OR products_id LIKE '" . (int)$product_id . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET_ATTRIBUTES." WHERE products_id = '" . (int)$product_id . "' OR products_id LIKE '" . (int)$product_id . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TAGS." WHERE products_id = '".(int)$product_id."'");

        if (defined('MODULE_WISHLIST_SYSTEM_STATUS') && MODULE_WISHLIST_SYSTEM_STATUS == 'true') {
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST." WHERE products_id = '" . (int)$product_id . "' OR products_id LIKE '" . (int)$product_id . "{%'");
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST_ATTRIBUTES." WHERE products_id = '" . (int)$product_id . "' OR products_id LIKE '" . (int)$product_id . "{%'");
        }

        $customers_statuses_array = xtc_get_customers_statuses();
        for ($i = 0, $n = sizeof($customers_statuses_array); $i < $n; $i ++) {
          if (isset($customers_statuses_array[$i]['id']))
            xtc_db_query("DELETE FROM ".TABLE_PERSONAL_OFFERS_BY.$customers_statuses_array[$i]['id']." WHERE products_id = '".(int)$product_id."'");
        }

        $product_reviews_query = xtc_db_query("SELECT reviews_id
                                                 FROM "
    .TABLE_REVIEWS."
                                                WHERE products_id = '"
    .(int)$product_id."'");
        while ($product_reviews = xtc_db_fetch_array($product_reviews_query)) {
          xtc_db_query("DELETE FROM ".TABLE_REVIEWS_DESCRIPTION." WHERE reviews_id = '".$product_reviews['reviews_id']."'");
        }
        xtc_db_query("DELETE FROM ".TABLE_REVIEWS." WHERE products_id = '".(int)$product_id."'");
      }

    Gruss
    Hanspeter

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #4 am: 15. Februar 2021, 16:14:09
    Weil ich das Thema gerade vor mir liegen habe...., aber nicht die DB vom Shop.
    Gibt es keine fk Verknüpfungen in der DB? Stichwort
    ON DELETE CASCADE

    JuergenS

    • Fördermitglied
    • Beiträge: 60
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #5 am: 15. Februar 2021, 18:56:59
    Hallo hpzeller.

    besten Dank für Deine Hilfe.

    Die Datenbankabfrage hat ca. 830 Artikel ergeben. Die einzeln zu löschen ist schon .....   :doh:
    Aber zumindest besser als alle Kategorien durchzugehen.

    Ich werde mir mal Deine PHP anschauen danke schön.

    Gruß
    Jürgen

    awids

    • Experte
    • Beiträge: 3.785
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #6 am: 15. Februar 2021, 22:32:44
    Auf die von Hanspeter zitierte Funktion aus der categories-Klasse wollte ich gestern auch schon verweisen. Da steckt alles drin, was man braucht. Kopieren, in eine eigene Datei einfügen und ein paar leichte Anpassungen später hat man ein Script, welches man nicht nur im Browser aufrufen kann, sondern auch mit einem regelmäßigen Cronjob besuchen könnte:

    Code: PHP  [Auswählen]
    <?php

    include ('includes/application_top.php');

    $items_query = xtc_db_query("SELECT products_id FROM ".TABLE_PRODUCTS." WHERE products_quantity < 1");

    while ($items = xtc_db_fetch_array($items_query)) {

        $product_content_query = xtc_db_query("SELECT content_file
                                                 FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                WHERE products_id = '"
    .(int)$items['products_id']."'");

        while ($product_content = xtc_db_fetch_array($product_content_query)) {
           $duplicate_content_query = xtc_db_query("SELECT count(*) AS total
                                                      FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                     WHERE content_file = '"
    .xtc_db_input($product_content['content_file'])."'
                                                       AND products_id != '"
    .(int)$items['products_id']."'");
           $duplicate_content = xtc_db_fetch_array($duplicate_content_query);
           if ($duplicate_content['total'] == 0) {
             if (is_file(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file'])) {
               @unlink(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file']);
             }
           }

           xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_CONTENT." WHERE products_id = '".(int)$items['products_id']."' AND (content_file = '".xtc_db_input($product_content['content_file'])."' OR content_file = '')");
        }

        $product_image_query = xtc_db_query("SELECT products_image
                                               FROM "
    .TABLE_PRODUCTS."
                                              WHERE products_id = '"
    .(int)$items['products_id']."'");
        $product_image = xtc_db_fetch_array($product_image_query);

        $duplicate_image_query = xtc_db_query("SELECT count(*) AS total
                                                 FROM "
    .TABLE_PRODUCTS."
                                                WHERE products_image = '"
    .xtc_db_input($product_image['products_image'])."'");
        $duplicate_image = xtc_db_fetch_array($duplicate_image_query);

        if ($duplicate_image['total'] < 2) {
          xtc_del_image_file($product_image['products_image']);
        }

        $mo_images_query = xtc_db_query("SELECT image_name
                                           FROM "
    .TABLE_PRODUCTS_IMAGES."
                                          WHERE products_id = '"
    .(int)$items['products_id']."'");
        while ($mo_images_values = xtc_db_fetch_array($mo_images_query)) {
          $duplicate_more_image_query = xtc_db_query("SELECT count(*) AS total
                                                        FROM "
    .TABLE_PRODUCTS_IMAGES."
                                                       WHERE image_name = '"
    .xtc_db_input($mo_images_values['image_name'])."'");
          $duplicate_more_image = xtc_db_fetch_array($duplicate_more_image_query);
          if ($duplicate_more_image['total'] < 2) {
            xtc_del_image_file($mo_images_values['image_name']);
          }
        }

        xtc_db_query("DELETE FROM ".TABLE_SPECIALS." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE xsell_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_IMAGES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TO_CATEGORIES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_DESCRIPTION." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_ATTRIBUTES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET_ATTRIBUTES." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TAGS." WHERE products_id = '".(int)$items['products_id']."'");

        if (defined('MODULE_WISHLIST_SYSTEM_STATUS') && MODULE_WISHLIST_SYSTEM_STATUS == 'true') {
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST_ATTRIBUTES." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        }

        $customers_statuses_array = xtc_get_customers_statuses();
        for ($i = 0, $n = sizeof($customers_statuses_array); $i < $n; $i ++) {
          if (isset($customers_statuses_array[$i]['id']))
            xtc_db_query("DELETE FROM ".TABLE_PERSONAL_OFFERS_BY.$customers_statuses_array[$i]['id']." WHERE products_id = '".(int)$items['products_id']."'");
        }

        $product_reviews_query = xtc_db_query("SELECT reviews_id
                                                 FROM "
    .TABLE_REVIEWS."
                                                WHERE products_id = '"
    .(int)$items['products_id']."'");
        while ($product_reviews = xtc_db_fetch_array($product_reviews_query)) {
          xtc_db_query("DELETE FROM ".TABLE_REVIEWS_DESCRIPTION." WHERE reviews_id = '".$product_reviews['reviews_id']."'");
        }
        xtc_db_query("DELETE FROM ".TABLE_REVIEWS." WHERE products_id = '".(int)$items['products_id']."'");
    }

    echo 'Alle Artikel mit einem Bestand von 0 oder weniger wurden gel&ouml;scht!';

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #7 am: 15. Februar 2021, 23:35:11
    Hallo awids

    sollte man bei folgendem Statement vielleicht nicht noch ein LIMIT setzen, denn so wie Jürgen schreibt handelt es sich um ca. 830 Artikel die gelöscht werden sollen. Da könnte ich mir vorstellen, dass die "max_execution_time" von PHP nicht ausreicht um das Skript bis zum Ende durchlaufen zu lassen.

    Code: PHP  [Auswählen]
    $items_query = xtc_db_query("SELECT products_id FROM ".TABLE_PRODUCTS." WHERE products_quantity < 1");

    Und dann wäre meiner Meinung nach ein Counter, den man hier

    Code: PHP  [Auswählen]
    echo 'Alle Artikel mit einem Bestand von 0 oder weniger wurden gel&ouml;scht!';

    mit ausgibt nicht schlecht.

    Gruss
    Hanspeter

    awids

    • Experte
    • Beiträge: 3.785
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #8 am: 16. Februar 2021, 00:26:50
    Bei dem Limit wegen der max_execution_time hast du natürlich recht. Eigentlich wollte ich das Script einfach halten. Ich habe aber nicht berücksichtigt, dass es auch Hostings mit ziemlich niedriger Einstellung gibt. Aber so ein LIMIT XYZ ist ja schnell in die Query gequetscht.

    Ich hatte das Script vorab nicht getestet und beim Test dann festgestellt, dass hier 2 Funktionen aufgerufen werden, die noch zusätzlich in die File mit rein müssen. Darum hier die angepasste Script-Version:

    Code: PHP  [Auswählen]
    <?php

    include ('includes/application_top.php');

    if (!function_exists('xtc_del_image_file')) {
      include (DIR_FS_INC.'xtc_get_customers_statuses.inc.php');
    }

    if (!function_exists('xtc_del_image_file')) {
      function xtc_del_image_file($image) {
        if (is_file(DIR_WS_POPUP_IMAGES.$image)) {
          @ unlink(DIR_WS_POPUP_IMAGES.$image);
        }
        if (is_file(DIR_WS_ORIGINAL_IMAGES.$image)) {
          @ unlink(DIR_WS_ORIGINAL_IMAGES.$image);
        }
        if (is_file(DIR_WS_THUMBNAIL_IMAGES.$image)) {
          @ unlink(DIR_WS_THUMBNAIL_IMAGES.$image);
        }
        if (is_file(DIR_WS_INFO_IMAGES.$image)) {
          @ unlink(DIR_WS_INFO_IMAGES.$image);
        }
      }
    }

    // limit
    $limit = 500;

    $items_query = xtc_db_query("SELECT products_id FROM ".TABLE_PRODUCTS." WHERE products_quantity < 1 LIMIT ".$limit);

    $rows = xtc_db_num_rows($items_query);

    while ($items = xtc_db_fetch_array($items_query)) {

        $product_content_query = xtc_db_query("SELECT content_file
                                                 FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                WHERE products_id = '"
    .(int)$items['products_id']."'");

        while ($product_content = xtc_db_fetch_array($product_content_query)) {
           $duplicate_content_query = xtc_db_query("SELECT count(*) AS total
                                                      FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                     WHERE content_file = '"
    .xtc_db_input($product_content['content_file'])."'
                                                       AND products_id != '"
    .(int)$items['products_id']."'");
           $duplicate_content = xtc_db_fetch_array($duplicate_content_query);
           if ($duplicate_content['total'] == 0) {
             if (is_file(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file'])) {
               @unlink(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file']);
             }
           }

           xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_CONTENT." WHERE products_id = '".(int)$items['products_id']."' AND (content_file = '".xtc_db_input($product_content['content_file'])."' OR content_file = '')");
        }

        $product_image_query = xtc_db_query("SELECT products_image
                                               FROM "
    .TABLE_PRODUCTS."
                                              WHERE products_id = '"
    .(int)$items['products_id']."'");
        $product_image = xtc_db_fetch_array($product_image_query);

        $duplicate_image_query = xtc_db_query("SELECT count(*) AS total
                                                 FROM "
    .TABLE_PRODUCTS."
                                                WHERE products_image = '"
    .xtc_db_input($product_image['products_image'])."'");
        $duplicate_image = xtc_db_fetch_array($duplicate_image_query);

        if ($duplicate_image['total'] < 2) {
          xtc_del_image_file($product_image['products_image']);
        }

        $mo_images_query = xtc_db_query("SELECT image_name
                                           FROM "
    .TABLE_PRODUCTS_IMAGES."
                                          WHERE products_id = '"
    .(int)$items['products_id']."'");
        while ($mo_images_values = xtc_db_fetch_array($mo_images_query)) {
          $duplicate_more_image_query = xtc_db_query("SELECT count(*) AS total
                                                        FROM "
    .TABLE_PRODUCTS_IMAGES."
                                                       WHERE image_name = '"
    .xtc_db_input($mo_images_values['image_name'])."'");
          $duplicate_more_image = xtc_db_fetch_array($duplicate_more_image_query);
          if ($duplicate_more_image['total'] < 2) {
            xtc_del_image_file($mo_images_values['image_name']);
          }
        }

        xtc_db_query("DELETE FROM ".TABLE_SPECIALS." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE xsell_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_IMAGES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TO_CATEGORIES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_DESCRIPTION." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_ATTRIBUTES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET_ATTRIBUTES." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TAGS." WHERE products_id = '".(int)$items['products_id']."'");

        if (defined('MODULE_WISHLIST_SYSTEM_STATUS') && MODULE_WISHLIST_SYSTEM_STATUS == 'true') {
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST_ATTRIBUTES." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        }

        $customers_statuses_array = xtc_get_customers_statuses();
        for ($i = 0, $n = sizeof($customers_statuses_array); $i < $n; $i ++) {
          if (isset($customers_statuses_array[$i]['id']))
            xtc_db_query("DELETE FROM ".TABLE_PERSONAL_OFFERS_BY.$customers_statuses_array[$i]['id']." WHERE products_id = '".(int)$items['products_id']."'");
        }

        $product_reviews_query = xtc_db_query("SELECT reviews_id
                                                 FROM "
    .TABLE_REVIEWS."
                                                WHERE products_id = '"
    .(int)$items['products_id']."'");
        while ($product_reviews = xtc_db_fetch_array($product_reviews_query)) {
          xtc_db_query("DELETE FROM ".TABLE_REVIEWS_DESCRIPTION." WHERE reviews_id = '".$product_reviews['reviews_id']."'");
        }
        xtc_db_query("DELETE FROM ".TABLE_REVIEWS." WHERE products_id = '".(int)$items['products_id']."'");
       
    }

    echo 'Es wurden '.$rows.' Artikel mit einem Bestand von 0 oder weniger gel&ouml;scht!';

    awids

    • Experte
    • Beiträge: 3.785
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #9 am: 16. Februar 2021, 01:07:11
    Noch einen kleinen Copy&Paste-Fehler bereinigt:

    Code: PHP  [Auswählen]
    <?php

    include ('includes/application_top.php');

    if (!function_exists('xtc_get_customers_statuses')) {
      include (DIR_FS_INC.'xtc_get_customers_statuses.inc.php');
    }

    if (!function_exists('xtc_del_image_file')) {
      function xtc_del_image_file($image) {
        if (is_file(DIR_WS_POPUP_IMAGES.$image)) {
          @ unlink(DIR_WS_POPUP_IMAGES.$image);
        }
        if (is_file(DIR_WS_ORIGINAL_IMAGES.$image)) {
          @ unlink(DIR_WS_ORIGINAL_IMAGES.$image);
        }
        if (is_file(DIR_WS_THUMBNAIL_IMAGES.$image)) {
          @ unlink(DIR_WS_THUMBNAIL_IMAGES.$image);
        }
        if (is_file(DIR_WS_INFO_IMAGES.$image)) {
          @ unlink(DIR_WS_INFO_IMAGES.$image);
        }
      }
    }

    // limit
    $limit = 500;

    $items_query = xtc_db_query("SELECT products_id FROM ".TABLE_PRODUCTS." WHERE products_quantity < 1 LIMIT ".$limit);

    $rows = xtc_db_num_rows($items_query);

    while ($items = xtc_db_fetch_array($items_query)) {

        $product_content_query = xtc_db_query("SELECT content_file
                                                 FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                WHERE products_id = '"
    .(int)$items['products_id']."'");

        while ($product_content = xtc_db_fetch_array($product_content_query)) {
           $duplicate_content_query = xtc_db_query("SELECT count(*) AS total
                                                      FROM "
    .TABLE_PRODUCTS_CONTENT."
                                                     WHERE content_file = '"
    .xtc_db_input($product_content['content_file'])."'
                                                       AND products_id != '"
    .(int)$items['products_id']."'");
           $duplicate_content = xtc_db_fetch_array($duplicate_content_query);
           if ($duplicate_content['total'] == 0) {
             if (is_file(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file'])) {
               @unlink(DIR_FS_DOCUMENT_ROOT.'media/products/'.$product_content['content_file']);
             }
           }

           xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_CONTENT." WHERE products_id = '".(int)$items['products_id']."' AND (content_file = '".xtc_db_input($product_content['content_file'])."' OR content_file = '')");
        }

        $product_image_query = xtc_db_query("SELECT products_image
                                               FROM "
    .TABLE_PRODUCTS."
                                              WHERE products_id = '"
    .(int)$items['products_id']."'");
        $product_image = xtc_db_fetch_array($product_image_query);

        $duplicate_image_query = xtc_db_query("SELECT count(*) AS total
                                                 FROM "
    .TABLE_PRODUCTS."
                                                WHERE products_image = '"
    .xtc_db_input($product_image['products_image'])."'");
        $duplicate_image = xtc_db_fetch_array($duplicate_image_query);

        if ($duplicate_image['total'] < 2) {
          xtc_del_image_file($product_image['products_image']);
        }

        $mo_images_query = xtc_db_query("SELECT image_name
                                           FROM "
    .TABLE_PRODUCTS_IMAGES."
                                          WHERE products_id = '"
    .(int)$items['products_id']."'");
        while ($mo_images_values = xtc_db_fetch_array($mo_images_query)) {
          $duplicate_more_image_query = xtc_db_query("SELECT count(*) AS total
                                                        FROM "
    .TABLE_PRODUCTS_IMAGES."
                                                       WHERE image_name = '"
    .xtc_db_input($mo_images_values['image_name'])."'");
          $duplicate_more_image = xtc_db_fetch_array($duplicate_more_image_query);
          if ($duplicate_more_image['total'] < 2) {
            xtc_del_image_file($mo_images_values['image_name']);
          }
        }

        xtc_db_query("DELETE FROM ".TABLE_SPECIALS." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_XSELL." WHERE xsell_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_IMAGES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TO_CATEGORIES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_DESCRIPTION." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_ATTRIBUTES." WHERE products_id = '".(int)$items['products_id']."'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_BASKET_ATTRIBUTES." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        xtc_db_query("DELETE FROM ".TABLE_PRODUCTS_TAGS." WHERE products_id = '".(int)$items['products_id']."'");

        if (defined('MODULE_WISHLIST_SYSTEM_STATUS') && MODULE_WISHLIST_SYSTEM_STATUS == 'true') {
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
          xtc_db_query("DELETE FROM ".TABLE_CUSTOMERS_WISHLIST_ATTRIBUTES." WHERE products_id = '" . (int)$items['products_id'] . "' OR products_id LIKE '" . (int)$items['products_id'] . "{%'");
        }

        $customers_statuses_array = xtc_get_customers_statuses();
        for ($i = 0, $n = sizeof($customers_statuses_array); $i < $n; $i ++) {
          if (isset($customers_statuses_array[$i]['id']))
            xtc_db_query("DELETE FROM ".TABLE_PERSONAL_OFFERS_BY.$customers_statuses_array[$i]['id']." WHERE products_id = '".(int)$items['products_id']."'");
        }

        $product_reviews_query = xtc_db_query("SELECT reviews_id
                                                 FROM "
    .TABLE_REVIEWS."
                                                WHERE products_id = '"
    .(int)$items['products_id']."'");
        while ($product_reviews = xtc_db_fetch_array($product_reviews_query)) {
          xtc_db_query("DELETE FROM ".TABLE_REVIEWS_DESCRIPTION." WHERE reviews_id = '".$product_reviews['reviews_id']."'");
        }
        xtc_db_query("DELETE FROM ".TABLE_REVIEWS." WHERE products_id = '".(int)$items['products_id']."'");

    }

    echo 'Es wurden '.$rows.' Artikel mit einem Bestand von 0 oder weniger gel&ouml;scht!';

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #10 am: 16. Februar 2021, 01:47:01
    Hallo Jürgen,

    hast du viele Produkte auf der Startseite (Top), wenn nein hätte ich eine zu awids' Vorschlag alternative Idee wie du das Löschen der Artikel ohne Bestand einfacher machen kannst. Und dann wäre noch interessant die Werte für "max_execution_time" und "max_input_vars" zu kennen, diese sollten nämlich möglichst gross sein, so 120 bei "max_execution_time" und 10000 bei "max_input_vars" währen nicht schlecht. Finden tust du diese Werte  im Admin unter Hilfsprogramme -> Server Info.

    Und nun zur Idee, du entfernst alle Artikel die gegenwärtig auf der Startseite gezeigt werden von dieser, dann führst du mit phpMyAdmin folgenden Befehl aus,

    Code: SQL  [Auswählen]
    UPDATE products
         SET products_startpage = 1
         WHERE products_quantity < 1
         LIMIT 100;

    so und nun werden im Admin unter Kategorien/Artikel die ersten 100 Artikel mit bestand 0 oder kleiner unter "Top" angezeigt, diese kannst du nun mit einem Klick auswählen und löschen, diesen Vorgang wiederholst du 9 mal dann sollten alle Artikel ohne Bestand gelöscht sein. Danach kannst du wieder die vorherigen Produkte auf die Startseite setzen.

    Gruss
    Hanspeter

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #11 am: 16. Februar 2021, 10:21:44
    Hinweis:
    Code: SQL  [Auswählen]
    SELECT products_id FROM products WHERE products_quantity < 1;

    Dies berücksichtigt noch keine Bestände bei den Attributen. Hier sind ggf. zusätzlichePrüfungen notwendig.

    awids

    • Experte
    • Beiträge: 3.785
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #12 am: 16. Februar 2021, 10:36:50
    Ist es nicht so geregelt, dass man die Summe der Attributs-Bestände als Gesamtbestand beim Hauptartikel eingeben soll?

    In diesem Fall - sofern sich alle brav an die Vorgehensweise halten - sind doch mit der einfach gehaltenen Query die Artikel mit Attributen abgedeckt?!

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #13 am: 16. Februar 2021, 10:47:14
    Hab ich vorher ausprobiert. Nur wenn bei der Eingabe kein Fehler passiert, stimmt das. Eine Änderung an einem Einzigen Bestandsfeld und schon passe es nicht, Spätestens wenn mehrere Optionen benutzt werden ist das Chaos vorprogrammiert.

    Ebenfalls unberücksichtigt ist de Tatsache eines Storno. Hier kann kein Bestand zurückgebucht werden.

    Der Shop hat die Möglichkeit Artikel ohne Bestand automatisch zu deaktivieren. Kombiniert man das mit dem Verschieben in eine separate Kategorie, hat man im normalen Shop die Übersichtlichkeit gewahrt und gleichzeitig ein Archiv alter Produkte, die man bei Bedarf wieder reaktiveren kann.

    Löschen solte mit einer Prüfung der letztmaligen Nutzung z. B. älter als 60 Tage einhergehen.

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Artikel ohne Bestand über Datenbank löschen
    Antwort #14 am: 16. Februar 2021, 14:04:47
    Solange wie das Shopsystem keine Attribute-Kombinationen verwalten kann, halte ich das Shop interne Attributsystem nur für Shops wie z.B.  kratzhimmelpunktde sinnvoll. Erst durch eine Attributsystem welches Kombinationen verwalten kann ist eine vernünftige Lagerbestandsverwaltung von Produkten mit Optionen möglich, siehe Bilder.

    [ Für Gäste sind keine Dateianhänge sichtbar ]
    [ Für Gäste sind keine Dateianhänge sichtbar ]
    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Gruss
    Hanspeter
    4 Antworten
    4833 Aufrufe
    01. November 2013, 09:25:39 von lullifatz
    4 Antworten
    1176 Aufrufe
    19. Februar 2019, 00:56:34 von ARS
    10 Antworten
    3997 Aufrufe
    15. September 2010, 08:11:36 von rattenfänger