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


#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


#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