Anleitung Gastkonten durch SQL löschen

Thema wurde von Petra, 11. Februar 2012 erstellt.

  1. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    #1 Petra, 11. Februar 2012
    Zuletzt bearbeitet: 8. September 2012
    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.
     
  2. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Guter Tipp :) ... und in den MySQLDumper kann man es auch einbauen - siehe hier...
     
  3. Ollie

    Ollie Erfahrener Benutzer

    Registriert seit:
    27. April 2011
    Beiträge:
    231
    Danke erhalten:
    6
    Danke vergeben:
    50
    Das ist ne gute Sache !!!

    Danke sehr :)
     
  4. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    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

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    So ist es, Avenger.
     
  6. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Entsteht dadurch nicht ein Prob mit dem Ausdrucken der Bestellung?
     
  7. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Nein, weil die Bestellung alle notwendigen Daten dafür enthält.
     
  8. Daniel (Gambio)

    Daniel (Gambio) Erfahrener Benutzer

    Registriert seit:
    8. April 2011
    Beiträge:
    1.901
    Danke erhalten:
    1.621
    Danke vergeben:
    424
    Wir werden das heute kurz besprechen, ich sehe aber aktuell auch keinen Grund der dagegen spräche.
     
  9. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.693
    Danke vergeben:
    903
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.693
    Danke vergeben:
    903
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    3.456
    Danke erhalten:
    330
    Danke vergeben:
    551
    kann ein Gast nach z.Bsp.: 30min nicht automatisch ausgeloggt werden?
     
  15. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.693
    Danke vergeben:
    903
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    3.456
    Danke erhalten:
    330
    Danke vergeben:
    551
    ja, das stimmt. Dann ebend anders:)
     
  18. Steffen (indiv-style.de)

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

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    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

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    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

    Registriert seit:
    26. September 2011
    Beiträge:
    730
    Danke erhalten:
    94
    Danke vergeben:
    76
    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.