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.
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...
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.
Also in ich glaube da gibbet 2x10³ andere Probleme die vorher gelöst werden sollten! Mögliche Lösungen: Neues Menü "Gast-Konten löschen" im Admin. Den bekannte SQL-Befehl von Hand im Admin ausführen. MySQLDumper die Arbeit machen lassen.
Nein, besteht nicht.... Die Login-Info steckt ja in der Session, hat mit dem Gastkonto nichts zu tun.... Das funktioniert problemlos.
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...
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...
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 .
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.
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.
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.