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: Tabelle orders_status, warum kein AUTO_INCREMENT ?

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Werte Community.
    Bevor ich ein Ticket für das Folgende eröffne bitte ich euch das mal zu prüfen.

    Ich finde in /admin/orders_status.php folgenden Code:
    Code: PHP  [Auswählen]
    if ($action == 'insert') {
                if (!xtc_not_null($orders_status_id)) {
                  $next_id_query = xtc_db_query("select max(orders_status_id) as orders_status_id from " . TABLE_ORDERS_STATUS . "");
                  $next_id = xtc_db_fetch_array($next_id_query);
                  $orders_status_id = $next_id['orders_status_id'] + 1;
                }
    ...

    Diese Query und das folgende Setzen der orders_status_id auf $orders_status_id wäre nach meiner Meinung überflüssig wenn man der Spalte orders_status_id ein AUTO_INCREMENT geben würde. Der kombinierte PRIMARY KEY(orders_status_id, language_id) existiert bereits.

    Nach dem mySQL-Manual ist das bei MyISAM-Tabellen möglich und wird auch bereits auf diese Art genutzt (in der Tabelle products_description).
    Das würde dann nach Vorbild der Tabelle products_description funktionieren und die o.g. Query wäre überflüssig (wobei dann die $language_id gleich in das Array $sql_data_array aufgenommen werden und man, neben der überflüssigen Query, einiges an Code sparen könnte).

    Kann sich das mal jemand mit Plan der Zeit hat anschauen ?

    Merci.

    Gruß,
    noRiddle

    Linkback: https://www.modified-shop.org/forum/index.php?topic=33767.0
    Shop Hosting

    ChristianRothe

    • Mitglied
    • Beiträge: 187
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #1 am: 13. Oktober 2015, 19:31:02
    Da Du beim Einsetzen eines neuen Order-Status-Eintrags für mehrere Sprachen bei jeder Sprache dieselbe orders_status_id verwenden musst, bringt das auto_increment nicht sonderlich viel: Würdest Du die neue orders_status_id nach dem Einsetzen des neuen Eintrags für die 1. Sprache von der Datenbank erzeugen lassen, müsstest Du diesen Wert dann in richtigem Moment abgreifen, um ihn für die weiteren Sprachen zu  verwenden. Damit würdest Du eine komplizierte Vorgehensweise durch eine andere komplizierte Vorgehensweise ablösen.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #2 am: 13. Oktober 2015, 20:02:13
    Das ist ein Irrtum. Ich habe doch das Manual verlinkt.
    Bei einem kombinierten PRIMARY KEY auf orders_status_id und language_id ist das AUTO_INCREMENT auf orders_status_id sinnvoll und richtig und ich muß auch keinen "Wert dann in richtigem Moment abgreifen".
    Die von mir zitierte Query ist überflüssig bei Nutzung des genannten AUTO_INCREMENT.

    Schau dir als (bereits genanntes) Beispiel die Tabelle products_decaription an. Da hat man das bereits umgesetzt.

    Gruß,
    noRiddle

    ChristianRothe

    • Mitglied
    • Beiträge: 187
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #3 am: 13. Oktober 2015, 20:08:18
    Beim Einsetzen eines neuen Eintrags in products_description bringst Du immer schon die products_id mit, die beim Einsetzen eines neuen Produkt in die Tabelle products erzeugt wurde. Streng genommen, bräuchte man deshalb in der Tabelle products_description die Definition eines auto_increments für die products_id gar nicht.

    Bei der Tabelle order_status liegt die Sache etwas anders.

    web0null

    • Experte
    • Beiträge: 1.998
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #4 am: 14. Oktober 2015, 03:20:41
    Ich bin auch der Meinung ...
    AUTO_INCREMENT und xtc_db_insert_id() ist die bessere Wahl.

    Ein Query abfeuern, um herauszufinden welches die höchste ID ist, die man auch noch Hochzählen muss, ist meiner Meinung nach keine schöne Lösung.
    Gruß

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #5 am: 14. Oktober 2015, 07:50:04
    Der Autoincrement in products_description ist falsch und in 2.0 entfernt. Im Prinzip könnten sonst product_id's in Tabelle products_decription entstehen, zu denen es keine (oder falsche) Entsprechung in Tabelle products gibt.

    Für ordes_status fehlt für ein ordentliches DB-Design eigentlich eine Tabelle.
    Code: SQL  [Auswählen]
    CREATE TABLE orders_status_base (
      orders_status_id INT(11) NOT NULL AUTO_INCREMENT,
      orders_status VARCHAR(10) NOT NULL,
      PRIMARY KEY (orders_status_id)
    )

    ChristianRothe

    • Mitglied
    • Beiträge: 187
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #6 am: 14. Oktober 2015, 09:26:26
    Wenn man sich den Code von  /admin/orders_status.php genau anschaut, sieht man auch, dass das Query zum Ermitteln der höchsten ID an einer völlig falschen Stelle platziert ist: nämlich INNERHALB der Schleife for ($i = 0, $n = sizeof($languages); $i < $n; $i++)

    In der Folge zählt es bei jeder neuen Sprache die orders_status_id um 1 nach oben. Das ist Quatsch, weil so z.B. der englische und der deutsche Eintrag für denselben Orders_Status eine unterschiedliche ID bekommen. Das Query "select max(orders_status_id) as orders_status_id from " . TABLE_ORDERS_STATUS gehört VOR die Schleife for ($i = 0, $n = sizeof($languages); $i < $n; $i++) platziert:

    Richtig müsste es also so lauten:

    Code: PHP  [Auswählen]
      if (xtc_not_null($action)) {
        switch ($action) {
          case 'insert':
          case 'save':
            if (isset($_GET['oID'])) $orders_status_id = xtc_db_prepare_input($_GET['oID']);

            if ($action == 'insert') {
                     $next_id_query = xtc_db_query("select max(orders_status_id) as orders_status_id from " . TABLE_ORDERS_STATUS . "");
               $next_id = xtc_db_fetch_array($next_id_query);
               $orders_status_id = $next_id['orders_status_id'] + 1;
            }
               
            $languages = xtc_get_languages();

            for ($i = 0, $n = sizeof($languages); $i < $n; $i++) {
              $orders_status_name_array = $_POST['orders_status_name'];
              $language_id = $languages[$i]['id'];

              $sql_data_array = array('orders_status_name' => xtc_db_prepare_input($orders_status_name_array[$language_id]));

              if ($action == 'insert') {

                $insert_sql_data = array('orders_status_id' => $orders_status_id,
                                         'language_id' => $language_id);
                $sql_data_array = xtc_array_merge($sql_data_array, $insert_sql_data);
                xtc_db_perform(TABLE_ORDERS_STATUS, $sql_data_array);
              } elseif ($action == 'save') {
            //BOF - web28 - 2010-07-11 - BUGFIX no entry stored for previous deactivated languages
            $orders_status_query = xtc_db_query("select * from ".TABLE_ORDERS_STATUS." where language_id = '".(int)$language_id."' and orders_status_id = '".(int)$orders_status_id."'");
            if (xtc_db_num_rows($orders_status_query) == 0) xtc_db_perform(TABLE_ORDERS_STATUS, array ('orders_status_id' => (int)$orders_status_id, 'language_id' => (int)$language_id));
            //EOF - web28 - 2010-07-11 - BUGFIX no entry stored for previous deactivated languages
            xtc_db_perform(TABLE_ORDERS_STATUS, $sql_data_array, 'update', "orders_status_id = '" . (int)$orders_status_id . "' and language_id = '" . (int)$language_id . "'");
              }
            }
     

    web0null

    • Experte
    • Beiträge: 1.998
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #7 am: 14. Oktober 2015, 10:21:41
    In der Folge zählt es bei jeder neuen Sprache die orders_status_id um 1 nach oben. Das ist Quatsch
    "Quatsch"... ist das was du da schreibst.

    Code: PHP  [Auswählen]
    if (!xtc_not_null($orders_status_id)) {
      .........
      $orders_status_id = $next_id['orders_status_id'] + 1;
    }
     

    Das bedeutet dass er nur 1 mal in die Bedingung geht, denn beim 2. Mal ist die "$orders_status_id" vorhanden und die Bedingung somit "false" ;-)

    Gruß

    ChristianRothe

    • Mitglied
    • Beiträge: 187
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #8 am: 14. Oktober 2015, 12:01:23
    @web0null: Okay, da hast Du Recht. Das !xtc_not_null hatte ich nicht berücksichtigt. Funktional ist also alles in Ordnung.

    Vom Programmierstil her wäre es aber trotzdem schöner und verständlicher das SQL-Query zum Ermitteln der höchsten ID vor die for-Schleife zu stellen. Dann wären nämlich sämtliche Zuweisungen der Variable $orders_status_id an einer einzigen Stelle konzentriert. Dies würde die Verständlichkeit des Codes durchaus etwas erhöhen.

    web0null

    • Experte
    • Beiträge: 1.998
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #9 am: 14. Oktober 2015, 12:22:12
    Da stimme ich dir zu, aber nicht vom "Programmierstil" her, sondern von der Logik, bzw. Performance.
    Eine Abfrage in eine Schleife zu setzen die man auch außerhalb unterbringen kann ist immer unnötige Performance Verschwendung.

    Gruß

    ChristianRothe

    • Mitglied
    • Beiträge: 187
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #10 am: 14. Oktober 2015, 14:10:44
    ... Performance...
    Eine Abfrage in eine Schleife zu setzen die man auch außerhalb unterbringen kann ist immer unnötige Performance Verschwendung.
    In diesem Fall wird ausnahmsweise auch in der Schleife im Prinzip nichts verschwendet, weil die SQL-Abfrage höchsten einmal beim allerersten Schleifendurchlauf ausgeführt wird.

    web0null

    • Experte
    • Beiträge: 1.998
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #11 am: 14. Oktober 2015, 14:15:43
    Doch die Prüfung an sich (!xtc_not_null) muss jedes mal gemacht werden.
    Fällt zwar in dem Fall nicht wirklich ins Gewicht, ist aber trotzdem schlichtweg unnötig,
    und meiner Meinung nach, daher zu vermeiden.

    ... obwohl, man stelle sich nur vor man hätte alle 6500 - 7000 Sprachen die es gibt installiert :-> :booze:

    Gruß

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #12 am: 14. Oktober 2015, 14:38:25
    ... obwohl, man stelle sich nur vor man hätte alle 6500 - 7000 Sprachen die es gibt installiert :-> :booze:
    ... und dann im Frontend tausende von Fähnchen....

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Tabelle orders_status, warum kein AUTO_INCREMENT ?
    Antwort #13 am: 15. Oktober 2015, 19:47:53
    Also ich bin jetzt leicht verwirrt, u.a. weil auch diese Aussage aus dem mySQL-Manual nicht für unseren Fall zutreffend ist (eine andere zu dem Thema fand ich nicht):
    Zitat von: dev.mysql.com
    For MyISAM and BDB tables you can specify AUTO_INCREMENT on a secondary column in a multiple-column index. In this case, the generated value for the AUTO_INCREMENT column is calculated as MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. This is useful when you want to put data into ordered groups.

    Wir wollen ja einen kombinierten PRIMARY KEY auf orders_status_id und language_id und das AUTO_INCREMENT soll nicht "on a secondary column in a multiple-column index" gesetzt werden sondern auf die primary column, also orders_status_id.

    Nach meiner Meinung müsste bei dem kombinierten PRIMARY KEY und einem AUTO_INCREMENT auf orders_status_id bei einem INSERT, welches ja immer für alle Sprachen erfolgt, die orders_status_id nur einen hochgesetzt, für alle Sprachen folglich die gleiche orders_status_id vergeben werden.

    Jedenfalls spart das Resourcen.
    Ich kann's aber gerade nicht testen. Jemand ?

    Gruß,
    noRiddle

    *NACHTRAG*
    Hier wird übrigens auch auf die Unsicherheit hingewiesen wenn das AUTO_INCREMENT nicht auf die erste Spalte des kombinierten PRIMARY KEY gesetzt wird, was wir aber ja wollen, bzw., was ich vorgeschlagen habe.
    Zitat von: dev.mysql.com
    An INSERT into a table that has a composite primary key that includes an AUTO_INCREMENT column that is not the first column of this composite key is not safe for statement-based logging or replication. Beginning with MySQL 5.1.64, such statements are marked as unsafe.
    6 Antworten
    4281 Aufrufe
    22. Oktober 2011, 22:26:09 von GTB
    3 Antworten
    2888 Aufrufe
    05. Oktober 2010, 06:52:16 von Thomas
    18 Antworten
    12571 Aufrufe
    07. Januar 2013, 14:28:57 von Taboh
    6 Antworten
    4805 Aufrufe
    26. Februar 2010, 10:02:56 von baustelle
               
    anything