Anleitung Gastkonten durch SQL löschen

Dieses Thema im Forum "Tutorials & Anleitungen" wurde erstellt von Petra, 11. Februar 2012.

  1. Petra

    Petra G-WARD 2013/14/15

    Leider werden Gastkonten nicht immer gelöscht. Abhilfe bietet hier folgender Trick:

    Shop --> Admin--> Toolbox--> SQL dort den unten stehenden Code in das leere Feld eingeben und bestätigen.

    DELETE FROM `address_book` WHERE EXISTS (SELECT `customers_id` FROM `customers` WHERE (`customers`.`customers_id`=`address_book`.`customers_id`) AND (`customers`.`account_type`='1'));DELETE FROM `customers_info` WHERE EXISTS (SELECT `customers_id` FROM `customers` WHERE (`customers`.`customers_id`=`customers_info`.`customers_info_id`) AND (`customers`.`account_type`='1'));DELETE FROM `customers` WHERE `account_type` = '1';

    WICHTIG: Nach dem Kopieren unbedingt schauen, dass keine Leerzeichen in den Begriffen customer vorkommt.
     
    Zuletzt bearbeitet: 8. September 2012
  2. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Guter Tipp :) ... und in den MySQLDumper kann man es auch einbauen - siehe hier...
     
  3. Ollie

    Ollie Erfahrener Benutzer

    Das ist ne gute Sache !!!

    Danke sehr :)
     
  4. Avenger

    Avenger G-WARD 2012/13/14/15

    Sinnvoller wäre es natürlich, wenn Gambio das Löschen des Gastkontos aus der "logout.php" in die "checkout_succes.php" verlagern würde...

    Dann würden die nach der Bestellung automatisch gelöscht, wie man es de Gastbestellern ja verspricht....'

    Wer logged sich schon aus...
     
  5. Petra

    Petra G-WARD 2013/14/15

    So ist es, Avenger.
     
  6. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Entsteht dadurch nicht ein Prob mit dem Ausdrucken der Bestellung?
     
  7. Avenger

    Avenger G-WARD 2012/13/14/15

    Nein, weil die Bestellung alle notwendigen Daten dafür enthält.
     
  8. Daniel (Gambio)

    Daniel (Gambio) Erfahrener Benutzer

    Wir werden das heute kurz besprechen, ich sehe aber aktuell auch keinen Grund der dagegen spräche.
     
  9. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Ja, das Problem besteht, da man eine Bestellung nur anzeigen kann, wenn man eingeloggt ist. Ansonsten wäre es ja möglich, dass sich jeder jede Bestellungen anzeigen lassen könnte, was nicht im Sinne des Erfinders ist ;). Außerdem werden auf der checkout_success.php noch Inhalte verarbeitet/angezeigt, die auf (Gast)Kundendaten aus der Session zurückgreifen.
    Über eine Lösung müssten wir uns mal genauer Gedanken machen, denn das Löschen-Problem ist wirklich blöd.
     
  10. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Also in ich glaube da gibbet 2x10³ andere Probleme die vorher gelöst werden sollten!
    Mögliche Lösungen:

    1. Neues Menü "Gast-Konten löschen" im Admin.
    2. Den bekannte SQL-Befehl von Hand im Admin ausführen.
    3. MySQLDumper die Arbeit machen lassen.
     
  11. Avenger

    Avenger G-WARD 2012/13/14/15

    Nein, besteht nicht....

    Die Login-Info steckt ja in der Session, hat mit dem Gastkonto nichts zu tun....

    Das funktioniert problemlos.
     
  12. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Ohne es jetzt genauer angesehen zu haben: Beim Aufruf der Druckansicht-Seite wird über die application_top.php die includes/write_customers_status.php aufgerufen, die meines Wissens die Session-Daten löscht, wenn das Konto nicht mehr existiert. Ich kann mir das später nochmals genauer ansehen...
     
  13. Avenger

    Avenger G-WARD 2012/13/14/15

    Tatsächlich...

    Das ist aber ziemlich neu, und der Sinn dieses Tuns erschließt sich mir auch nicht so ganz.....

    Aber da das Löschen in der checkout_succes auch nicht idiotensicher ist (wenn der Gastbesteller den checkout nicht vollständig beendet, existiert er genauso noch in der DB), muss man doch was anderes überlegen...
     
  14. C h r i s t i a n

    C h r i s t i a n G-WARD 2012

    kann ein Gast nach z.Bsp.: 30min nicht automatisch ausgeloggt werden?
     
  15. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Dann bräuchte man ja einen Cronjob, der das für dich tut oder ein Aufräumscript, das bei jedem Seitenaufruf ausgeführt wird. Ist beides nicht elegent ;).
     
  16. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Das wird er ohnehin ... nur ist er damit nicht aus der DB gelöscht.
     
  17. C h r i s t i a n

    C h r i s t i a n G-WARD 2012

    ja, das stimmt. Dann ebend anders:)
     
  18. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Ich denke das fürs erste die Version mit dem link im Adminbereich ok wäre. Unter dem Kunden-Stamm ein Link "Gastkonten löschen" ist doch erst mal OK.
     
  19. Avenger

    Avenger G-WARD 2012/13/14/15

    Nein, das ist es m.E. nicht....

    Denn es kann ja dabei durchaus geschehen, dass man einem Gastbesteller während des Checkouts sein Konto löscht....

    Was dann zu allen möglichen Problemen führen kann, vom SQL-Fehler im weiteren Verlauf, bis zu Bestellungen ohne Versand- und Rechnungsadresse.

    Der einzig sichere Zeitpunkt, ein Gastkonto zu löschen, ist m.E. dann gegeben, wenn die Session abgelaufen ist.

    Folgende Lösung erreicht das:

    in "includes/functions/sessions.php"

    PHP:
        function _sess_gc($maxlifetime) {
          return 
    xtc_db_query("delete from " . TABLE_SESSIONS . " where expiry < '" . time() . "'");
        }
    ersetzen mit:

    PHP:
        function _sess_gc($maxlifetime) {
          
    $from_where_expiry=" from ".TABLE_SESSIONS." where expiry < '" . time() . "'";
          
    $delete_from="delete from ";
          if (
    DELETE_GUEST_ACCOUNT == 'true')
          {
            
    $res=xtc_db_query("select value".$from_where_expiry);
            if (
    xtc_db_num_rows($res))
            {
              
    $customer_ids_to_delete=array();
              while (
    $data=xtc_db_fetch_array($res))
              {
                
    $_session=unserialize_session($data['value']);
                
    $_session=$_session['customers_status'];
                if (
    $_session['customers_status_id'] == DEFAULT_CUSTOMERS_STATUS_ID_GUEST)
                {
                  
    $customers_id=$_session['customers_id'];
                  if (
    $customers_id)
                  {
                    
    $customer_ids_to_delete[]=$customers_id;
                  }
                }
              }
              if (
    count($customer_ids_to_delete)>0)
              {
                
    $in=' IN ('.implode(',',$customer_ids_to_delete).')';
                
    xtc_db_query($delete_from.TABLE_CUSTOMERS." where customers_id".$in);
                
    xtc_db_query($delete_from.TABLE_ADDRESS_BOOK." where customers_id".$in);
                
    xtc_db_query($delete_from.TABLE_CUSTOMERS_INFO." where customers_info_id".$in);
              }
            }
          }
          
    xtc_db_query("delete".$from_where_expiry);
          return 
    true;
        }

        function 
    unserialize_session($data)
        {
          
    $vars=preg_split('/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|/',$data,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
          for (
    $i=0; $vars[$i]; $i++)
          {
            
    $result[$vars[$i++]]=unserialize($vars[$i]);
          }
          return 
    $result;
        }
    Allerdings funktioniert diese Lösung nur dann, wenn man in "includes/configure.php" und "admin/includes/configure.php"
    PHP:
    define('STORE_SESSIONS', 'mysql'); // leave empty '' for default handler or set to 'mysql'
    definiert, da nur dann der spezielle Gambio-Session-Handler verwendet wird.

    Dagegen spricht nichts, Ich verwende sowieso immer das 'mysql' Session-Handling.
     
  20. S t e f a n

    S t e f a n Erfahrener Benutzer

    Hi Petra,

    in Deinem Post mit dem SQL-Befehlen haben sich zwei kleine Fehler eingeschlichen...
    "custom ers_id"enthält 2x ein Leerzeichen, das da nicht hingehört.