Oxid CE 4.10.x und PHP 7.2

#1

Hallo,

wir wollen auf PHP 7.2 umstellen und erst im laufe des Jahres den Shop auf die Version 6.x aktualisieren. Dazu haben wir bereits die Änderungen wie in dem Artikel OXID eShop für PHP 7 patchen durchgeführt.

Bis auf die zwei folgenden Fehler funktioniert alles problemlos:

1.) Auf allen Seiten (auch im Adminbereich) wird an unterschiedlichen Stellen folgende Warnung angezeigt:
Warning: count(): Parameter must be an array or an object that implements Countable in /htdocs/shop/tmp/smarty/3858bea6b6eabf27b3ee585eb6ab6866^%%28^28D^28DEE24D%%errors.tpl.php on line 3

2.) Unter Systemgesundheit ist “ini_set erlaubt” rot. Eine möglich Lösung wird in diesem Beitrag genannt: 4.10.8 PHP 7.2: ini_set rot und internal server errors auf einigen Seiten

Der Ordner “tmp” wurde bereits geleert und unter Tools die Views neu generiert. In welchen Dateien werden die Fehler produziert und wie können diese behoben werden?

Viele Grüße und allen noch ein schönes Wochenende :wink:

#2
  1. das ist keine Fehlermeldung, sondern eine Warnung. Wenn alles funktioniert, ist alles okay.
  2. Lösung ausprobiert? Hat nicht funktioniert?
#3

Diesen Warning hatte ich auch an mehreren Stellen Z.B: admin login
Warning: count(): Parameter must be an array or an object that implements Countable in
C:\xampp\htdocs\oxid10\tmp\smarty\161a604e4e1a166a9e7ef58747e44adc^%%6A^6A5^6A537DD8%%login.tpl.php on line 49

Zeile 49 <?php if (count($this->_tpl_vars['Errors']['default'])): ?>

Der Fehler tritt auf wenn das Argument von count nicht initialisiert ist. Quasi ein Null Pointer.
Deshalb muss man das Argument prüfen. count($xx) ==> if($xx) count($xx)
in login.tpl
[{if $Errors.default}] (neu)
[{if $Errors.default|@count }]
[{include file=“inc_error.tpl” Errorlist=$Errors.default}]
[{/if}]
[{/if}] (neu)
Problem 2 habe ich auch. Hat sich nicht ausgewirkt. Läuft so seit 08.2018
Unsere Version 4.10.4

1 Like
#4

Genau, ich hatte das auch. Das ist ein bug im flow theme. Mit der beschrieben templateanpassung könnt ihr die warning entfernen.

#5

Hallo,

vielen Dank für die gute Rückmeldungen.

1.) Ja, es sind nur Warnungen und keine Fehlermeldungen, aber im Frontend sehen die für Kunden nicht besonders gut aus :wink: Das Problem kann wie von heinz.klauke behoben werden. Vielen Dank!

2.) Ja, selbstverständlich habe ich die Lösung ausprobiert. Die Prüfung “ini_set erlaubt” ist dann tatsächlich OK bzw. grün, wenn unter /shop/core/oxsysrequirements.php die Funktion wie folgt geändert wird:

public function checkIniSet()
{
   return (ini_get('session.name') === 'sid' || @ini_set('session.name', 'sid') !== false) ? 2 : 0;
}

Nach den durchgeführten Änderungen konnten bis jetzt keine weiteren Fehler bzw. Warnmeldungen festgestellt werden. Also sollte der Shop jetzt mit PHP 7.2 funktionieren :slight_smile:

Vielen Dank an alle und eine gute Woche!

#6

Wir benutzen das Flow Theme. Dabei wurden auf dem Mobile die Fotos nicht richtig dargestellt.
Die Problemlösung hab ich hier im Forum gefunden.
Shop läuft wie “Schmitz Katze”. Jetzt wird nichts mehr geändert. :slight_smile:
Doch PayPal Ratenzahlung kommt noch. Dabei sind auf dem Testsystem nur 2 Kleinigkeiten aufgetreten.

Gruß Heinz Klauke

#7

im Live Betrieb eines Shops sollte man PHP-Warnungen sowieso ausschalten und nur Fehlermeldungen lassen.

#8

Hallo

das ist ein berechtigter Hinweis und absolut sinnvoll PHP-Warnungen im Live-Betrieb abzuschalten :wink:

Gibt es dazu im Shop eine entsprechende Konfiguration z. B. in der config.inc.php oder muss dies z. B. über die .htaccess und php_flag error_reporting off erfolgen?

Viele Grüße und noch einen schönen Abend!

#9

PHP Warnungen betreffen ja nicht nur den Shop und sollten daher global konfiguriert werden

#10

Hallo,

eine globale Konfiguration der PHP Warnungen ist bei unserem Hosting-Paket leider nicht so einfach möglich!
Die Warnungen werden im Shop allerdings nicht angezeigt, wenn in den Grundeinstellungen der “Produktivmodus” aktiviert ist :slight_smile:

Dennoch wird die folgende Warnung im “Produktivmodus” angezeigt, wenn eine Produktvariante gewählt wird:
Warning: count(): Parameter must be an array or an object that implements Countable in /htdocs/shop/tmp/smarty/3858bea6b6eabf27b3ee585eb6ab6866^%%F5^F50^F500F10E%%tabs.tpl.php on line 110

