Templateshop - Eine große Auswahl an neuen und modernen Templates für die modified eCommerce Shopsoftware
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

    Karl1

    • Experte
    • Beiträge: 1.879
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #30 am: 13. Januar 2023, 17:00:12
    Hallo noRiddle,
    ich habe das Thema nicht mehr verfolgt, weil du geschrieben hast:

    [...]
    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.
    [...]

    und mein Gedanke (den ich nicht verständlich genug erklären kann) genau in die entgegengesetzte Richtung geht.

    Hätte ich das Problem des "Duplicate entry", dann würde ich den PHP-Code in includes/external/dsgvo/modules/dsgvo_action.php ändern.
    Statt DELETE und INSERT würde ich eine Abfrage, ob bereits ein Eintrag in der Tabelle "customers_dsgvo" existiert einbauen und entsprechend einen UPDATE- oder INSERT-Befehl setzen.
    Anschließend abwarten und Logs kontrollieren.

    Gruß Karl

    KJoe

    • Fördermitglied
    • Beiträge: 66
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #31 am: 13. Januar 2023, 17:00:42
    [...]
    Ich würde dir raten auf eine aktuellere SQL-Version umzusteigen - bietet dein Hoster bestimmt an.
    [...]

    Hallo Karl,

    Danke für den Hinweis, ein Tausch der SQL Version ist uns allerdings nicht möglich.
    Wir fahren ein managed vServer Sy<stem bei HostEurope. Dort ist nur PHP wahlweise um je eine Version älter wählbar.

    Wir nehmen es einfach hin, dass eine neue Software nicht die Verwendung aller alten MySQL Revisionen abdecken kann. ;-)
    Denn sonst läuft alles top (bei uns).

    Es war nur verwunderlich, dass ich zu genau diesem Fehler nichts gefunden habe.
    Es ist also ein spezieller, wenn nicht sogar ein Einzelfall. :-)

    Danke für den guten Support und allen gute Geschäfte
    VG Joe

    Karl1

    • Experte
    • Beiträge: 1.879
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #32 am: 13. Januar 2023, 17:11:34
    Hallo Joe,
    scheinbar bist du doch nicht so ganz alleine mit deiner Warnung: 1054 - Unknown column 'po.products_options_values_id' in 'field list'

    Gruß Karl

    GTB

    • modified Team
    • Gravatar
    • Beiträge: 6.306
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #33 am: 01. Februar 2023, 12:53:57
    Hallo,

    @KJoe
    kann es sein, dass ihr eine Warenwirtschaft einsetzt und Kunden laufend aktualisiert werden ?

    Gruss Gerhard

    Gulliver72

    • Mitglied
    • Beiträge: 191
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #34 am: 06. Juni 2023, 20:03:33
    Hallo zusammen,

    das Problem tritt wirklich selten auf.

    Ursache ist nach meiner Recherche, wenn Kunde A eine Contentseite aufruft (Code in dsgvo_create.php wird ausgeführt)
    und zeitgleich ein Kunde B den Datenschutz auf der gleichen Contentseite bestätigt (Code in dsgvo_action.php wird ausgeführt)
    Der Duplicate tritt allerdings nur auf, wenn Code in der dsgvo_create.php in besonderen Konstellationen mehrere Kundennummern einträgt.

    In der While-Schleife scheinen wenige Millisekunden für das Szenario zu reichen.

    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) { // hier ist die Datenschutz-Bestätigung von Kunde B noch nicht da
                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); // während der while-Schleife hat Kunde B bestätigt
                }
              }
     

    Könnt ihr meinen Gedankengang bestätigen?
    Wenn ja, hilft in der dsgvo_create.php die Änderung wie von Karl vorgeschlagen auf ein optionales Update

    VG Bert

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #35 am: 07. Juni 2023, 08:10:22
    Kannst du mal genau ausführen wie es zum Eintrag für ein und dieselbe customers_id  kommen soll ?
    Ich kann nicht sehen, wie die Aktionen eines Kunden die eines anderen Kunden beeinflussen sollen.

    Weiter oben im Thread habe ich ja ein paar Dinge zur Logik der involvierten Skripte ausgeführt.
    U.a. wunderte ich mich auch über eine Query deren Verhalten schwer vorhersehbar ist.

    Nebenfrage:
    Auf welcher Engine laufen die betroffenen Tabellen, MyISAM oder InnoDB ?

    Gruß,
    noRiddle

    Gulliver72

    • Mitglied
    • Beiträge: 191
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #36 am: 07. Juni 2023, 10:28:35
    Hallo noRiddle,

    ich versuche es mal.
    Erstmal die ganzen relevanten Daten

    Datenbank:    MySQL 8.0.33
    PHP Version:    8.1.19 (Zend: 4.1.19)
    Modified Shop 2.0.7.2

    Gastbestellungen erlaubt
    Gastkonten werden gelöscht

    Log:

    Kundennummer 9182
    Zugang erstellt am: 06.06.2023 16:14:39
    letzte Änderung: 06.06.2023 17:19:43
    letzte Anmeldung: 06.06.2023 18:40:25

    Code: PHP  [Auswählen]
    [2023-06-06 16:14:40]   [warning]       [modified]      [pid:20419]     1062 - Duplicate entry '9182-2' for key 'customers_dsgvo.PRIMARY'<br/><br/>INSERT INTO customers_dsgvo (customers_id, content_group, date_confirmed) VALUES ('9182', '2', '2023-06-06 16:14:39') in File: /var/www/XXX/inc/db_functions_mysqli.inc.php on Line: 161     {}      {}
    [2023-06-06 16:14:40]   [warning]       [modified]      [pid:20419]     Backtrace #0 - /var/www/XXX/inc/db_functions.inc.php called at Line 76  {}      {}
    [2023-06-06 16:14:40]   [warning]       [modified]      [pid:20419]     Backtrace #1 - /var/www/XXX/includes/external/dsgvo/modules/dsgvo_create.php called at Line 63  {}      {}
    [2023-06-06 16:14:40]   [warning]       [modified]      [pid:20419]     Backtrace #2 - /var/www/XXX/includes/extra/application_bottom/99_dsgvo.php called at Line 7     {}      {}
    [2023-06-06 16:14:40]   [warning]       [modified]      [pid:20419]     Backtrace #3 - /var/www/XXX/includes/application_bottom.php called at Line 49   {}      {}
    [2023-06-06 16:14:40]   [warning]       [modified]      [pid:20419]     Backtrace #4 - /var/www/XXX/shop_content.php called at Line 121 {}      {}

    Kundennummer 9184
    Zugang erstellt am: 06.06.2023 16:45:33
    letzte Änderung: 06.06.2023 17:20:17
    letzte Anmeldung: 06.06.2023 16:45:33

    Code: PHP  [Auswählen]
    [2023-06-06 16:45:42]   [warning]       [modified]      [pid:27149]     1062 - Duplicate entry '9184-2' for key 'customers_dsgvo.PRIMARY'<br/><br/>INSERT INTO customers_dsgvo (customers_id, content_group, date_confirmed) VALUES ('9184', '2', '2023-06-06 16:45:33') in File: /var/www/XXX/inc/db_functions_mysqli.inc.php on Line: 161     {}      {}
    [2023-06-06 16:45:42]   [warning]       [modified]      [pid:27149]     Backtrace #0 - /var/www/XXX/inc/db_functions.inc.php called at Line 76  {}      {}
    [2023-06-06 16:45:42]   [warning]       [modified]      [pid:27149]     Backtrace #1 - /var/www/XXX/includes/external/dsgvo/modules/dsgvo_create.php called at Line 63  {}      {}
    [2023-06-06 16:45:42]   [warning]       [modified]      [pid:27149]     Backtrace #2 - /var/www/XXX/includes/extra/application_bottom/99_dsgvo.php called at Line 7     {}      {}
    [2023-06-06 16:45:42]   [warning]       [modified]      [pid:27149]     Backtrace #3 - /var/www/XXX/includes/application_bottom.php called at Line 49   {}      {}
    [2023-06-06 16:45:42]   [warning]       [modified]      [pid:27149]     Backtrace #4 - /var/www/XXX/product_info.php called at Line 56  {}      {}

    Der Code in der dsgvo_create.php prüft zum Ausführungszeitpunkt, welche Kundennummer noch nicht in der Tabelle customers_dsgvo vorhanden ist.
    Das geschieht in Abhängigkeit des Zeitpunktes der Kundenanmeldung und des Zeitpunktes der letzten Datenschutzänderung.
    Wenn der Kunde sich nach der letzten Datenschutzänderung erst angemeldet hat, wird die Kundennummer in der Tabelle ergänzt.

    Folgender Code liefert doch eine Menge X an IDs

    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'])."'");
     

    Wenn in der folgenden while Schleife mehrere Durchläufe erfolgen, kann der Duplicate kommen, wenn genau in diesem Zeitfenster eine Kundennummer aus der Menge X den Datenschutz bestätigt hat.
    Extrem selten und möglicherweise durch eine Kombi von vielen Kunden und einem "langsameren" Server begünstigt.

    Code: PHP  [Auswählen]
             
                    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);
                }
              }
     

    Kannst du das nachvollziehen? Nachstellen ist nach meinem Verständnis unmöglich.

    VG Bert

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #37 am: 07. Juni 2023, 20:13:24
    Mmh, verstehe.
    Der Kunde bestätigt gerade die Datenschutzerklärung und stand vorher noch nicht in der Tabelle customers_dsgvo
    - denn nur so kann seine customers_id  in den Loop kommen -
    und erst nach seiner Bestätigung und dem Eintrag in die genannte Tabelle, gelangt der Loop an die Stelle wo seine customers_id  an der Reihe ist und zwar durch einen anderen Kunden der zum richtigen (eigtl. unglücklichsten) Moment irgend eine Seite im Shop aufruft und somit die customers_id  des Bestätigenden in das Ergebnis der Query gerät die im Loop verarbeitet wird, weil sie just in dem Moment noch nicht in der Tabelle customers_dsgvo  vorhanden war.
    Sehr gut kombiniert.

    Mir fällt momentan nichts ein womit man das abfangen könnte...

    Gruß,
    noRiddle

    Gulliver72

    • Mitglied
    • Beiträge: 191
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #38 am: 08. Juni 2023, 00:38:19
    Abfangen kann man das tatsächlich nicht, aber man kann es umgehen.

    Mein Vorschlag wäre folgendes

    In der shoproot/includes/external/dsgvo/modules/dsgvo_create.php  Zeile 40-66 auskommentieren

    Code: PHP  [Auswählen]
    /*        $check_dsgvo_query = xtc_db_query("SELECT cod.date_added
                                                 FROM `content_dsgvo` cod
                                                WHERE cod.content_group = '".(int)$content_group."'
                                                  AND cod.customers_status = '".(int)$customers_status['customers_status_id']."'
                                             ORDER BY cod.date_added DESC
                                                LIMIT 1");
            if (xtc_db_num_rows($check_dsgvo_query) > 0) {
              $check_dsgvo = xtc_db_fetch_array($check_dsgvo_query);  
              $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);
                }
              }
            }*/

     

    Dann den Inhalt der  shoproot/includes/extra/application_top/application_top_end/99_dsgvo.php ändern in

    Code: PHP  [Auswählen]
    <?php
      if (defined('MODULE_SYSTEM_DSGVO_STATUS')
          && MODULE_SYSTEM_DSGVO_STATUS == 'true'
          && MODULE_SYSTEM_DSGVO_CONTENT != ''
          )
      {
            if (basename($PHP_SELF) == FILENAME_ACCOUNT || basename($PHP_SELF) == FILENAME_CHECKOUT_SHIPPING) {

          $content_group_array = explode(',', MODULE_SYSTEM_DSGVO_CONTENT);
          foreach ($content_group_array as $content_group) {

            $check_dsgvo_query = xtc_db_query("SELECT cod.date_added
                                                 FROM `content_dsgvo` cod
                                                WHERE cod.content_group = '"
    .(int)$content_group."'
                                                  AND cod.customers_status = '"
    .(int)$_SESSION['customers_status']['customers_status_id']."'
                                             ORDER BY cod.date_added DESC
                                                LIMIT 1"
    );
            if (xtc_db_num_rows($check_dsgvo_query) > 0) {
              $check_dsgvo = xtc_db_fetch_array($check_dsgvo_query);  
              $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 = '"
    .(int)$_SESSION['customer_id']."'
                                                        AND c.customers_date_added >= '"
    .xtc_db_input($check_dsgvo['date_added'])."'");
              if (xtc_db_num_rows($check_customers_query) > 0) {
                $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);
              }
            }
              }
            }

            if ($_SERVER['REQUEST_METHOD'] == 'POST') {

          require_once (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/system/system_dsgvo.php');
       
          if (isset ($_GET['action']) && ($_GET['action'] == 'dsgvo')) {
                    require(DIR_FS_EXTERNAL.'dsgvo/modules/dsgvo_action.php');
                    require(DIR_FS_EXTERNAL.'dsgvo/modules/dsgvo_module.php');
          }
            }
      }
    ?>

    Kurz zur Erklärung:

    Nach der erfolgreichen Erstellung eines Accounts wird der Kunde entweder auf die Accountseite oder auf die Versandseite des Checkout weitergeleitet.
    Dort wird jetzt gleich geprüft und ggfls. die Kunden-ID in die Tabelle customers_dsgvo eingetragen.
    Damit entfällt der Loop. Kundenspezifische Daten stehen an der Stelle ja zur Verfügung.

    Ich hoffe, ich habe nichts übersehen und die richtigen Stellen getroffen.

    VG Bert

    PS: In der create_account.php ist weit und breit kein nutzbarer Hook, deshalb dieser Umweg.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #39 am: 08. Juni 2023, 08:56:38
    Der bisherige Code, den du rauswerfen möchtest, sorgt dafür, daß alle Kunden die sich noch nicht in der DB-Tabelle customers_dsgvo  befinden dort eingetragen werden.
    Das sind ja nicht nur Neukunden sondern auch ältere Kunden, z.B. nach einem Shop-Update oder nach Neuinstallation des DSGVO-Moduls. Die fallen bei deiner Lösung hinten runter.
    *EDIT*
    Nöö, verkehrt meine Aussage, wir haben ja eine Einschränkung in der Query
    Code: PHP  [Auswählen]
    " AND c.customers_date_added >= '".xtc_db_input($check_dsgvo['date_added'])."'"

    folglich könnte dein Ansatz funktionieren.
    Allerdings frage ich mich wie denn die von mir erwähnten älteren Kunden in die Tabelle customers_dsgvo  gelangen.
    *END_EDIT*

    Eine Lösung könnte das sein:
    Wenn ein Kunde die Datenschutzerklärung bestätigt wird ein temporäres File generiert welches die customers_id  enthält
    (dsgvo_action.php)
    Code: PHP  [Auswählen]
                $sql_data_array = array(
                  'customers_id' => (int)$_SESSION['customer_id'],
                  'content_group' => (int)$content_group,
                  'date_confirmed' => 'now()',
                );
                xtc_db_perform('customers_dsgvo', $sql_data_array);
               touch(DIR_FS_CATALOG.DIR_ADMIN.'archives/content/.dsgvo_running_'.$_SESSION['customer_id']); //new, noRiddle

    und in der dsgvo_create.php  ganz oben
    Code: PHP  [Auswählen]
    if(is_file(DIR_FS_CATALOG.DIR_ADMIN.'archives/content/.dsgvo_running_'.$_SESSION['customer_id'])) {
      unset(DIR_FS_CATALOG.DIR_ADMIN.'archives/content/.dsgvo_running_'.$_SESSION['customer_id']);
    } //new, noRiddle

    sodaß beim Kunden selbst das generierte temporäre File nach Ausführung des DB-Eintrages gelöscht wird

    und im Loop weiter unten (den der andere Kunde auslöst)
    Code: PHP  [Auswählen]
                while ($check_customers = xtc_db_fetch_array($check_customers_query)) {
                  if(!file_exists(DIR_FS_CATALOG.DIR_ADMIN.'archives/content/.dsgvo_running_'.$check_customers['customers_id'])) { //new, noRiddle
                    $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);
                  } else {
                    unset((DIR_FS_CATALOG.DIR_ADMIN.'archives/content/.dsgvo_running_'.$check_customers['customers_id']));
                  }
                }

    Könnte jedoch sein, daß man da immer noch zwischen kommt.
    Zumindest müsste doch das ohnehin minimal kleine Zeitfenster, welches nach deiner Analyse zu dem "Duplicate entry" führte, noch kleiner werden.
     Was meinst du ?

    [...]
    PS: In der create_account.php ist weit und breit kein nutzbarer Hook, deshalb dieser Umweg.

    Ja, das ist Schade, Hooks bei Konto-Erstellung, aber auch in den Files für "Mein Konto" haben wir mehrfach erbeten aber leider gibt es Dinge die die Community anregt die entweder aus unbekannten Gründen untergehen oder schlicht ignoriert werden.
    Ein Team-Mitglied, webald,  hat 2018 bereits einen Thread dazu aufgemacht (Hook-Wünsche), soweit ich das sehe ist jedoch von den Vorschlägen nur wenig umgesetzt worden, vor allem nichts aus diesem Vorschlag von vr: Antwort #29
    und nicht zuletzt aus meiner Antwort #50, welche die letzte in genanntem Thread ist.

    Auch könnten wir längst update-sicher und ohne Warnings Sprach-Konstanten neu definieren, wenn die vorhandenen mittels
    Code: PHP  [Auswählen]
    defined('...') OR define('...', '...');

    definiert wären, wie ich bereits
    - inklusiver Blitz-Umsetzung mittels Regex-Suchen-Ersetzen in z.B. notepad++ -
    vorgeschlagen habe.

    Gruß,
    noRiddle

    Gulliver72

    • Mitglied
    • Beiträge: 191
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #40 am: 08. Juni 2023, 12:08:06
    Hm, das wäre aber auch nur eine Krücke.

    Für bestehende Kunden dann im System-Modul selbst folgende Funktionen ersetzen.
    Der greift dann nur bei Neuinstallation.

    Code: PHP  [Auswählen]
        function install()
        {
            xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added) VALUES ('MODULE_SYSTEM_DSGVO_STATUS', 'true',  '6', '1', 'xtc_cfg_select_option(array(\'true\', \'false\'), ', now())");
            xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added) VALUES ('MODULE_SYSTEM_DSGVO_CONTENT', '2',  '6', '1', 'xtc_cfg_select_content_module(', 'xtc_cfg_display_content', now())");

            xtc_db_query("CREATE TABLE IF NOT EXISTS `content_dsgvo` (
                            `customers_status` int(11) NOT NULL,
                            `content_group` int(11) NOT NULL,
                            `hash` varchar(32) NOT NULL,
                            `date_added` datetime NOT NULL,
                            PRIMARY KEY (`customers_status`,`content_group`,`hash`)
                          );"
    );

            xtc_db_query("CREATE TABLE IF NOT EXISTS `customers_dsgvo` (
                            `customers_id` int(11) NOT NULL,
                            `content_group` int(11) NOT NULL,
                            `date_confirmed` datetime NOT NULL,
                            PRIMARY KEY (`customers_id`,`content_group`)
                          );"
    );
                                             
                    $this->dsgvo_create();
        }
     

    und neu vor dem Klassen-Ende

    Code: PHP  [Auswählen]
            public function dsgvo_create() {
                   
          $customers_status_query = xtc_db_query("SELECT customers_status_id
                                                  FROM "
    .TABLE_CUSTOMERS_STATUS."
                                                                                              GROUP BY customers_status_id"
    );
          while ($customers_status = xtc_db_fetch_array($customers_status_query)) {
                    $content_group_array = explode(',', MODULE_SYSTEM_DSGVO_CONTENT);
                    foreach ($content_group_array as $content_group) {

                      $check_dsgvo_query = xtc_db_query("SELECT cod.date_added
                                                 FROM `content_dsgvo` cod
                                                                                             WHERE cod.content_group = '"
    .(int)$content_group."'
                                                 AND cod.customers_status = '"
    .(int)$customers_status['customers_status_id']."'
                                                                                             ORDER BY cod.date_added DESC
                                                 LIMIT 1"
    );
              if (xtc_db_num_rows($check_dsgvo_query) > 0) {
                            $check_dsgvo = xtc_db_fetch_array($check_dsgvo_query);  
                            $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);
                  }
                            }
                      }
                    }
              }
            }
     

    Das kann man noch etwas verfeinert, damit wir keinen redundanten Code in der zuvor genannten 99_dsgvo.php haben.

    Was man jetzt nochmal abfangen muss, sind Änderungen der Content-ID des Datenschutzes.
    Dann kann man aber diese Klassenfunktion aufrufen ;-)
    Was mir in dem Modul in diesem Zusammenhang komplett fehlt, ist ein Löschen von Datensätzen in der customers_dsgvo wenn die Content-ID des Datenschutzes geändert wurde.
    Oder habe ich das im Code irgendwo übersehen?

    Gruß Bert

    Gulliver72

    • Mitglied
    • Beiträge: 191
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #41 am: 08. Juni 2023, 17:40:46
    Habe mir das Modul nochmal genauer angeschaut.
    Meine Vorschläge sind Murks, weil der Insert eine Contentänderung nicht berücksichtigt.
    Das ist im Code schwer nachvollziehbar.
    Meine Grundidee bleibt, aber ich versuche das mal umzuschreiben.

    Davon unberührt bleibt die Frage, was mit alten Einträgen passiert, wenn die Content-ID geändert wird.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.989
    • Geschlecht:
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #42 am: 08. Juni 2023, 22:46:16
    Ich schaue auch nochmal...

    Gruß,
    noRiddle

    Q

    • Fördermitglied
    • Beiträge: 1.535
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #43 am: 02. April 2024, 20:23:01
    Kann es an den DB-Cache Einstellungen liegen?

    Ich hatte folgendes Szenario:
    Ich habe den IP-Blocker etwas erweitert und immer wieder DATA BASE ERROR Meldungen erhalten, wenn neue Einträge automatisch hinzukommen sollten. Teilweise innerhalb von weniger als einer Sekunden, aber auch darüber. Konnte den Fehler auch selbst erzeugen. Ewig rumprobiert woran es liegen könnte und durch Zufall im zweiten Testshop das Modul in einem früheren Stadium mit älterer Shopversion installiert gehabt und dort getestet und keine Fehler gehabt. Diese Version in den anderen Testshop kopiert und wieder Fehler. Dachte erst, es liegt an der Shopversion, also Update auf gleiche Version und der frisch geupdatete Shop der vorher ohne Fehler war, blieb ohne Fehler. Nach langem Suchen habe ich gesehen, dass in dem "älteren" Shop kein DB-Cache aktiviert war. Das gleiche im zweiten Shop eingestellt und voilà, keine Fehlermeldungen mehr. Nachdem ich im Modul den DB-Cache (File) jetzt immer leeren lasse, sobald ein neuer Eintrag in die DB geschrieben wird, taucht der Fehler nur noch ganz selten auf. Vermutlich wenn der selbe Eintrag innerhalb von Millisekunden erfolgt.

    KJoe

    • Fördermitglied
    • Beiträge: 66
    Re: Systemmodul DSGVO erzeugt Datenbankmeldung
    Antwort #44 am: 04. April 2024, 18:16:56
    ... ihr eine Warenwirtschaft einsetzt und Kunden laufend aktualisiert...

    Nabend mal,

    vielleicht hilft den Programmierern unter euch folgender Hinweis.
    Kundendaten sind bei uns statisch. Die werden seit je her nur exportiert. Die Anlage erfolgt nur durch den Kunden im Shop
    Was wir allerdings importieren, sind alle Artikel. Diese werden mehrfach je Woche überschrieben.

    Ich vermute jedoch, dass es bei uns an MySQL8 und dem Standardtimestamp 0000-00-00 00:00:00 liegt. Denn nach einer Multi-Ersetzung dieser Einträge mit einem festen Wert z.B. 2010-08-04 17:37:02 war ne kurze Zeit lang Ruhe.

    Joe
    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