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: Systemmodul DSGVO erzeugt Datenbankmeldung

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #15 am: 03. Januar 2023, 22:26:26
    Bitte auch Log-Einträge hier im Forum in Code-tags einfassen, damit sie lesbarer werden, weil sie sich vom normalen Text abheben.
    Dazu kann man den (php) Button nehmen und dann das "=php" bei [code=php] entfernen, sodaß es so aussieht: [code]

    An der Stelle in der /includes/external/dsgvo/modules/dsgvo_create.php  werden Kunden in die Tabelle customers_dsgvo  eingetragen, die ein Kundenkonto haben welches ein Erstellungsdatum >= des Datums der letzten Änderung der Datenschutzerklärung haben.
    Die INSERT-Query wird nach Code nur dann ausgeführt wenn es noch keinen Eintrag für die customers_id  eines solchen Kunden in der Tabelle customers_dsgvo  gibt.
    Es kann also nach meiner Analyse nicht zu einem "Duplicate entry" kommen, es sei denn eine customers_id  ist mehrfach vergeben worden,
    was uns wieder zu Qs Frage führt.

    Das worauf Q sich bezog ist allerdings schwer nachzuweisen, wenn die betroffenen Kunden noch keine Bestellungen abgegeben haben.
    Führe mal versuchsweise diese Query in phpMyAdmin aus:
    Code: SQL  [Auswählen]
    SELECT o1.customers_id, o1.customers_email_address,
           o2.customers_id, o2.customers_email_address
      FROM orders o1
      JOIN orders o2
        ON o2.customers_id = o1.customers_id
     WHERE o2.customers_email_address != o1.customers_email_address;

    Wenn das ein Ergebnis ausgibt sind customers_id  mehrfach vergeben worden und wir müssen weiter schauen.
    Wenn es keines ausgibt müssen wir allerdings ebenfalls weiterschauen  :-?

    Gruß,
    noRiddle

    *NACHTRAG*
    Interessant wäre noch
    • MySQL- oder MariaDB-Version (nachschauen in Backend => Hilfsprogramme => Server Info)
    • Bietest du Gast-Konten an und wenn  ja, ist eingestellt, daß diese nach Bestellabschluß automatisch gelöscht werden ?

    KJoe

    • Fördermitglied
    • Beiträge: 66
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #16 am: 04. Januar 2023, 13:12:41
    Hallo noRiddle,

    auf unserem Server läuft MySQL 5.7.40 (und PHP8.1)
    Gastkonten weren bei uns nach Kundenwunsch gelöscht.
    (EIn Abgleich von AGB ist Datenschutzbestimmungen ist vorhanden.)

    Das SQL Statement listet 37874 Treffer.
    Das sind blöckeweise immer die selben Kunden mit geringen Unterschieden in den Datensätzen (Schreibweise, geänderte Wohnanschrift, Mailadresse etc...)  Alles kontrollierbar und nachvollziehbar.

    Wenn ein Kunde die Löschung wünscht, löschen wir alle Datensätze zur vorhandenen Mailadresse und weisen den Kunden darauf hin, dass er eventuell noch andere Mailadressen im Einsatz hat.
    Jede Löschung geschieht erst nach Bestätigung auf persönlich unsere Rückmeldung hin, wenn wir eine weitere Antwort des Kunden als Bestätigung der Löschanfrage haben.

    Wir haben viele langjährige Kunden, die schon 3 mal umgezogen sind und 4 neue Internetprovider mit 5 unterschiedlichen Mailadressen besitzen....

    Inwieweit das jedoch mit der Fehlermeldung des DSGVO Moduls bei uns zusammenhängt, kann ich jedoch nicht verknüpfen.

    Meine Logik sagt - Kunde erstellt ein Gastkonto bei Adresseingabe (jedes Mal ein Neues) und gibt darauf hin die Bestätigung(en) zur Verarbeitung der Daten für das eben erzeugte neue Gastkonto ab..
    Für dieses Gast- oder Kundenkonto gibt es dann den Eintrag in der Datenbank.

    Bei Kundenkonten mit Bestands ID gibt es dann eben einen Änderungseintrag, sofern sich die Richtlinien geändert haben.

    VG Joe

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #17 am: 04. Januar 2023, 14:27:16
    37874 Treffer  :-o
    Du willst mir sagen, daß 18937 Kunden ihre Mail-Adresse geändert haben ?
    Wohl gemerkt, wir reden von Mail-Adressen, nicht von anderen Daten, wie Wohnadresse u.Ä..

    Die Query gibt die Werte doppelt aus weil sie alle Treffer untereinander gegenüberstellt, sorry.
    *EDIT*
    Nicht zwingend doppelt, sondern mehrfach, je nachdem wieviele verschiedene Einträge es pro customers_id  mit verschiedenen Mail-Adressen gibt.
    *END_EDIT*
    Kannst mal diese bessere Query statt dessen machen:
    Code: SQL  [Auswählen]
    SELECT customers_id, customers_email_address
    FROM orders
    WHERE customers_id IN (
        SELECT customers_id
        FROM orders
        GROUP BY customers_id
        HAVING COUNT(DISTINCT customers_email_address) > 1
    )

    Aber ich wollte ja auch lediglich wissen, daß es solche Fälle gibt.

    Eure ganze Vorgehensweise mit Konten interessiert hier nicht. Es ging lediglich darum, ob Konten schonmal gelöscht werden.
    Der Verdacht den Q geäußert hat steht nun ganz stark im Raum.
    Vielleicht solltest du mal lesen worum es da geht. Ich hatte dazu auch ein Ticket angelegt, veilleicht verstehst du dann:
    Ticket #2351

    Gruß,
    noRiddle

    Karl1

    • Experte
    • Beiträge: 1.879
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #18 am: 04. Januar 2023, 15:25:03
    Hallo noRiddle,
    möchte nochmal zum Verständnis nachfragen.

    Diese Codezeilen führen zum "Duplicate entry":
    Code: PHP  [Auswählen]
              $check_customers_query = xtc_db_query("SELECT c.customers_id,
                                                            c.customers_date_added
                                                       FROM "
    .TABLE_CUSTOMERS." c
                                                  LEFT JOIN `customers_dsgvo` cd
                                                            ON c.customers_id = cd.customers_id
                                                               AND cd.content_group = '"
    .(int)$content_group."'
                                                      WHERE cd.customers_id IS NULL
                                                        AND c.customers_date_added >= '"
    .xtc_db_input($check_dsgvo['date_added'])."'");
              if (xtc_db_num_rows($check_customers_query) > 0) {
                while ($check_customers = xtc_db_fetch_array($check_customers_query)) {
                  $sql_data_array = array(
                    'customers_id' => (int)$check_customers['customers_id'],
                    'content_group' => (int)$content_group,
                    'date_confirmed' => $check_customers['customers_date_added'],
                  );
                  xtc_db_perform('customers_dsgvo', $sql_data_array);
                }
              }

    Sehr vereinfacht geschrieben, wird hier abgefragt, ob die customers_id aus der Tabelle customers in der Tabelle customers_dsgvo (content_group berücksichtigt) nicht existiert.
    Existiert die customer_id (unter Berücksichtigung der Zeitstempel) nicht, folgt der Insert-Befehl.

    Sollten die AUTO_INCREMENT-Werte der Tabelle customers (SQL-Serverneustart) falsch gesetzt worden sein, dann wird doch nur die falsche Zahl verglichen, ein doppelter Insert-Befehl folgt daraus doch nicht - oder liege ich da falsch?

    Ich habe zahlreiche Test mit neuen Konten, Gastkonten (mit und ohne Löschung) und Contentänderungen durchgeführt - kein "Duplicate entry".

    Kann es sein, dass "IS NULL" falsch interpretiert wird?

    Gruß Karl

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #19 am: 04. Januar 2023, 23:17:48
    Mmh, stimmt, du hast Recht. Wenn eine customers_id  aufgrund des InnoDB-Bugs wiederholt vergeben würde würde es den Eintrag in der Tabelle customers_dsgvo  ja bereits geben und es kann nicht zum "Duplicate entry" kommen.

    Bei der Query mit dem IS NULL habe ich auch erst gehakt und sie nicht verstanden, denn es ist etwas ungewöhnlich einen JOIN über c.customers_id = cd.customers_id  zu machen um in der WHERE-Clause dann nach cd.customers_id IS NULL zu konditionieren, also genau das Feld, welches man in der JOIN-ON-Clause zum Vergleich benutzt hat.
    Das Verhalten der Query empfinde ich als schwer abschätzbar, habe dann jedoch akzeptiert, daß man das so machen kann.
    *EDIT* (Bei mir auf MySQL 10.3.37 läuft die Query wie erwartet/erhofft) *END_EDIT*

    Es dürfte schwer herauszubekommen sein was die Query auf den diversen MySQL-Versionen als Ergebnis bringt.
    Ich würde sie so schreiben:
    Code: PHP  [Auswählen]
              $check_customers_query = xtc_db_query("SELECT customers_id,
                                                            customers_date_added
                                                       FROM "
    .TABLE_CUSTOMERS."
                                                      WHERE customers_date_added >= '"
    .xtc_db_input($check_dsgvo['date_added'])."'
                                                        AND customers_id NOT IN(SELECT customers_id
                                                                                  FROM customers_dsgvo
                                                                                 WHERE content_group = "
    .(int)$content_group.")");

    Trotzdem wundert mich das Ergebnis meiner Test-Query um customers_id  zu finden die mehrfach jedoch mit unterschiedlichen Mail-Adressen vorkommen.

    Gruß,
    noRiddle

    Karl1

    • Experte
    • Beiträge: 1.879
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #20 am: 05. Januar 2023, 09:25:16
    Guten Morgen Zusammen,
    ich vermute des Rätsels Lösung gefunden zu haben.
    Wechselt man im Systemmodul den Content (content_group) und hat die Zeitstempel für customers_date_added richtig gesetzt erhält man doppelte customers_id Einträge in der Tabelle.
    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Eine Warnmeldung wird jedoch nicht erzeugt, was auch Sinn macht.

    Ich nehme daher an, dass die in die Jahre gekommene Version MySQL 5.7.x (Erscheinungsjahr 2015 - Supportende 2023) die Warnung erzeugt.

    @Joe:
    Ich würde dir raten auf eine aktuellere SQL-Version umzusteigen - bietet dein Hoster bestimmt an.

    Gruß Karl

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #21 am: 05. Januar 2023, 09:36:56
    Verstehe ich nicht.
    Der PRIMARY KEY ist doch ein zusammengesetzter Key aus customers_id und  content_group, Wie soll bei dem von dir beschriebenen Scenario ein "Duplicate entry" entstehen ?
    Was meinst du mit "Zeitstempel für customers_date_added richtig gesetzt" ?, wie, wo ?

    Ich habe allerings noch ein Manko entdeckt, welches wir später genauer betrachten sollten, damit wir hier nicht durcheinander kommen.
    Wenn man den Datenschutz-Content ändert und dann später wiedre zurück ändert, exakt wie er vorher war, verlangt das System nur beim ersten mal eine  Bestätigung. Das halte ich nicht für korrekt.
    Das liegt an diesem Code in der dsgvo_create.php:
    Code: PHP  [Auswählen]
            if (!is_file(DIR_FS_CATALOG.DIR_ADMIN.'archives/content/'.$filename)) {
              file_put_contents(DIR_FS_CATALOG.DIR_ADMIN.'archives/content/'.$filename, serialize($content_array));

              $sql_data_array = array(
                'customers_status' => $customers_status['customers_status_id'],
                'content_group' => $content_group,
                'hash' => $hash,
                'date_added' => 'now()',
              );
              xtc_db_perform('content_dsgvo', $sql_data_array);
            }

    Gruß,
    noRiddle

    Karl1

    • Experte
    • Beiträge: 1.879
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #22 am: 05. Januar 2023, 11:48:38
    Hallo noRiddle,
    du hast natürlich Recht, den zusammengesetzten PRIMARY KEY habe gedanklich nicht berücksichtigt.
    Mit "Zeitstempel für customers_date_added richtig gesetzt" meinte ich, dass customers_date_added >= $check_dsgvo['date_added'] sein muss.

    Andere Überlegung:
    Angenommen Kunde1 muss einen geänderten Content verfizieren - macht sein Häkchen und schickt das Formular ab.
    Bedeutet includes/external/dsgvo/modules/dsgvo_action.php wird ausgeführt.
    Der Eintrag in der Tabelle customers_dsgvo wird gelöscht.
    Ein paar Codezeilen weiter unten wird ein neuer Datensatz eingefügt.

    Kunde2 ist zur selben Zeit wie Kunde1 im Shop unterwegs.
    In dem Moment in dem der Datensatz von Kunde1 gelöscht wurde, ruft Kunde2 eine Seite auf.
    Bedeutet includes/external/dsgvo/modules/dsgvo_create.php wird ausgeführt.
    Die Datenbankabfrage ergibt für einen kleinen Moment, dass in der Tabelle customers_dsgvo die customers_id von Kunde1 den Wert IS NULL hat.
    Ein neuer Datensatz für Kunde1 wird eingefügt - "Duplicate entry".

    Könnte das sein?
    Eventuell bei stark frequentierten Shops?
    Es stellt sich auch die Frage - muss der Eintrag von Kunde1 gelöscht werden, kann man den Datensatz nicht einfach updaten?

    Gruß Karl

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #23 am: 05. Januar 2023, 14:09:28
    Dein Szenario verstehe ich nicht.
    Du meinst genau in dem Moment zwischen Löschen des Eintrages und des Neueintrages durch Kunde 1 gerät Kunde2 ?
    Und was bewirkt der in Bezug auf Kunde1 ?
    Oder wie ?

    Warum der Eintrag erst gelöscht und dann neu eingetragen wird weiß ich nicht.
    Ja, könnte man so machen:
    Code: PHP  [Auswählen]
    xtc_db_perform('customers_dsgvo', $sql_data_array, 'update', "customers_id = ".(int)$_SESSION['customer_id']." AND content_group = ".(int)$content_group);

    Dürfte in der Wirkung allerdings egal sein, es sei denn du hast mit deinem Szenario, welches ich nicht verstanden habe auf irgend eine Weise Recht.

    Gruß,
    noRiddle

    Karl1

    • Experte
    • Beiträge: 1.879
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #24 am: 05. Januar 2023, 16:37:13
    Weil ich keine Ahnung habe, ob ich mit meinen Gedanken richtig liege, probiere ich es nochmal.

    Ich stelle mir vor, dass PHP die SQL-Befehle an den SQL-Server sendet und diese dort nach und nach (zumindest wenn es die selbe Tabelle betrifft) abgearbeitet werden.
    Ein "Duplicate entry" tritt nur ein, wenn ein Insert-Befehl mit selbem PRIMARY KEY abgearbeitet werden soll.

    Der zeitliche Ablauf müsste dann folgender Maßen sein:
    - PHP sendet Delete-Befehl an SQL-Server (dsgvo_action.php Zeile 24)
    - SQL löscht Zeile anhand der customer_id in Tabelle customers_dsgvo
    - PHP sendet Select-Befehl an SQL-Server - prüfe ob customer_id in Tabelle customers_dsgvo vorhanden ist (dsgvo_create.php ab Zeile 48)
    - SQL stellt fest kein Eintrag mit customer_id vorhanden
    - PHP sendet Insert-Befehl an SQL-Server (dsgvo_action.php Zeile 32)
    - PHP sendet Insert-Befehl an SQL-Server (dsgvo_create.php Zeile 63) -> "Duplicate entry"

    Ein doppelter Insert tritt also auf, wenn die Frage "customer_id vorhanden?" nach dem Löschen, aber vor dem 1. Insert gestellt wird.

    Wenn das zutreffen würde, könnte der Update-Befehl die Lösung sein.

    Gruß Karl

    P.S.: Hoffe die Zeilen sind verständlicher formuliert!?!?!

    Q

    • Fördermitglied
    • Beiträge: 1.535
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #25 am: 05. Januar 2023, 16:40:09
    Eintrag Database Error Mail: 53104 2 2023-01-02 19:08:33
    Eintrag Tabelle cust_dsgvo: 53104 2 2023-01-02 19:08:42

    Die Mail mit dem Duplicate Hinweis ist laut Zeitstempel 9 Sekunden jünger als der Eintrag in der Datenbank.
    Kann das irgendwie weiter helfen?
    Mit den 9s dachte ich, dass es evtl. irgendwie geht, dass man die create_account mit "F5", "zurück" oder irgendwie anders ein zweites mal aufruft und dann den Eintrag in die Tabelle schreibt ohne vorher zu prüfen, ob es den Kd schon gibt. Ich habe es aber nicht geschafft, dass der Shop dann komische Dinge tut. Im Gegenteil. Es erfolgt immer direkt eine Weiterleitung zur Accountseite, wenn ich die create_account wieder versuche aufzurufen, nachdem ich dort auf "weiter" geklickt habe.

    Ich kann auch nicht die Stelle finden, wo/wann bei der Accounterstellung die Erweiterung aufgerufen wird. Hat das von euch schon jemand gesehen? Vermutlich habe ich wieder  :tomato:

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #26 am: 05. Januar 2023, 18:23:45
    [...]
    Der zeitliche Ablauf müsste dann folgender Maßen sein:
    - PHP sendet Delete-Befehl an SQL-Server (dsgvo_action.php Zeile 24)
    - SQL löscht Zeile anhand der customer_id in Tabelle customers_dsgvo
    - PHP sendet Select-Befehl an SQL-Server - prüfe ob customer_id in Tabelle customers_dsgvo vorhanden ist (dsgvo_create.php ab Zeile 48)
    [...]

    Von wem, von Kunde2 ?, von Kunde1 kannst du ja nicht meinen.

    [...]
    - SQL stellt fest kein Eintrag mit customer_id vorhanden
    [...]

    Wieso ? , Kunde2 hat doch nicht dieselbe customers_id  wie Kunde1.

    dsgvo_create.php  wird übrigens in der /includes/application_bottom.php und dsgvo_action.php  über die application_top.php   geladen (für Q: beides über auto_include());
    sodaß Code aus erstgenannter nie mit Code aus zweitgenannter interferieren könnte.

    Gruß,
    noRiddle

    Karl1

    • Experte
    • Beiträge: 1.879
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #27 am: 06. Januar 2023, 13:47:22
    [...]
    Der zeitliche Ablauf müsste dann folgender Maßen sein:
    - PHP sendet Delete-Befehl an SQL-Server (dsgvo_action.php Zeile 24)
    - SQL löscht Zeile anhand der customer_id in Tabelle customers_dsgvo
    - PHP sendet Select-Befehl an SQL-Server - prüfe ob customer_id in Tabelle customers_dsgvo vorhanden ist (dsgvo_create.php ab Zeile 48)
    [...]

    Von wem, von Kunde2 ?, von Kunde1 kannst du ja nicht meinen.
    [...]

    Kunde1 angemeldet (hat $_SESSION['customer_id']) muss neue Datenschutzhinweise quittieren - der macht Häkchen und schickt das Formular ab.

    [...]
    [...]
    - SQL stellt fest kein Eintrag mit customer_id vorhanden
    [...]

    Wieso ? , Kunde2 hat doch nicht dieselbe customers_id  wie Kunde1.
    [...]

    Kunde2 nicht angemeldet aktualisiert eine Produktseite - customers_id  ist für dsgvo_create nicht erforderlich, dort werden alle IDs verglichen.

    Gruß Karl

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #28 am: 06. Januar 2023, 15:13:13
    Sorry, aber ich verstehe immer noch nicht was Kunde2 mit der Sache zu tun hat.

    Und dazu kommt noch das:
    [...]
    dsgvo_create.php  wird übrigens in der /includes/application_bottom.php und dsgvo_action.php  über die application_top.php   geladen (für Q: beides über auto_include());
    sodaß Code aus erstgenannter nie mit Code aus zweitgenannter interferieren könnte.
    [...]

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #29 am: 13. Januar 2023, 15:15:10
    Verfolgst du das noch, Karl1  ?
    Ich konnte deiner Argumentation bislang leider nicht folgen und habe auf meinen letzten Post keine Antwort mehr erhalten.

    Siehst du evtl. einen Zusammenhang mit dem Fehler aus Ticket #2357 ?

    Gruß,
    noRiddle

    *NACHTRAG*
    Ich habe ein Ticket zu dem Thema geöffnet: Ticket #2416
    Modulshop - Eine große Auswahl an neuen und hilfreichen Modulen für die modified eCommerce Shopsoftware
    15 Antworten
    7191 Aufrufe
    03. August 2012, 11:43:03 von piru
    4 Antworten
    4989 Aufrufe
    29. Juni 2012, 15:48:50 von Soeldner
    10 Antworten
    1217 Aufrufe
    05. September 2022, 00:27:46 von noRiddle (revilonetz)
    0 Antworten
    1805 Aufrufe
    22. März 2013, 16:45:18 von easy
               
    anything