Marktplatz - Eine große Auswahl an neuen und hilfreichen Modulen sowie 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: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #30 am: 20. Januar 2023, 11:01:14
    Ich habe heute ein"interessantes" Experiment mit ChatGBT von openai gemacht. ChatGBT ist ja gerade in aller Munde.
    Ich habe den Codeabschnitt dort eingegeben und gefragt ob der PHP8.1 kompatibel ist:
    Als Antwort erhielt ich:
    Zitat
    In PHP 8.1 wurde die mysqli_connect() Funktion ersetzt durch mysqli_init() und mysqli_options() ,
    so muss man sicherstellen, dass die Verbindung zur Datenbank in der richtigen Weise hergestellt wird.

    Außerdem wurden mysqli_query(), mysqli_fetch_assoc() ersetzt durch mysqli::query() und mysqli_result::fetch_assoc()
    sollten geändert werden, um kompatibel mit PHP 8.1 zu sein.

    In summary this code should work fine in PHP 8.1 as it only uses standard PHP functions and the mysqli extension, but it's important to update the code to use the new functions provided by PHP 8.1

    Ich fragte ob CHATGPT mit einen Vorschlag dazu machen kann:
    Es kam:
    Code: PHP  [Auswählen]
    $mysqli = mysqli_init();
    mysqli_options($mysqli, MYSQLI_OPT_CONNECT_TIMEOUT, 5);
    $mysqli->real_connect($GLOBALS['sql_con']['host'], $GLOBALS['sql_con']['user'], $GLOBALS['sql_con']['password'], $GLOBALS['sql_con']['database']);

    $query = "SELECT group_concat(opa.attributes_model order by po.products_options_sortorder, po.products_options_id separator '') fullattributmodel
    FROM orders_products_attributes opa
    JOIN orders_products op ON op.orders_products_id = opa.orders_products_id
    JOIN products_options po on opa.orders_products_options_id = po.products_options_id
    where op.orders_products_id = "
    . $row['Positionsnummer']."
    and po.language_id = "
    .$GLOBALS['articles_language'];

    $qRes = $mysqli->query($query);
    if ($qRes) {
        $AttributRow = $qRes->fetch_assoc();
        $row['ArtikelnummerShop'] .= $AttributRow['fullattributmodel'];
    }
     
    und als Erklärung dazu:
    Zitat
    Als erstes wird die mysqli_init() Funktion verwendet, um eine neue mysqli-Instanz zu erstellen.
    Dann wird die mysqli_options() Funktion verwendet, um die Verbindungszeit auf 5 Sekunden festzulegen.
    Danach wird die real_connect() Methode verwendet, um eine Verbindung zur Datenbank herzustellen.

    In der Abfrage wurde nichts geändert.

    Die mysqli_query() Funktion wurde durch die query() Methode ersetzt und die mysqli_fetch_assoc() Funktion wurde durch die fetch_assoc() Methode ersetzt.

    Es ist wichtig, darauf zu achten, dass dieser Code nur ein Beispiel ist und es möglicherweise weitere Anpassungen erfordert, um in Ihrer Umgebung ordnungsgemäß ausgeführt zu werden.
    Ich habe dann konkret die PHP Error Meldung HP Fatal error:  Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'and po.language_id = 2'  eingegeben und erhierlt folgenden Vorschlag zur Behebung:
    Zitat
    Der Fehler kommt aus einem Syntaxfehler in Ihrer SQL-Abfrage.
    Nach dem Wort "order" fehlt ein "by" und dadurch kann die Abfrage nicht erfolgreich ausgeführt werden.
    Code: PHP  [Auswählen]
    $query = "SELECT group_concat(opa.attributes_model order by po.products_options_sortorder, po.products_options_id separator '') fullattributmodel
    sollte geändert werden in:
    Code: PHP  [Auswählen]
    $query = "SELECT group_concat(opa.attributes_model order by po.products_options_sortorder, po.products_options_id separator '') as fullattributmodel
    Zitat
    Das "as" keyword ist erforderlich, um das Ergebnis der group_concat() Funktion zu benennen.

    Eine weitere Empfehlung wäre es, die Abfrage vor der Ausführung zu überprüfen, um sicherzustellen, dass sie korrekt formatiert ist und dass alle benötigten Tabellen und Spalten vorhanden sind.
    Es ist auch empfehlenswert, die Verwendung von $GLOBALS zu vermeiden und die Variablen direkt als Argumente in die Funktionen übergeben.
    Der Vorschlag dazu lautete:
    Code: PHP  [Auswählen]
    $mysqli = new mysqli($host, $user, $password, $database);

    $query = "SELECT group_concat(opa.attributes_model order by po.products_options_sortorder, po.products_options_id separator '') as fullattributmodel
    FROM orders_products_attributes opa
    JOIN orders_products op ON op.orders_products_id = opa.orders_products_id
    JOIN products_options po on opa.orders_products_options_id = po.products_options_id
    where op.orders_products_id = "
    . $row['Positionsnummer']."
    and po.language_id = "
    .$articles_language;

    $qRes = $mysqli->query($query);
    if ($qRes) {
        $AttributRow = $qRes->fetch_assoc();
        $row['ArtikelnummerShop'] .= $AttributRow['fullattributmodel'];
    }
     

    Ich habe dann die php Warnings mit der entsprechenden Codestelle eingegeben:
    Code: PHP  [Auswählen]
    if ($qRes) {
      $row = mysqli_fetch_assoc($qRes);
      $row['customers_email_address'] = $qRow['abweichendRechnungEmail'];
    }
    und folgende Antwort bekommen:
    Zitat
    Ah, ich verstehe. Der Fehler liegt darin, dass das Skript versucht, auf eine nicht definierte Variable 'abweichendRechnungEmail' zuzugreifen. Diese Variable wird verwendet, um eine abweichende E-Mail-Adresse für die Rechnung zu speichern.

    Um diesen Fehler zu beheben, müssen Sie sicherstellen, dass die Variable 'abweichendRechnungEmail' vor Verwendung definiert und gültig ist.
    Ein möglicher Ansatz wäre, die Variable vor dem Ausführen des Codes zu definieren oder zu überprüfen, ob sie bereits definiert ist, bevor Sie versuchen, auf sie zuzugreifen.
    Code: PHP  [Auswählen]
    if ($qRes) {
      $row = mysqli_fetch_assoc($qRes);
      if(isset($qRow['abweichendRechnungEmail'])){
        $row['customers_email_address'] = $qRow['abweichendRechnungEmail'];
      }
    }
     
    oder Variante 2:
    Code: PHP  [Auswählen]
    if ($qRes) {
      $row = mysqli_fetch_assoc($qRes);
      $row['customers_email_address'] = $qRow['abweichendRechnungEmail'] ?? "";
    }

     
    Als Erklärung:
    Zitat
    Ja, die Codebeispiele, die ich zur Behebung des Fehlers bereitgestellt habe, sind kompatibel mit PHP 8.1.
    Beide Beispiele verwenden die Funktion isset() oder den Null Coalesce Operator (??) um zu überprüfen, ob die Variable 'abweichendRechnungEmail' definiert ist, bevor auf sie zugegriffen wird.

    Die Funktion isset() prüft, ob eine Variable definiert ist und ob sie einen Wert hat, und gibt true zurück, wenn dies der Fall ist und false, wenn die Variable nicht definiert ist.
    Der Null Coalesce Operator (??) prüft, ob die erste Variable, die übergeben wird, definiert und einen Wert hat, wenn ja, dann wird sie zurückgegeben, sonst wird die zweite Variable zurückgegeben.

    Beide Beispiele sorgen dafür, dass der Zugriff auf eine nicht definierte Variable vermieden wird und somit werden die Fehlermeldungen unterdrückt.

    Es ist jedoch wichtig, darauf zu achten, dass dieser Code nur ein Beispiel ist und es möglicherweise weitere Anpassungen erfordert, um in Ihrer Umgebung ordnungsgemäß ausgeführt zu werden.
    Ich finde das als Laie ziemlich beeindruckend. Was ist davon zu halten? Unsinn oder evt. eine Erleichterung auch für die Programmierung?
    Managed Server

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #31 am: 20. Januar 2023, 11:39:30
    Bzgl. mysqli ist die Antwort nicht fein genug. Es wird teilweise von objektorientierter Notation gesprochen (mysqli_init()), der Shop benutzt jedoch prozedurale Notierung.
    Ansonsten hätte das Programm ja auch, wenn es denn so viel kann, bei den Code-Vorschlägen nicht das mysqli_fetch_assoc()  beibehalten.

    Was den Rest betrifft hatten wir bereits angedeutet, daß es Variablen gibt von denen wir weder wissen, ob sie definiert sind, noch, wenn ja, welchen Wert sie haben.

    Den Beispielcode
    Code: PHP  [Auswählen]
    if ($qRes) {
      $row = mysqli_fetch_assoc($qRes);
      $row['customers_email_address'] = $qRow['abweichendRechnungEmail'];
    }

    würde ich vielleicht so schreiben
    Code: PHP  [Auswählen]
    if ($qRes) {
      $row = mysqli_fetch_assoc($qRes);
      $row['customers_email_address'] = $qRow['abweichendRechnungEmail'] ?? $row['customers_email_address'];
    }

    Variante 2 des Programms würde nämlich dazu führen, daß $row['customers_email_address']  leer sein würde wenn $qRow['abweichendRechnungEmail']  nicht gesetzt ist, was sicherlich nicht Sinn der Sache ist.
    Die erste vom Programm vorgeschlagene Variante würde gehen.

    Gruß,
    noRiddle

    Addendum off-topic:
    Mich beeindruckt solch eine Software übrigens nicht. Was man KI (oder engl. AI) nennt ist nichts weiter als eine große Bibliothek an Satzkonstrukten und Satzteilen, ähnlich wie ein Schachcomputer der alle bislang gespielten Partien und deren Ausgang gespeichert hat. Was ein Programm immer besser kann, besser gesagt schneller, ist das was der Name der Hardware, bereits insinuiert, nämlich rechnen. Mehr aber auch nicht.
    Ich halte die Lüge die in dem Begriff KI steckt für sehr teuflisch verführerisch und gottlos (wie so vieles auf dieser Welt).

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #32 am: 20. Januar 2023, 11:54:44
    :thx: für Deine Einschätzung!

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #33 am: 20. Januar 2023, 12:07:08
    Zu dem angebl. mysqli-Syntax-Fehler mit
    ...near 'and po.language_id = 2' at line 6 in /is/htdocs/shopverzeichnis/www/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php:227
    habe ich allerdings nach wie vor keine genaue Idee.

    Gruß,
    noRiddle
    15 Antworten
    10889 Aufrufe
    26. März 2013, 08:01:38 von schwadda100
    6 Antworten
    4363 Aufrufe
    21. Januar 2014, 17:24:03 von ShopNix
    19 Antworten
    13713 Aufrufe
    03. August 2015, 13:17:35 von toppi
               
    anything