Aus der entsprechenden Zeile im Template
[{if ($oView->getCrossSelling()|count or $oView->getAccessoires()|count or $oView->getSimilarProducts()|count)}]

Wird folgender Code generiert

<?php if (( ((is_array($_tmp=$this->_tpl_vars['oView']->getCrossSelling())) ? $this->_run_mod_handler('count', true, $_tmp) : count($_tmp)) || ((is_array($_tmp=$this->_tpl_vars['oView']->getAccessoires())) ? $this->_run_mod_handler('count', true, $_tmp) : count($_tmp)) || ((is_array($_tmp=$this->_tpl_vars['oView']->getSimilarProducts())) ? $this->_run_mod_handler('count', true, $_tmp) : count($_tmp)) )): ?>

Mir ist nicht klar wie die Prüfung aus dem Beispiel von “heinz.klauke” if($xx) count($xx) in diesem Fall anzuwenden ist.
Kann mir bitte jemand sagen, wie die Zeile im Template zu ändern ist?

Schon mal vielen Dank!

#11

Hallo zusammen,

zwei interessante Artikel habe ich gefunden, wie das Problem evtl. gelöst werden kann:
1.) count generate waring in PHP 7 if there array is null
2.) get value count in an array with smarty

Wenn |count in |@count geändert wird, wie in Punkt 2 wird die Warnung weiterhin angezeigt.
Wenn |count in |default:array()|count geändert wird, wie in Punkt 1 ist die Produktseite nicht aufrufbar und es wird “Shop offline!” angezeigt.

Wer kann weiterhelfen und mir sagen wie die Syntax richtig ist?

#12

Hallo,

durch den folgenden Beitrag konnte ich das Problem lösen:
[PHP 7.2] My fix for Warning: count()

Der Workaround sieht also wie folgt aus:
if ( $var|count ) wird zu
if ( $var && count($var) )
oder
if ( count($var) == 1 ) wird zu
if ( $var && count($var) == 1 )

Mir ist allerdings unklar, weshalb die Warnungen nicht mehr angezeigt werden, da ggf. count($var) immer noch ungültig bzw. NULL sein kann. Vielleicht hilft die Info ja trotzdem noch jemand :wink:

Wünsche allen ein gutes Wochenende!

#13

Die Warnung wird nicht mehr angezeigt, weil $var nicht vorhanden ist und es gar nicht bis zu count() kommt

1 Like
#14

Hallo vanilla_thunder,

vielen Dank für die Erklärung, jetzt habe ich es verstanden :slight_smile: War der Meinung, dass in der if() alles zur Prüfung ausgeführt wird!

#15

Logische Operationen werden von Links nach Rechts ausgeführt.
$var ist false ==> der Rest wird nicht mehr (muss nicht mehr) ausgeführt werden

#16

Super und es funktioniert sogar mit PHP 7.3.3
EDIT:
Es kommen doch 2 Warnungen bei 7.3.3 die bei 7.2 nicht auftreten:
Warning: session_id(): Cannot change session id when session is active in /homepages/9/xxx/htdocs/xxx/core/oxsession.php on line 1005

Warning: Cannot modify header information - headers already sent by (output started at /homepages/9/xxx/htdocs/xxx/core/oxsession.php:1005) in /homepages/9/xxx/htdocs/xxx/core/oxutilsserver.php on line 86

#17

Hallo,

es gibt doch einen Fehler mit PHP 7.2 der bis jetzt leider nicht behoben werden konnte.
Unter Kundeninformationen -> Aktionen verwalten wird in dem Dialog “Artikel zuordnen” keine Artikel angezeigt (Spalte: “Alle verfügbaren Artikel”) und können demzufolge keiner Aktion zugeordnet werden. Einer Aktion bereits zugeordnete Artikel (Spalte: “Zugeordnete Artikel”) werden ebenfalls nicht im Dialog angezeigt.

Im Dialog wird keine Warnung oder Fehlermeldung angezeigt. In welcher Datei ist nach dem Fehler zu suchen bzw. wie kann eine Fehlermeldung mit Zeilennummer im Dialog angezeigt werden?

PS
In der config.inc.php wurde bereits $this->iDebug = 2; aktiviert.
Nach dem aktivieren wurde zuerst noch ein Fehler angezeigt:

oxConnectionException-oxException (time: 2019-05-08 08:45:32): [1146]: mysql:EXECUTE error: [1146: Table 'hshop.adodb_logsql' doesn't exist] in EXECUTE...

Das liegt wohl am ADOdb-Lite Performance Monitor, der aktiviert wird wenn der debug-mode in der config-inc.php. mit SQL gewählt wird (2,3,4), aber die dazugehörige Tabelle: “adodb_logsql” nicht erstellt. Das Problem kann behoben werden, wenn die Tabelle wie folgt erstellt wird:

CREATE TABLE adodb_logsql(
created datetime NOT NULL ,
sql0 varchar( 250 ) NOT NULL ,
sql1 text NOT NULL ,
params text NOT NULL ,
tracer text NOT NULL ,
timer decimal( 16, 6 ) NOT NULL
)

Weitere Infos dazu in diesem Beitrag: Datenbank Problem xampp CE 4.8.4