rechtstexte für onlineshop
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 #15 am: 08. Januar 2023, 17:57:43
    Hallo,
    mit dem von noRiddle korrekt formatierten Codeblock läuft esmit php 8.1 bis zum nächsten Error:
     :-?
    Code: PHP  [Auswählen]
    [Sun Jan 08 17:27:15 2023]  PHP 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' at line 6 in /shopverzeichnis/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php:228\nStack trace:\n#0 /shopverzeichnis/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php(228): mysqli_query(Object(mysqli), 'SELECT group_co...')\n#1 /shopverzeichnis/Shop2.0.7.2/meinbuero1/inc/functions.php(241): row_ueberpruefen(Array)\n#2 /shopverzeichnis/Shop2.0.7.2/meinbuero1/mb_osc.php(53): PositionEintragen(Array, '[?xml version="...')\n#3 {main}\n  thrown in /shopverzeichnis/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php on line 228

    Der entsprechende Codeblock der xtcommerce.php:
    Code: PHP  [Auswählen]
    #Artikelnummern (Attribute)
            $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($GLOBALS['sql_con'], $query);
            if ($qRes)
            {
                    $AttributRow = mysqli_fetch_assoc($qRes);
                    $row['ArtikelnummerShop'] .= $AttributRow['fullattributmodel'];
                    }
    Und des gibt auch noch etliche Warnings
    PHP Warning:  Undefined array key "abweichendRechnungEmail"
    PHP Warning:  Undefined array key "PersonAnrede" und weitere mehr.
    In der Datei sieht das so aus:
    Code: PHP  [Auswählen]
    if ($qRes) {
      $row = mysqli_fetch_assoc($qRes);
      $row['customers_email_address'] = $qRow['abweichendRechnungEmail'];
    }
            # Anrede ergänzen:
            if (($row["PersonAnrede"]=="") and (strtolower($row["PersonGeschlecht"])=="m") or ((($row["PersonGeschlecht"])=="H")))
            {
                    $row["PersonAnrede"] = "Herr";
            }// Wenn keine Anrede hinterlegt ist und das Geschlecht männlich
            elseif (($row["PersonAnrede"]=="") and ((strtolower($row["PersonGeschlecht"])=="w") or ((strtolower($row["PersonGeschlecht"])=="f"))))
            {
                    $row["PersonAnrede"] = "Frau";
            }// Wenn keine Anrede hinterlegt ist und das Geschlecht weiblich
    Hierzu fiel mir noch ein, daß es wichtig ist woher die Werte des Arrays $row  kommen, denn sie müssen ggfls. gegen SQL-Injection abgesichert werden, was sie nach dem kleinen Code-Ausschnitt zu urteilen nicht sind.

    Gruß,
    noRiddle
    Ich füge mal die gesamte xtcommerce.php an, weil ich das leider nicht beantworten kann.
    Code: PHP  [Auswählen]
    <?PHP
    /***************************************************************************\
    *
    *       Copyright (c) 2013 deltra Business Software GmbH & Co. KG
    *       http://www.deltra.de
    *
    \***************************************************************************/

    error_reporting(E_ALL);
    $GLOBALS['VERSION_SCF'] = "4.0.00";

    function daten_holen()
    {
            #Querytyp:

            // datakind == 1 => Daten werden als Query verarbeitet
            // datakind == 2 => Daten werden als Array verarbeitet

            $GLOBALS['datakind'] = "1";

            #SQL Query f�r Gambio

            $GLOBALS['query'] ="SELECT
                      orders.orders_id as orderID,
                      orders.orders_id as BestellnummerShop,
                      orders.date_purchased as Bestelldatum,
                      orders.date_purchased as ZusatzfeldKunde3,
                      orders.shipping_class as Lieferart,
                      orders.payment_class as Zahlungsart,
                      orders_total.value as FrachtkostenNetto,
                      orders_total.class as ZuschlagkostenBrutto2,
                      orders.comments as AnmerkungenBestellung,
                      orders.customers_id as KundennummerWebshop,
                      orders.customers_company as Firmenname,
                      orders.customers_lastname as PersonNachname,
                      orders.customers_firstname as PersonVorname,
                      orders.customers_street_address as Strasse,
                      orders.customers_postcode as Postleitzahl,
                      orders.customers_city as Ort,
                      orders.customers_suburb as ZusatzfeldBestellung5,
                      orders.delivery_suburb as ZusatzfeldKunde1,
                      orders.billing_suburb as ZusatzfeldKunde2,
                      orders.customers_country as Land,
                      orders.customers_email_address as Email,
                      orders.customers_telephone as abweichendRechnungEmail,
                      orders.customers_vat_id as Umsatzsteueridentnummer,
                      banktransfer.banktransfer_owner as BankkontoInhaber,
                      banktransfer.banktransfer_number as Bankkontonummer,
                      banktransfer.banktransfer_blz as BankkontoBLZ,
                      banktransfer.banktransfer_iban as BankkontoIBAN,
                      banktransfer.banktransfer_bic as BankkontoBIC,
                      banktransfer.banktransfer_bankname as BankkontoBankName,
                      orders.delivery_company as abweichendLieferungFirmenname,
                      orders.delivery_lastname as abweichendLieferungPersNachname,
                      orders.delivery_firstname as abweichendLieferungPersVorname,
                      orders.delivery_street_address as abweichendLieferungStrasse,
                      orders.delivery_postcode as abweichendLieferungPostleitzahl,
                      orders.delivery_city as abweichendLieferungOrt,
                      orders.delivery_country_iso_code_2 as abweichendLieferungLaendercode,
                      orders.delivery_country as abweichendLieferungLand,
                      orders.billing_company as abweichendRechnungFirmenname,
                      orders.billing_lastname as abweichendRechnungPersNachname,
                      orders.billing_firstname as abweichendRechnungPersVorname,
                      orders.billing_street_address as abweichendRechnungStrasse,
                      orders.billing_postcode as abweichendRechnungPostleitzahl,
                      orders.billing_city as abweichendRechnungOrt,
                      orders.billing_country_iso_code_2 as abweichendRechnungLaendercode,
                      orders.billing_country as abweichendRechnungLand,
                      orders_products.orders_products_id as Positionsnummer,
                      orders_products.products_model as ArtikelnummerShop,
                      orders_products.products_quantity as Menge,
                      orders_products.products_price as abweichenderEinzelpreisNetto,
                      orders_products.products_tax as abweichendeMwStProzent,
                      orders_products.allow_tax as MwStFaellig,
                      orders_products_attributes.orders_products_attributes_id as SortierungOptionen,
              orders_products_attributes.attributes_model as Optionsnummer,
                      orders_products_attributes.products_options as ZusatzfeldPosition1,            
                      orders_products_attributes.products_options_values as ZusatzfeldPosition2,
                      orders_products_attributes.products_options as xProduktOption,
                      orders_products_attributes.products_options_values as xProduktOptionsWert,
                      orders_products.products_id as xProduktId,
                      paypal_instructions.date as ZusatzfeldKunde4,  
                      paypal_instructions.holder as ZusatzfeldKunde5,
                      paypal_instructions.name as ZusatzfeldBestellung1,
                      paypal_instructions.iban as ZusatzfeldBestellung2,
                      paypal_instructions.bic as ZusatzfeldBestellung3,
                      paypal_instructions.reference as ZusatzfeldBestellung4,
                      products_name as abweichenderArtikeltext               
                    FROM orders
                     INNER JOIN
                      orders_products ON (orders.`orders_id` = `orders_products`.`orders_id`)
                     LEFT OUTER JOIN
                      orders_products_attributes ON (`orders_products`.`orders_products_id` = orders_products_attributes.orders_products_id)
                     LEFT OUTER JOIN
                      orders_total ON (orders.`orders_id` = `orders_total`.`orders_id` AND orders_total.class = 'ot_shipping')
                     LEFT OUTER JOIN
                      banktransfer ON (orders.`orders_id` = `banktransfer`.`orders_id`)
                     LEFT OUTER JOIN
                      paypal_instructions ON (orders.`orders_id` = `paypal_instructions`.`orders_id`)
                    WHERE
                      orders_status = '"
    .$GLOBALS["DEFAULT_ORDERS_STATUS"]."'
                     ORDER BY orderID, Positionsnummer, SortierungOptionen
                     "
    ;
            return $GLOBALS['datakind'];
    }

    function row_ueberpruefen($row)
    {
            # Anschrift &auml;berarbeiten
            #$row['Firmenname'] = htmlspecialchars($row['Firmenname']);
            $row['Firmenname'] = mb_convert_encoding($row['Firmenname'], "HTML-ENTITIES", "UTF-8");#Test & Zeichen
            $row['PersonNachname'] = htmlspecialchars($row['PersonNachname'])." ".($row['ZusatzfeldBestellung5']);
            $row['PersonVorname'] = htmlspecialchars($row['PersonVorname']);
            $row['Strasse'] = htmlspecialchars($row['Strasse']);
            $row['Ort'] = htmlspecialchars($row['Ort']);
            $row['Land'] = htmlspecialchars($row['Land']);
            $row['Email'] = htmlspecialchars($row['Email']);
            $row['ArtikelnummerShop'] = htmlspecialchars($row['ArtikelnummerShop']);
            $row['AnmerkungenBestellung'] = htmlspecialchars($row['AnmerkungenBestellung']);
           
            # abeichende Rechnungsadresse
            $row['abweichendRechnungFirmenname'] = htmlspecialchars($row['abweichendRechnungFirmenname']);
            $row['abweichendRechnungPersNachname'] = htmlspecialchars($row['abweichendRechnungPersNachname'])." ".($row['ZusatzfeldKunde2']);
            $row['abweichendRechnungPersVorname'] = htmlspecialchars($row['abweichendRechnungPersVorname']);
            $row['abweichendRechnungStrasse'] = htmlspecialchars($row['abweichendRechnungStrasse']);
            $row['abweichendRechnungOrt'] = htmlspecialchars($row['abweichendRechnungOrt']);
            $row['abweichendRechnungLand'] = htmlspecialchars($row['abweichendRechnungLand']);
           
            # abweichende Lieferadresse
            $row['abweichendLieferungFirmenname'] = htmlspecialchars($row['abweichendLieferungFirmenname']);
            $row['abweichendLieferungPersNachname'] = htmlspecialchars($row['abweichendLieferungPersNachname'])." ".($row['ZusatzfeldKunde1']);
            $row['abweichendLieferungPersVorname'] = htmlspecialchars($row['abweichendLieferungPersVorname']);
            $row['abweichendLieferungStrasse'] = htmlspecialchars($row['abweichendLieferungStrasse']);
            $row['abweichendLieferungOrt'] = htmlspecialchars($row['abweichendLieferungOrt']);
            $row['abweichendLieferungLand'] = htmlspecialchars($row['abweichendLieferungLand']);
           
            # veraendert das Datum in Tag Monat Jahr im Bestelldatum und PayPal Plus Rechnung
            $row['Bestelldatum'] = date('d.m.Y', strtotime($row['Bestelldatum']));
            $row['ZusatzfeldKunde3'] = date('d.m.Y', strtotime($row['ZusatzfeldKunde3']));
            #$row['ZusatzfeldKunde3'] = date('d.m.Y G:i:s', strtotime($row['ZusatzfeldKunde3'])); mit Uhrzeit
            #$row['ZusatzfeldKunde4'] = date('d.m.Y', strtotime($row['ZusatzfeldKunde4']));
            if ((strtolower($row['ZusatzfeldKunde4'])> 0))$row['ZusatzfeldKunde4'] = date('d.m.Y', strtotime($row['ZusatzfeldKunde4']));
           
           
            # Geschlecht ermitteln

            $query = "Select customers_gender AS Geschlecht ";
            $query .= "FROM orders ";
            $query .= "WHERE customers_id = ".$row['KundennummerWebshop']."";
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);

            if ($qRes)
            {
                    $qRow = mysqli_fetch_assoc($qRes);
                    $row['PersonGeschlecht'] = $qRow['Geschlecht'];
            }// Das Geschlecht-Ermittlungsquery wurde erfolgreich ausgef�hrt


     
    $query = "SELECT IFNULL(customers_email_address, customers_telephone)";
    $query .= " FROM orders";
    $query .= " WHERE customers_id = ".$row['KundennummerWebshop'];
    $qRes = mysqli_query($GLOBALS['sql_con'], $query);
    if ($qRes) {
      $row = mysqli_fetch_assoc($qRes);
      $row['customers_email_address'] = $qRow['abweichendRechnungEmail'];
    }
            # Anrede erg�nzen:
            if (($row["PersonAnrede"]=="") and (strtolower($row["PersonGeschlecht"])=="m") or ((($row["PersonGeschlecht"])=="H")))
            {
                    $row["PersonAnrede"] = "Herr";
            }// Wenn keine Anrede hinterlegt ist und das Geschlecht m�nnlich
            elseif (($row["PersonAnrede"]=="") and ((strtolower($row["PersonGeschlecht"])=="w") or ((strtolower($row["PersonGeschlecht"])=="f"))))
            {
                    $row["PersonAnrede"] = "Frau";
            }// Wenn keine Anrede hinterlegt ist und das Geschlecht weiblich

            elseif (($row["PersonAnrede"]=="") and ((strtolower($row["PersonGeschlecht"])=="i") ))
            {
                    $row["PersonAnrede"] = "An";
            } // Inter
            # Anrede Rechnungsadresse=Hauptadresse erg&auml;nzen:
            if (($row["abweichendRechnungPersAnrede"]=="") and (strtolower($row["PersonGeschlecht"])=="m")or ((($row["PersonGeschlecht"])=="H")))
            {
                    $row["abweichendRechnungPersAnrede"] = "Herr";
            }// Wenn keine Anrede hinterlegt ist und das Geschlecht m&auml;nnlich
            elseif (($row["abweichendRechnungPersAnrede"]=="") and ((strtolower($row["PersonGeschlecht"])=="w") or ((strtolower($row["PersonGeschlecht"])=="f"))))
            {
                    $row["abweichendRechnungPersAnrede"] = "Frau";
            }// Wenn keine Anrede hinterlegt ist und das Geschlecht weiblich
            elseif (($row["PersonAnrede"]=="") and ((strtolower($row["PersonGeschlecht"])=="i") ))
            {
                    $row["PersonAnrede"] = "An";
            } // Inter
            # Laender korrigieren...

            // ... Adresse
            if ((strtolower($row["Land"]) == "germany")) {$row["Land"] = "Deutschland";}
            if ((strtolower($row["Land"]) == "austria")) {$row["Land"] = "Österreich";}
            if ((strtolower($row["Land"]) == "switzerland")){$row["Land"] = "Schweiz";}

            // ... Lieferadresse
            if ((strtolower($row["abweichendLieferungLand"]) == "germany")) {$row["abweichendLieferungLand"] = "Deutschland";}
            if ((strtolower($row["abweichendLieferungLand"]) == "austria")) {$row["abweichendLieferungLand"] = "Österreich";}
            if ((strtolower($row["abweichendLieferungLand"]) == "switzerland")) {$row["abweichendLieferungLand"] = "Schweiz";}

            // ... Rechnungsadresse
            if ((strtolower($row["abweichendRechnungLand"]) == "germany")) {$row["abweichendRechnungLand"] = "Deutschland";}
            if ((strtolower($row["abweichendRechnungLand"]) == "austria")) {$row["abweichendRechnungLand"] = "Österreich";}
            if ((strtolower($row["abweichendRechnungLand"]) == "switzerland")) {$row["abweichendRechnungLand"] = "Schweiz";}
           
            // ... ISO L�nderk�rzel in orgaMAX Format �bersetzen
            $row['Laendercode'] = LaenderkuerzelISO2OMX($row['Laendercode']);      
            $row['abweichendRechnungLaendercode'] = LaenderkuerzelISO2OMX($row['abweichendRechnungLaendercode']);
            $row['abweichendLieferungLaendercode'] = LaenderkuerzelISO2OMX($row['abweichendLieferungLaendercode']);



           
            #Artikelnummern (Attribute)
            $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($GLOBALS['sql_con'], $query);
            if ($qRes)
            {
                    $AttributRow = mysqli_fetch_assoc($qRes);
                    $row['ArtikelnummerShop'] .= $AttributRow['fullattributmodel'];
                    }

            # Nachnamegeb�hren ermitteln
            if (strtolower($row['Zahlungsart']) == 'cod')
            {
                    $query = "SELECT value ";
                    $query .= "FROM orders_total ";
                    $query .= "WHERE (orders_id=" . $row['orderID'] . ") and (class='ot_cod_fee')";
                    $qRes = mysqli_query($GLOBALS['sql_con'], $query);
                    if ($qRes)
                    {
                            $qRow = mysqli_fetch_assoc($qRes);
                            $row['ZuschlagkostenBrutto1'] = $qRow['value'];
                    } // Das Nachnahmegeb�r ermittlungsquery wurde erfolgreich ausgef�hrt
            } // Es ist ein Nachname Zahlung

            # Zahlungsart "�bersetzen"
            if ($row["Zahlungsart"])
            /*{
                    // MR: 28.09.2012
                    // Anpassung der Zahlungsart direkt ins Array geschrieben, da vorherige Implementierung einen fehlerhaften String zur�ck gab.
            $zahlungsart = 'ORGAMAX_OS_ZAHLUNGSART_' . strtoupper($row['Zahlungsart']);
                    $row['Zahlungsart'] = DeltraResources::getText($zahlungsart);
            }*/
    //auskommentiert und die folgenden Zeilen aus dem 2.02 genommen HU 2.10.2019
            {
            $Umbenennungsbefehl = '$row["Zahlungsart"] = ORGAMAX_OS_ZAHLUNGSART_' . strtoupper($row['Zahlungsart']) . ';';

            eval($Umbenennungsbefehl);
            }

           
            # Frachtkosteneinstellungen
            $shipping_class = explode('_', $row['Lieferart']);
            $row['Lieferart'] = $shipping_class[0];
            $row['FrachtkostenBrutto'] = '';

            # Frachtkosten bestimmen
            $query = "Select configuration.configuration_value, ";
            $query .= "tax_rates.tax_rate as FrachtkostenMwStProzent ";
            $query .= "FROM configuration ";
            $query .= "INNER JOIN tax_rates ON (configuration.configuration_value = tax_rates.tax_rates_id) ";
            $query .= "WHERE configuration_key = 'MODULE_SHIPPING_".strtoupper($row['Lieferart'])."_TAX_CLASS'";
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);

            if ($qRes)
            {
                    $qRow = mysqli_fetch_assoc($qRes);
                    $row['FrachtkostenMwStProzent'] = $qRow['FrachtkostenMwStProzent'];
            }// MwSt.-Ermittlungsquery wurde erfolgreich ausgef�hrt
           
            if ($row['FrachtkostenMwStProzent'] == NULL)
            {
                    $row['FrachtkostenMwStProzent'] = '0.00';
            }
           
            # Preisartbestimmung:
            if ($row['MwStFaellig'])
            {
                    $row['FrachtkostenBrutto'] = $row['FrachtkostenNetto'];
                    $row['abweichenderEinzelpreisBrutto'] = $row['abweichenderEinzelpreisNetto'];
                    // Netto Kosten leer setzen, damit erkannt wird dass es ein Brutto Vorgang ist
                    $row['FrachtkostenNetto'] = '';
                    $row['abweichenderEinzelpreisNetto'] = '';
            } // Wenn eine UStId vergeben ist, �bergibt xtcommerce Nettopreise statt wie sonst �blich Bruttopreise
            else
            {
                    // $row['abweichenderEinzelpreisBrutto'] = $row["abweichenderEinzelpreisNetto"] * ( 1 + ($row['abweichendeMwStProzent'] / 100));
                    // $row['FrachtkostenBrutto'] = $row['FrachtkostenNetto'] * (1 + ($row['FrachtkostenMwStProzent'] / 100));
                    $row['abweichenderEinzelpreisBrutto'] = '';
                    $row['FrachtkostenBrutto'] = '';
            }
           
            // MR: 28.09.2012
            // Anpassung der Lieferart direkt ins Array geschrieben, da vorherige Implementierung einen fehlerhaften String zur�ck gab.
            $lieferart = 'ORGAMAX_OS_LIEFERART_' . strtoupper($row['Lieferart']);
            $row["Lieferart"] = DeltraResources::getText($lieferart);
           
            # Pr�fen ob Bestellung MwSt frei ist
            $query =  "SELECT orders_total_id ";
            $query .= "FROM orders_total ";
            $query .= "WHERE class = 'ot_tax' AND orders_id = ".$row["BestellnummerShop"]."";
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);
           
            if(mysqli_num_rows($qRes) == false)
            {
                    $row['abweichendeMwStProzent'] = '0.00';
            }
           
            # MwStProzent
            if ($row['abweichendeMwStProzent'] == '')
            {
                    $row['abweichendeMwStProzent'] = '0.00';
            }
    # Rabatt auf Zahlungsarten
    if (strtolower($row['Lieferart']) == 'free' or 'dp')
       
            {
                    $query = "SELECT value ";
                    $query .= "FROM orders_total ";
                    $query .= "WHERE (orders_id=" . $row['orderID'] . ") and (class='ot_payment')";
                    $qRes = mysqli_query($GLOBALS['sql_con'], $query);
                    if ($qRes)
                    {
                            $qRow = mysqli_fetch_assoc($qRes);
                            $row['ZuschlagkostenBrutto3'] = $qRow['value']*1;
            }} // Es sind Rabatte vorhanden
    # Gutscheine

            $value = explode('_', $row['ZuschlagkostenBrutto2']);
            $row['ZuschlagkostenBrutto2'] = $value[0];

           
            if ($row['ZuschlagkostenBrutto2'])
            {
                    $query = "SELECT value ";
                    $query .= "FROM orders_total ";
                    $query .= "WHERE (orders_id=" . $row['orderID'] . ") and (class='ot_gv')";
                    $qRes = mysqli_query($GLOBALS['sql_con'], $query);
                    if ($qRes)
                    {
                            $qRow = mysqli_fetch_assoc($qRes);
                            $row['ZuschlagkostenBrutto2'] = $qRow['value']*1;
            }} // Es sind Gutscheine vorhanden
            # Wie soll Artikelnummer aus dem Shop behandelt werden:
            if ($GLOBALS["artno_handling"] == 1)
            {
                    $row["Artikelnummer"] = $row["ArtikelnummerShop"];//Attributnummer und Artikelnummer zusammengefügt ."".strlen($row["Var_ArtikelnummerWebshop"])
                   
            }// Wenn die Artikelnummer im Webshop gleich der Artikelnummer in orgaMAX sein soll
           
            return $row;
    }

    function artikeldaten_orgamax_zu_shop()
    {
            $articleFile = file_get_contents('php://input');
            if($articleFile != null && strlen($articleFile) > 0) {
           
                    $articles = simplexml_load_string(($articleFile));
                   
                    $amount_successfully_created = 0;
                    $amount_articles = count($articles);
                   
                    foreach($articles as $article)
                    {
                            $Preis = 0.0;
                            $Gewicht = 0.0;
                            $articleNr =  strval($article->ArtikelnummerWebshop);
                           
                            // Artikelpreis formatieren
                            if($article->ArtikelpreisNetto != 'DSC_IGNORE')
                            {
                                    $Preis = str_replace(',','.',$article->ArtikelpreisNetto);
                            }
                            else
                            {
                                    $Preis = str_replace(',','.',$article->ArtikelpreisBrutto);
                            }
                           
                            //Artikelgewicht formatieren
                            if(!is_null($article->Gewicht))
                            {
                                    $Gewicht = str_replace(',','.',$article->Gewicht);
                            }
                           
                            //Pr�fen ob der Artikel vorhanden ist
                            $selectQuery = "SELECT products_id FROM products WHERE products_model = '".$articleNr."'";
                           
                            $res = mysqli_query($GLOBALS['sql_con'], $selectQuery);
                            $amount = mysqli_num_rows($res);
                            $value = 0;
                            if($amount > 0)
                            {
                                    $value = mysqli_result($res);
                            }
                           
                            // MwStCode aus MwStValue ermitteln
                            $query = "SELECT tax_class_id FROM tax_rates WHERE tax_rate = ".$article->MwStValue;
                            $result = mysqli_query($GLOBALS['sql_con'], $query);
                            if(mysqli_num_rows($result) > 0)
                            {
                                    $article->MwStCode = ($article->MwStValue != 0) ? mysqli_result($result) : 0;
                            }
                           
                            $Artikelbeschreibung = strval($article->Artikelbeschreibung);
                            $Anmerkungen = strval($article->Anmerkungen);

                            //Artikel nicht gefunden, neu anlegen
                            if($value == 0)
                            {
                                    $query  = "INSERT INTO products(products_model, products_tax_class_id, products_weight, products_price) ";
                                    $query .= "VALUES('".$articleNr."',".intval($article->MwStCode).",'".$Gewicht."','".$Preis."')";
                                   
                                    $result = mysqli_query($GLOBALS['sql_con'], $query);
                                    if (!$result) continue;
                                   
                                    $selectQuery = "SELECT products_id FROM products WHERE products_model = '".$articleNr."'";
                           
                                    $res = mysqli_query($GLOBALS['sql_con'], $selectQuery);
                                   
                                    $value = mysqli_result($res);

                    // Category ID ermitteln
                    // TODO: Prüfen
                    $categoryID = 0;
                    $query = "SELECT MIN(categories_id) FROM categories";
                    $result = mysqli_query($GLOBALS['sql_con'], $query);
                    $categoryID = mysqli_result($result);

                                    $query  = "INSERT INTO products_to_categories(products_id, categories_id) ";
                                    $query .= "VALUES(".intval($value).", ".$categoryID.")";
                                   
                                    mysqli_query($GLOBALS['sql_con'], $query);
                                   
                                    $descQuery = "INSERT INTO products_description(products_id, products_name, products_description, language_id, products_meta_title, products_meta_description, products_meta_keywords) ";
                                    $descQuery .= "VALUES(".intval($value).", '".$Artikelbeschreibung."', '".$Anmerkungen."', ".$GLOBALS['articles_language'].", '', '' ,'')";
                                   
                                    $result = mysqli_query($GLOBALS['sql_con'], $descQuery);
                                    if (!$result) continue;

                                    $amount_successfully_created++;
                            }
                            //Artikel vorhanden aktualisieren
                            else
                            {
                                    $query  = "UPDATE products SET products_model = '".$articleNr."', products_tax_class_id = ".intval($article->MwStCode).", ";
                                    $query .= "products_weight = '".$Gewicht."', products_price = '".$Preis."' WHERE products_id = ".$value."";
                                   
                                    mysqli_query($GLOBALS['sql_con'], $query);
                                   
                                    $descQuery      = "UPDATE products_description SET products_name = '".$Artikelbeschreibung."', products_description = '".$Anmerkungen."'";
                                    $descQuery .= " WHERE products_id = ".$value."";
                                   
                                    $result = mysqli_query($GLOBALS['sql_con'], $descQuery);
                                   
                                    if($result)
                                    {
                                            $amount_successfully_created++;
                                    }
                            }
                    }
                   
                    WriteXMLResult($amount_articles,$amount_successfully_created);
            }
           
    }

    function setze_lagerbestand_im_shop()
    {
            $articleFile = file_get_contents('php://input');
            $amount_successfully_created = 0;
            $amount_articles = 0;
            if($articleFile != null && strlen($articleFile) > 0) {
                   
                    $articles = simplexml_load_string(($articleFile));
                   
                    $amount_articles = count($articles);
                   
                    foreach($articles as $article)
                    {
                            $articleNr =  $article->ArtikelnummerWebshop;
                            $query  = "UPDATE products SET products_quantity = '".str_replace(',','.',$article->LagerBestandAktuell)."'";
                            $query .= " WHERE products_model = '".$articleNr."'";
                           
                            $result = mysqli_query($GLOBALS['sql_con'], $query);
                           
                            if($result)
                            {
                                    $amount_successfully_created++;
                            }
                    }
                   
                   
            }
            WriteXMLResult($amount_articles,$amount_successfully_created);
            //Hier k�nnen Sie den Bestellstatusexport vom ERP zum Shop definieren
    }

    function pruefeOffeneBestellungenImShop()
    {
            $query = "SELECT orders.orders_id FROM orders, orders_total WHERE orders_status = '".$GLOBALS["DEFAULT_ORDERS_STATUS"]."'";
           
            $result = mysqli_query($GLOBALS['sql_con'], $query);
           
            if($result)
            {
                    if(mysqli_num_rows($result) > 0)
                    {
                            $value = mysqli_result($result);
                            if($value > 0)
                            {
                                    echo 1;
                            }
                            else
                            {
                                    echo 0;
                            }
                    }
                    else
                    {
                            echo 0;
                    }
            }
            else
            {
                    echo 0;
            }
    }

    function hole_Artikelliste_fuer_export()
    {
            $selectQuery =
                    "SELECT ".
                            "products_model, ".
                            "products_name ".
                    "FROM products ".
                    "INNER JOIN products_description ".
                            "ON (products.products_id = products_description.products_id AND products_description.language_id = ".
                            $GLOBALS['articles_language'].")";
           
            /** XML-Dokument erzeugen */
            $dom = new DomDocument('1.0');
            $dom->xmlStandalone = true;
            $dom->encoding="utf-8";
           
        $domArticles = $dom->appendChild($dom->createElement('ArtikelListeWebshop'));
            $result = mysqli_query($GLOBALS['sql_con'], $selectQuery);
           
            if(mysqli_num_rows($result) > 0)
            {
                    while($article = mysqli_fetch_assoc($result))
                    {
                            $domArticle = $domArticles->appendChild($dom->createElement('row'));
                            Add_NewDocElement($dom, $domArticle, 'ArtikelnummerWebshop', $article["products_model"]);
                            Add_NewDocElement($dom, $domArticle, 'Artikelbeschreibung', $article["products_name"]);
                    }
            }
           
             $dom->formatOutput = true;
             //zur�ck geben
         echo $dom->saveXML();
    }

    function setze_Artikelpreise_im_shop()
    {
            $articleFile = file_get_contents('php://input');
            if($articleFile != null && strlen($articleFile) > 0) {
           
                    $articles = simplexml_load_string(($articleFile));
                   
                    $amount_successfully_created = 0;
                    $amount_articles = count($articles);
                   
                    foreach($articles as $article)
                    {
                            $Preis = 0.0;
                            $articleNr =  $article->ArtikelnummerWebshop;
                            if($article->ArtikelpreisNetto != 'DSC_IGNORE')
                            {
                                    $Preis = str_replace(',','.',$article->ArtikelpreisNetto);
                            }
                            else
                            {
                                    $Preis = str_replace(',','.',$article->ArtikelpreisBrutto);
                            }
                            if($article->ArtikelPreisBeziehtSichAufMenge == 1)
                            {
                                    $updateQuery = "UPDATE products SET products_price = '".$Preis."' WHERE products_model = '".$articleNr."'";
                                   
                                    $result = mysqli_query($GLOBALS['sql_con'], $updateQuery);
                                   
                                    if($result > 0)
                                    {
                                            $amount_successfully_created++;
                                    }
                            }
                    }
                    WriteXMLResult($amount_articles,$amount_successfully_created);
            }
            //Funktion wird von veyton nicht unters�tzt (Staffelpreis)
    }

    function artikeldaten_shop_zu_orgamax()
    {
            #Querytyp:

            // datakind == 1 => Daten werden als Query verarbeitet
            // datakind == 2 => Daten werden als Array verarbeitet
           
            $GLOBALS['datakind'] = "1";

            #SQL Query f�r xt:Commerce Artikel

            if ($GLOBALS['attributes_import'])
            {
                    $GLOBALS['query'] = "
                    SELECT
                            products.products_id as productID,
                            products.products_model as ArtikelnummerWebshop,
                            products_description.products_name as Artikelbeschreibung,
                            products_description.products_description as Anmerkungen,
                            products.products_tax_class_id as MwStCode,
                            products.products_weight as Gewicht,
                            products.products_price as ArtikelpreisNetto,
                            products_vpe.products_vpe_name as Einheit,
                            products_attributes.attributes_model AS Var_ArtikelnummerWebshop,
                            products_attributes.price_prefix AS Var_Preis_Praefix,
                            products_attributes.options_values_price AS Var_Preis,
                            products_attributes.weight_prefix AS Var_Gewicht_Praefix,
                            products_attributes.options_values_weight AS Var_Gewicht,
                            products_options.products_options_name AS Var_Wert_Name,
                            products_options_values.products_options_values_name AS Var_Wert                               
                    FROM products
                    INNER JOIN
                            products_description ON (products.products_id = products_description.products_id AND products_description.language_id = "
    .$GLOBALS['articles_language'].")
                    LEFT OUTER JOIN
                            products_vpe ON (products.products_vpe = products_vpe.products_vpe_id AND products_vpe.language_id = "
    .$GLOBALS['articles_language'].")
                    LEFT OUTER JOIN
                            products_attributes ON (products.products_id = products_attributes.products_id)
                    LEFT OUTER JOIN
                            products_options ON (products_attributes.options_id = products_options.products_options_id AND products_options.language_id = "
    .$GLOBALS['articles_language'].")
                    LEFT OUTER JOIN
                            products_options_values ON (products_attributes.options_values_id = products_options_values.products_options_values_id AND products_options_values.language_id = "
    .$GLOBALS['articles_language'].")
                    ORDER BY
                            products.products_id"
    ;
            } // Wenn Varianten als Artikel importiert werden sollen
            else
            {
                    $GLOBALS['query'] = "
                    SELECT
                            products.products_id as productID,
                            products.products_model as ArtikelnummerWebshop,
                            products_description.products_name as Artikelbeschreibung,
                            products_description.products_description as Anmerkungen,
                            products.products_tax_class_id as MwStCode,
                            products.products_weight as Gewicht,
                            products.products_price as ArtikelpreisNetto,
                            products_vpe.products_vpe_name as Einheit      
                    FROM products
                    INNER JOIN
                            products_description ON (products.products_id = products_description.products_id AND products_description.language_id = "
    .$GLOBALS['articles_language'].")
                    LEFT OUTER JOIN
                            products_vpe ON (products.products_vpe = products_vpe.products_vpe_id AND products_vpe.language_id = "
    .$GLOBALS['articles_language'].")
                    ORDER BY
                            products.products_id"
    ;
            } // Wenn keine Attribute importiert werden sollen
           
            return $GLOBALS['datakind'];
           
    }// artikeldaten_shop_zu_orgamax

    function artRow_ueberpruefen($artRow)
    {
            # Artikeltexte kodieren
            $artRow['Artikelbeschreibung'] = strip_tags($artRow['Artikelbeschreibung']);
            $artRow['Anmerkungen'] = html_entity_decode($artRow['Anmerkungen'], ENT_QUOTES, 'utf-8');
           
            # MwSt richtig formatieren
            $artRow['MwStCode'] = (string)(double)$artRow['MwStCode'];
            $artRow['MwStValue'] = null; // todo: Steuerrate ermitteln
           
            # Artikelkategorie ermitteln
            $query = "SELECT categories_description.categories_name as Artikelkategorie ";
            $query .= "FROM products_to_categories ";
            $query .= "INNER JOIN categories_description ON (products_to_categories.categories_id = categories_description.categories_id AND categories_description.language_id = ".$GLOBALS['articles_language'].") ";
            $query .= "WHERE products_to_categories.products_id='".$artRow["productID"]."' AND products_to_categories.categories_id<>'0'";
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);
           
            if ($qRes)
            {
                    while ($qRow = mysqli_fetch_assoc($qRes))
                    {
                            $artRow["Artikelkategorie"] .= $qRow["Artikelkategorie"] . ";";
                    } // Alle gefundenen Artikelkategorien durchgehen
                    $artRow["Artikelkategorie"] = substr($artRow["Artikelkategorie"],0,strlen($artRow["Artikelkategorie"])-1);
            } // Wenn eine Artikelkategorie gefunden wurde
           
            # Artikelattribute ber�cksichtigen
           
            if ($GLOBALS['attributes_import'])
            {
                    # Spalten umformen:
                   
                    if ($artRow["Var_ArtikelnummerWebshop"] <> "")
                    {
                            $artRow["ArtikelnummerWebshop"] .= htmlspecialchars($artRow["Var_ArtikelnummerWebshop"]);
                    }// Artikelnummer nur ab�ndern, wenn auch Attributs�nderungen vorhanden sind
                    if ($artRow["Var_Wert"] <> "")
                    {
                            $artRow["Artikelbeschreibung"] .= htmlspecialchars(" - " . $artRow["Var_Wert_Name"] . ": " . $artRow["Var_Wert"]);
                    }// Artikelbeschreibung nur ab�ndern, wenn auch Attributs�nderungen vorhanden sind
                    if ($artRow["Var_Gewicht"] <> "")
                    {
                            //$umrechnung_gewicht = '$artRow["Gewicht"] = $artRow["Gewicht"] $artRow["Var_Gewicht_Praefix"] $artRow["Var_Gewicht"]';
                            if($artRow['Var_Gewicht_Praefix'] == '+')
                            {
                                    $artRow['Gewicht'] = (double)$artRow['Gewicht'] + (double)$artRow['Var_Gewicht'];
                            }
                            else if($artRow['Var_Gewicht_Praefix'] == '-')
                            {
                                    $artRow['Gewicht'] = (double)$artRow['Gewicht'] - (double)$artRow['Var_Gewicht'];
                            }
                    }// Artikelgewicht nur ab�ndern, wenn auch Attributs�nderungen vorhanden sind
                    if ($artRow["Var_Preis"])
                    {
                            if($artRow['Var_Preis_Praefix'] == '+')
                            {
                                    $artRow['ArtikelpreisNetto'] = (double)$artRow['ArtikelpreisNetto'] + (double)$artRow['Var_Preis'];
                            }
                            else if($artRow['Var_Preis_Praefix'] == '-')
                            {
                                    $artRow['ArtikelpreisNetto'] = (double)$artRow['ArtikelpreisNetto'] - (double)$artRow['Var_Preis'];
                            }
                    }// Artikelpreis nur ab�ndern, wenn auch Attributs�nderungen vorhanden sind
                   
            }// Wenn Artikelattribute erlaubt sind
           
            # Wie soll Artikelnummer aus dem Shop behandelt werden:
            $artRow["Artikelnummer"] = '';
            /*if ($GLOBALS["artno_handling"] == 1)
            {
                    $artRow["Artikelnummer"] = '';
            }*/

            // Wenn die Artikelnummer im Webshop gleich der Artikelnummer in orgaMAX sein soll
           
            return $artRow;
           
    }// article_row_ueberpruefen

    function status_aendern($orderId)
    {
            include_once "inc/config.php";
            $ShopStatus = $GLOBALS["aendern_zu"];
           
            $query = "SELECT orders_status FROM orders where orders_id=$orderId";
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);
            if ($qRes)
            {
                    $row = mysqli_fetch_assoc($qRes);
                    if ($row['orders_status'] != 3)
                    {
                            $query = "UPDATE orders Set orders_status = '$ShopStatus' WHERE orders_id = '$orderId'";
                            mysqli_query($GLOBALS['sql_con'], $query);
                            $error1 = mysqli_error($GLOBALS['sql_con']);
                            $query = "INSERT INTO orders_status_history (orders_id, orders_status_id, date_added) VALUES ($orderId, $ShopStatus, '" . date("Y-m-d H:i:s") . "');";
                            mysqli_query($GLOBALS['sql_con'], $query);
                            $error2 = mysqli_error($GLOBALS['sql_con']);
                            if (($error1 == '') and ($error2 == ''))
                            {
                                    die(xml_success_ausgeben("Der Status der Bestellung '" . $orderId . "' wurde auf '" . $ShopStatus . "' gesetzt."));
                            } // Fehler
                            else
                            {
                                    die(xml_error_ausgeben("Bei der Status�nderung der Bestellung '$orderId' auf den Wert '$ShopStatus' trat ein Fehler auf. Beim ersten Query meldete MySql '$error1' und beim zweiten '$error2'.", __FILE__, __FUNCTION__, __LINE__));
                            }
                    } // Der aktuelle status ist != 3
                    else
                    {
                            die(xml_success_ausgeben("Der Status der Bestellung '" . $orderId . "' durfte nicht ge�ndert werden, da er bereits den Wert '3' besitzt."));
                    }
            } // Select query war erfolgreich
            else
            {
                    die(xml_error_ausgeben("Der Datensatz mit der Bestellnummer '" . $orderId . "' konnte nicht ermittelt werden.", __FILE__, __FUNCTION__, __LINE__));
            }
    }

    function starten()
    {
            # Konfigurationsdatei vom Shopsystem einbinden und Verbindung zur Datenbank herstellen:

            if (file_exists(ORGAMAX_OS_CONFIG)) {
                    include ORGAMAX_OS_CONFIG;
                    $GLOBALS['sql_con'] = mysqli_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD);
                    mysqli_select_db($GLOBALS['sql_con'], DB_DATABASE);

            }// Verbindung zur Datenbank herstellen:
            else
            {
                    die (xml_error_ausgeben($GLOBALS['err_msg']['shop_cfg'],__FILE__, __FUNCTION__, __LINE__));
            }//Fehlermeldung ausgeben
           
            $charset = mysqli_character_set_name($GLOBALS['sql_con']);
                   
            if($charset != 'utf8')
            {
                    mysqli_set_charset($GLOBALS['sql_con'], 'utf8');
            }
    }

    function ende()
    {
            mysqli_close($GLOBALS['sql_con']);
    }
    ?>

    Edit: wenn ich den von noRiddle vorgeschlangenen Code einfüge und auf PHP 8.0 zurückstelle, bekomme ich einen PHP Error:
    Code: PHP  [Auswählen]
    [Sun Jan 08 17:59:09 2023]  PHP Fatal error:  Uncaught TypeError: mysqli_num_rows(): Argument #1 ($result) must be of type mysqli_result, bool given in /shopverzeichnis/meinbuero1/inc/shops/xtcommerce.php:316\nStack trace:\n#0 /shopverzeichnis/meinbuero1/inc/shops/xtcommerce.php(316): mysqli_num_rows(false)\n#1 /shopverzeichnis/meinbuero1/inc/functions.php(241): row_ueberpruefen(Array)\n#2 /shopverzeichnis/meinbuero1/mb_osc.php(53): PositionEintragen(Array, '[?xml version="...')\n#3 {main}\n  thrown in /shopverzeichnis/meinbuero1/inc/shops/xtcommerce.php on line 316

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #16 am: 08. Januar 2023, 18:42:24
    Es gibt zu viele Ungewissheiten. Da werden Variablen benutzt die nicht aus dem Skript selbst kommen und wir wissen nicht was ihre Werte sind (z.B. $GLOBALS['articles_language'] ).
    Ich kann nur raten:
    Versuche mal den ersten Fehler betreffend
    das
    Code: PHP  [Auswählen]
    and po.language_id = '".$GLOBALS['articles_language']."'";

    oder das
    Code: PHP  [Auswählen]
    and po.language_id = ".(int)$GLOBALS['articles_language'];

    Zum zweiten Fehler:
    Die Logs sind schwer lesbar.
    Heißt das
    Uncaught TypeError: mysqli_num_rows(): Argument #1 ($result) must be of type mysqli_result, bool given in /shopverzeichnis/meinbuero1/inc/shops/xtcommerce.php:316
    in Zeile 316 ?

    Ich kann mir nicht vorstellen wie der Code den ich gepostet habe einen solchen Fehler hervorrufen kann.
    Der Fehler muß bereits vorher da gewesen sein, das Skript hatte nur vor Erreichen der Codestelle bereits mit einem Fatal Error abgebrochen.

    Das
    Uncaught TypeError: mysqli_num_rows(): Argument #1 ($result) must be of type mysqli_result, bool given
    bedeutet, daß irgendwo eine mysqli_query  false ergab und somit der Wert der an  mysqli_num_rows() übergeben wird kein MySQL-Ergebnis ist. Warum, who knows.
    Man müsste erstmal die exakte Zeile wissen. In Zeile 316 steht jedenfalls nichts mit mysqli_num_rows($result)  .

    Gruß,
    noRiddle

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #17 am: 09. Januar 2023, 15:00:51
    Das wären die Zeilen um 316:
    Code: PHP  [Auswählen]
     # Prüfen ob Bestellung MwSt frei ist
           $query =  "SELECT orders_total_id ";
            $query .= "FROM orders_total ";
            $query .= "WHERE class = 'ot_tax' AND orders_id = ".$row["BestellnummerShop"]."";
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);
           
            if(mysqli_num_rows($qRes) == false)
            {
                    $row['abweichendeMwStProzent'] = '0.00';
            }

    Die im Error erwähnte Zeile 241 der functions.php lautet:
    Code: PHP  [Auswählen]
    function PositionEintragen($row, $XMLDoc)
    {
            $row= row_ueberpruefen($row); //Zeile 241
            $Feldliste = array_keys($row);
           
            ini_set('error_reporting',"E_ALL & ~E_NOTICE & ~E_WARNING");

    Die Zeile 53 der mb_osc.php :
    Code: PHP  [Auswählen]
    {
                                    $XMLDoc = PositionEintragen($row, $XMLDoc);
                            } // Für jeden Eintrag in der Tabelle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #18 am: 15. Januar 2023, 19:06:46
    Zum ersten Code:
    Mache mal aus
    Code: PHP  [Auswählen]
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);
           
            if(mysqli_num_rows($qRes) == false)
            {
                    $row['abweichendeMwStProzent'] = '0.00';
            }

    das
    Code: PHP  [Auswählen]
            $qRes = mysqli_query($GLOBALS['sql_con'], $query);
           
            if($qRes === false || mysqli_num_rows($qRes) == false)
            {
                    $row['abweichendeMwStProzent'] = '0.00';
            }

    Die anderen Code-Stellen kann ich nicht zuordnen.
    Welchen Fehler werfen die genau ?
    Bitte die Fehler nicht in einer Endloszeile posten, das kann man kaum lesen.

    Gruß,
    noRiddle

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #19 am: 16. Januar 2023, 17:10:28
    Danke für Deine Hilfe. Der Error bei php 8.1 bleibt, egal welche Änderungen ich bei der Zeile and po.language_id durchführe. Ich versuche, die Errormeldung etwas besser darzustellen (ich hatte die Darstellung wie oben 1:1 aus dem Errorlog des Servers kopiert):
    Code: PHP  [Auswählen]
    PHP 8.1

    PHP 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' at line 6 in /is/htdocs/shopverzeichnis/www/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php:227\

    nStack trace:

    \n#0 /is/htdocs/shopverzeichnis/www/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php(227): mysqli_query(Object(mysqli), 'SELECT group_co...')

    \n#1 /is/htdocs/shopverzeichnis/www/Shop2.0.7.2/meinbuero1/inc/functions.php(241): row_ueberpruefen(Array)

    \n#2 /is/htdocs/shopverzeichnis/www/Shop2.0.7.2/meinbuero1/mb_osc.php(53): PositionEintragen(Array, '[?xml version="...')

    \n#3 {main}\n  thrown in /is/htdocs/shopverzeichnis/www/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php on line 227
    Wenn ich auf php 8 zurückstelle, kommt kein Error wenn ich diesen Vorschlag von Dir umsetze:
    Code: PHP  [Auswählen]
    and po.language_id = ".(int)$GLOBALS['articles_language'];
    Allerdings erhalte ich beim Download einer Bestellung eine "leere" xml Datei:
    Code: XML  [Auswählen]
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <OrderNotification>
    <Bestellvorgang>
    <BestellnummerShop></BestellnummerShop>
    <Bestelldatum/>
    <Wunschlieferdatum/>
    <Lieferart><![CDATA[The key 'ORGAMAX_OS_LIEFERART_' is not defined]]></Lieferart>
    <Zahlungsart/>
    <BestellwertBrutto/>
    <ZusatzfeldBestellung1/>
    <ZusatzfeldBestellung2/>
    <ZusatzfeldBestellung3/>
    <ZusatzfeldBestellung4/>
    <ZusatzfeldBestellung5/>
     
    usw.
    Mach ich alle Änderungen wieder rückgängig, läuft der Connector unter PHP 8 richtig und überträgt die Daten der gleichen Bestellung:
    Code: XML  [Auswählen]
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <OrderNotification>
    <Bestellvorgang>
    <BestellnummerShop>14647</BestellnummerShop>
    <Bestelldatum><![CDATA[08.11.2022]]></Bestelldatum>
    <Wunschlieferdatum/>
    <Lieferart><![CDATA[Selbstabholung]]></Lieferart>
    <Zahlungsart><![CDATA[ORGAMAX_OS_ZAHLUNGSART_MV_STRIPE]]></Zahlungsart>
    <BestellwertBrutto/>
    <ZusatzfeldBestellung1/>
    <ZusatzfeldBestellung2/>
    <ZusatzfeldBestellung3/>
    <ZusatzfeldBestellung4/>
    <ZusatzfeldBestellung5><![CDATA[Gang 3]]></ZusatzfeldBestellung5>
     

    Q

    • Fördermitglied
    • Beiträge: 1.537
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #20 am: 16. Januar 2023, 19:50:22
    Code: PHP  [Auswählen]
    PHP 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' at line 6 in /is/htdocs/shopverzeichnis/www/Shop2.0.7.2/meinbuero1/inc/shops/xtcommerce.php:227\
    Ich hab mal was ganz doofes gemacht - ich weiß, Experten sind da professioneller - und einfach mal den Query immer wieder etwas angepasst, dann ausgeführt und geschaut, wann diese Fehlermeldung auftaucht. Anscheinend ist  $row['Positionsnummer']." leer.

    Jetzt dürfen wieder die Profis ran  :-D

    *EDIT* Aus diesem Codeblock:
    Der entsprechende Codeblock der xtcommerce.php:
    Code: PHP  [Auswählen]
    #Artikelnummern (Attribute)
            $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($GLOBALS['sql_con'], $query);
            if ($qRes)
            {
                    $AttributRow = mysqli_fetch_assoc($qRes);
                    $row['ArtikelnummerShop'] .= $AttributRow['fullattributmodel'];
                    }

    Q

    • Fördermitglied
    • Beiträge: 1.537
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #21 am: 16. Januar 2023, 20:05:27
    Die Zeile 53 der mb_osc.php :
    Code: PHP  [Auswählen]
    {
                                    $XMLDoc = PositionEintragen($row, $XMLDoc);
                            } // Für jeden Eintrag in der Tabelle

    Ich würde hier eine leere $row Variable vermuten. Wie sieht denn der Rest der Datei aus?

    *EDIT* Nur so ne Idee. Vielleicht wird nur im letzten "Durchlauf" (Letzter Eintrag im Array?) nichts übergeben. Dann sollte es doch helfen den o.g. Query die Where-Zeile wie folgt abzuändern:
    Code: SQL  [Auswählen]
    WHERE op.orders_products_id = '" . $row['Positionsnummer']."'

    Im Prinzip wie noRiddle das für die articles_language vorgeschlagen hat. Nur eine andere Stelle.

    *EDIT2* Sorry. Ja - ich rede gerne mit mir selbst...... . Es gehört ja zum guten Ton den ganzen Block zu posten....
    Code: PHP  [Auswählen]
            $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'];
     

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #22 am: 16. Januar 2023, 21:15:23
    @Q
    Die komplette Datei:
    Code: PHP  [Auswählen]
       <?PHP
    /***************************************************************************\
    *
    *       Copyright (c) 2013 deltra Buisness Software GmbH & Co. KG
    *       http://www.deltra.de
    *
    \***************************************************************************/


    #Benötigte Dateien einbinden:
    if (file_exists("inc/requirements.php"))
    {
        require_once("inc/requirements.php");
    }
    else
    {
        die("Die Datei <b>requirements.php</b> konnte nicht gefunden werden. <br><br> Bitte &uuml;berpr&uuml;fen Sie, ob diese im Verzeichnis \"inc\" der Webshop-Anbindung
        vorhanden ist."
    );
    }

    if (($_REQUEST) && $_SERVER['HTTP_USER_AGENT']==OMX_AGENT)
    {
        //2011-03-03,HM,der Webserver soll tatsächlich utf-8 liefern!!!
        header("Content-Type: text/plain; charset=utf-8");
           
        // Shopsystem ermitteln
        $webshop = htmlentities($_REQUEST['shp_system']);
            includeShopSystemIfValid($webshop) or die(xml_error_ausgeben(DeltraResources::getText("SHOPSYSTEM_NOT_FOUND"),__FILE__, __FUNCTION__, __LINE__));

        # Start-Funktion aufrufen
            starten();

            # Beginn vom Verarbeiten der Daten
            $GLOBALS['lastorderID'] = -1;
            $XMLDoc = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>'."\n".'<OrderNotification>'."\n";

        # Query / Array / XML-Doc holen und ausf�hren
            daten_holen();
            if ($GLOBALS['datakind'] == 1)
            {
                    /* Verbindung zur DB aufbauen */
                    @$qRes = mysqli_query($GLOBALS['sql_con'], $GLOBALS['query']);

                    if ($qRes) {
                            while ($row = mysqli_fetch_assoc($qRes))
                            /* Verbindung zur DB aufbauen Änderung Hanspeter */
            /*@$qRes = mysqli_query($GLOBALS['sql_con'], $GLOBALS['query']);

            if ($qRes) {
                $GLOBALS['count_rows'] = mysqli_num_rows($qRes);  
                $GLOBALS['counter_rows'] = 1;
                while ($row = mysqli_fetch_assoc($qRes))*/

                            {
                                    $XMLDoc = PositionEintragen($row, $XMLDoc);
                            } // F�r jeden Eintrag in der Tabelle
                    } // Wenn Query ausgef�hrt werden konnte
                    else {die (xml_error_ausgeben(DeltraResources::getText("SQL_EXECUTION_ERROR") . chr(13) . chr(10) . chr(13) . chr(10) . mysqli_error($GLOBALS['sql_con']) ."",__FILE__, __FUNCTION__, __LINE__));} // Wenn Query nicht ausgef?hrt werden konnte
            } // Ein Query wurde geliefert
            elseif ($GLOBALS['datakind'] == 2)
            {
                    foreach ($GLOBALS['ErgebnisArray'] as  $index => $row)
                    {
                            $XMLDoc = PositionEintragen($row, $XMLDoc);
                    } // Für jedes Arrayelement
            } // Ein Ergebnisarray wurde geliefert
            elseif ($GLOBALS['datakind'] == 3)
            {
                    $XMLDoc = $GLOBALS['XMLDoc'];

            } // XMLDoc wurde komplett von der Magento- oder Shopware-Schnittstelle geliefert
            if ((($GLOBALS['datakind'] == 1) and (mysqli_num_rows($qRes) > 0)) or (($GLOBALS['datakind'] == 2) and (is_array($GLOBALS['ErgebnisArray']) > 0)))
            {
                    $XMLDoc .= '</Bestellvorgang>';
            } // Bestellvorgang nur dann schließen, wenn es auch einen gab.
           
            if (($GLOBALS['datakind'] == 1) or ($GLOBALS['datakind'] == 2))
            {
                    $XMLDoc .= '</OrderNotification>';
            }
           
            if (strlen(VERSCHLUESSELN) > 0)
                    $XMLDoc = encryptString($XMLDoc, SCHLUESSEL);

            // Daten ausgeben
            echo  $XMLDoc;

            # Ende-Funktion aufrufen
            ende();
    } // Gibt es POST Variablen und wurde der Client erkannt
    else
    {
            # Startseite laden:
            $shp_startseite = $_SERVER['HTTP_HOST'];
            header("Location: http://$shp_startseite");

    }// Falsche Zugriffsart
    ?>    

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #23 am: 16. Januar 2023, 21:31:55
    Selten so ätzend bescheiden formatierten Code gesehen.

    Ich denke Q ist auf dem richtigen Weg.
    Es gibt da so weinige Variablen deren Herkunft und Inhalte man gerne wüsste.
    Deshalb schrieb ich auch
    Es gibt zu viele Ungewissheiten. Da werden Variablen benutzt die nicht aus dem Skript selbst kommen und wir wissen nicht was ihre Werte sind ...
    [...]

    Ich denke du, Viol, solltest jemanden da draufschauen lassen der nach und nach alle Probleme fixt (not me, no free capacities).
    Man kann sich ja auch Sachen ausgeben lassen wenn man die Verhältnisse versteht weil man alle Dateien in ihrem Zusammenhang kennt.
    Hier im Forum ist das alles Stückwerk.

    Gruß,
    noRiddle

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #24 am: 16. Januar 2023, 22:06:40
    @noRiddle
    Ich habe dazu seit November ein Ticket beim Hersteller laufen,dass die Schnittstelle nicht kompatibel mit der aktuellen PHP Version ist, was dort auch ohne Ticket bekannt sein müsste.
    Ich habe es mit kleinen Änderungen geschafft, dass ich zumindest mit php8.0 arbeiten kann.
    Angeblich prüft die Entwicklungsabteilung jetzt die Anpassung auf PHP 8.
    Das Modul der Webshopschnittstelle ist immerhin monatlich kostenpflichtig und insofern möchte ich noch abwarten, was beim Hersteller heraus kommt. Im Moment bin ich froh,dass die Schnittstelle mit PHP8.0 läuft. Auf jeden Fall bedanke ich mich für Eure Bemühungen.

    Q

    • Fördermitglied
    • Beiträge: 1.537
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #25 am: 17. Januar 2023, 13:46:54
    Das Modul der Webshopschnittstelle ist immerhin monatlich kostenpflichtig...

    An wen darf die Community jetzt die Rechnung schreiben?  :-D

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #26 am: 17. Januar 2023, 16:08:39
    :cheers: Wer von Euch beiden mal nach Schleswig Holstein kommt, den lade ich zum Bier ein.

    Q

    • Fördermitglied
    • Beiträge: 1.537
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #27 am: 17. Januar 2023, 19:43:45
    Alles klar. Kann aber etwas dauern. Das nächste halbe Jahr stehen nur BY, BW, NRW und SN auf dem Plan  ;-)

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #28 am: 17. Januar 2023, 22:12:04
    Nur wenn du, Viol, uns was vorspielst, auf einer deiner Stradi..., ääh, Violari :-D

    Gruß,
    noRiddle

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: Fehler in Connector nach Umstellung von PHP 8 auf PHP 8.1
    Antwort #29 am: 18. Januar 2023, 06:19:47
    Nur wenn du, Viol, uns was vorspielst, auf einer deiner Stradi..., ääh, Violari :-D

    Gruß,
    noRiddle
    Wie wäre es mit einem Duo? ;-)
    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