OsCommerce auf PHP5 umstellen So, Sep 12. 2010
Wer mit seinem Onlineshop OsCommerce auf einen neuen Server umsteigen will, stößt früher oder später auf größere Probleme. Besonders, wenn der Provider kein PHP4 mehr unterstützt. Neben einfachen Lösungswegen, werden hier auch Wege beschrieben, den Shop auf neuere PHP-Versionen vorzubereiten und gleichzeitig die Sicherheit zu erhöhen.
Alle hier beschriebenen Lösungswege zum Umstieg auf PHP5 gelten für osCommerce Online Merchant v2.2, nicht die neueren RC und RCa Versionen, die bereits fit für PHP5 sind.
Alle Änderungen erfolgen auf eigene Gefahr. In Produktivumgebungen sind die üblichen Sicherheitsvorkehrungen zu treffen, ein vorheriges Backup ist Pflicht. Ich übernehme keine Gewähr auf Richtigkeit und Fehlerfreiheit des Artikels.
Wie in einem Forenbeitrag gelesen, soll es angeblich ausreichen, die register_globals und die register_long_arrays wieder per php.ini einzustellen, um OsCommerce auf PHP5 laufen zu lassen:
1: Change in php.ini
register_globals = On
register_long_arrays = On
2: Change in catalog/admin/includes/classes/upload.php
on line 31 change
$this = null;
to
//$this = null;
Doch das Problem wird einen spätestens dann wieder einholen, wenn man keine Berechtigung zur Erstellung einer eigenen php.ini hat, die php.ini so nicht verändern darf/kann oder der Hoster dies verbietet. Auch mit den neuen Versionen von PHP wird man Probleme bekommen, denn PHP6 unterstützt keine register_globals [2] mehr.
OsCommerce Schritt-für-Schritt auf PHP5 umstellen
Mit folgender Schritt-für-Schritt-Anleitung kann ein altes OsCommerce auf PHP5 ohne register_globals umgestellt werden. Diese Anleitung ist mehr ein Leitfaden, als eine komplette Dokumentation. Je nach System sind eventuell noch mehr/andere Schritte notwendig.
OsCommerce mit register_globals = off
register_globals = off bedeutet, alle globalen Variablen müssen mit ihrem globalen Built-in-Variablennamen, den Superglobals, gespeichert werden. Die Superglobals, die für OsCommerce von Interesse sind, sind $GLOBALS, $_SERVER, $_GET, $_POST, $_COOKIE und ganz wichtig: $_SESSION.
In diesem Zusammenhang kann auch die Warnmeldung in der /catalog/includes/application_top.php entfernt werden (~ Z 39):
// check if register_globals is enabled.
// since this is a temporary measure this message is hardcoded. The requirement will be removed before 2.2 is finalized.
if (function_exists('ini_get')) {
ini_get('register_globals') or exit('FATAL ERROR: register_globals is disabled in php.ini, please enable it!');
}
OsCommerce mit register_long_arrays = off
Diese Einstellung bekommt man noch am einfachsten in den Griff. Alle Variablen, die mit $HTTP_POST_VARS angesprochen wurden, werden zukünftig mit $_POST angesprochen. Das gleiche gilt für $HTTP_GET_VARS ($_GET) und $HTTP_COOKIE_VARS ($_COOKIE). Dazu einfach die Suchen/Ersetzen Funktion benutzen und alle Texteinträge im Quellcode bearbeiten.
OsCommerce Session-Managemant auf PHP5 und Superglobals vorbereiten
Insbesondere das Session-Management in OsCommerce erfordert einige Eingriffe, um OsCommerce fit für PHP5 und die Verwendung der superglobalen Variable $_SESSION zu machen.
Dazu verändern wir die Datei /catalog/includes/functions/sessions.php:
function tep_session_register($variable) {
global $session_started;
if ($session_started == true) {
//return session_register($variable);
return $_SESSION[$variable];
} else {
return false;
}
}
function tep_session_is_registered($variable) {
//return session_is_registered($variable);
return isset($_SESSION[$variable]);
}
function tep_session_unregister($variable) {
//return session_unregister($variable);
unset($_SESSION[$variable]);
}
Damit sind die tep-Funktionen auf die neuen superglobalen $_SESSION-Variablen vorbereitet.
Session-Variablen in OsCommerce
Doch welche Session-Variablen werden überhaupt im OsCommerce benutzt? Durch die Suchen-Funktion kann man das komplette Projekt durchforsten. Ich habe dazu den Dreamweaver benutzt, da dieser lokal recht flott arbeitet und später beim Suchen/Ersetzen wertvolle Dienste leistet, da diese Funktion auch die mächtigen regulären Ausdrücke unterstützt.
Wenn man nach "tep_session_register(" sucht, findet man eine Liste von allen über das OsCommerce registrierten Session-Variablen:
tep_session_register('SESSION_SSL_ID');
tep_session_register('SESSION_USER_AGENT');
tep_session_register('SESSION_IP_ADDRESS');
tep_session_register('cartID');
tep_session_register('cart');
tep_session_register('language');
tep_session_register('languages_id');
tep_session_register('currency');
tep_session_register('navigation');
tep_session_register('payment');
tep_session_register('comments');
tep_session_register('shipping');
tep_session_register('sendto');
tep_session_register('billto');
tep_session_register('customer_id');
tep_session_register('customer_first_name');
tep_session_register('customer_default_address_id');
tep_session_register('customer_country_id');
tep_session_register('customer_zone_id');
tep_session_register('current_path');
tep_session_register('selected_box');
tep_session_register('messageToStack');
tep_session_register('new_products_id_in_cart');
Je nach Konfiguration, eigens erstellten und importierten Modulen, können noch weitere hinzukommen. Bei mir waren es
tep_session_register('kill_sid');
tep_session_register('pwa_array_customer');
tep_session_register('pwa_array_address');
tep_session_register('currentSection');
tep_session_register('preisfilter');
tep_session_register('cart_PayPal_IPN_ID');
Nach der Analyse der Variablennamen konnte ich folgenden für Dreamweaver vorbereiten regulären Ausdruck aufbauen:
RegEx für Dreamweaver
Suchen:
\$var([)=;\[\],]|->| =| \+| \*| \.)
Ersetzen:
$_SESSION['var']$1
Das hatte mir alle möglichen Variablen gefunden, die nach diesem Schema im Quelltext standen:
Var-Schema im Quelltext
$var)
$var->
$var =
$var=
$var;
$var[
$var]
$var,
$var +
$var *
$var .
Vorsicht in den Klassen und Funktionen! Diese dort enthaltenen Variablen sind u.U. lokal definiert und nicht Superglobal, obwohl dort gelegentlich der gleiche Variablenname benutzt wurde.
Zeilen, die mit var ... anfingen, habe ich nicht geändert.
Innerhalb einiger Funktionen waren z.B. die Variablen als global definiert. Mit einer weiteren Suchen/Ersetzen Funktion konnte ich diese einkommentieren:
RegEx für Dreamweaver alle global $_Sesssion/$_SERVER-Variablen entfernen /einkommentieren
Suchen:
(global \$_SESSION\['[a-zA-Z_]*'\];)
Ersetzen:
//$1
Das funktionierte nicht bei mehr als einer Session-Variable oder einem Variablengemisch von lokalen und Superglobalen.
Zum Schluss der Ersetzungsorgie kann man die Starseite des Shops aufrufen. Angenommen, die neuen Datenbank Zugangsdaten und Pfade des Providers sind in der includes/configure.php hinterlegt (Adminbereich nicht vergessen), sollten jetzt noch alle von PHP gemeldeten Fehler (meist Fatal Error) behoben werden.
left join Problematik beheben
In den SQL-Anweisungen mit left join müssen noch Klammern neu gesetzt werden, sonst kommt es zur tep-stop-Fehlermeldung
Grundsätzlich sollte man sich merken für jedes left join wird ein Klammernpaar benötigt. In der Regel sind die SQL-Anweisungen in der index.php bei der Produktlistenansicht, wobei es zwei left joins gibt. Als Faustregel: zwei klammern nach FROM und jeweils eine KLammer vor LEFT JOIN
Hier aus unserem Shop (vermutlich schon verändert, daher kein original OsCommerce, daher bitte kein Copy/Paste)
vorher:
select pd.products_name, p.products_id, p.manufacturers_id, p.".PRODUCTS_PRICE.", p.products_tax_class_id, p.products_prioritaet, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from products_description pd, products p left join manufacturers m on p.manufacturers_id = m.manufacturers_id, products_to_categories p2c left join specials s on p.products_id = s.products_id where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '".LANGUAGE_ID."' and p2c.categories_id = '43' order by p.products_prioritaet DESC, p.products_id ASC
fixed:
select pd.products_name, p.products_id, p.manufacturers_id, p.".PRODUCTS_PRICE.", p.products_tax_class_id, p.products_prioritaet, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from (( products_description pd, products p ) left join manufacturers m on p.manufacturers_id = m.manufacturers_id, products_to_categories p2c ) left join specials s on p.products_id = s.products_id where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '".LANGUAGE_ID."' and p2c.categories_id = '43' order by p.products_prioritaet DESC, p.products_id ASC
PHP_SELF
$PHP_SELF ist eine Server-Variable, die inzwischen mit $_SERVER['PHP_SELF'] angesprochen wird. Bitte alle vorkommen suchen/ersetzen. Auch hier Vorsicht bei Funktionen mit global-Aufrufen, dort müssen diese Variablen entfernt werden, da diese Variablen bereits global sind und dann innerhalb der Funktion einfach benutzt werden können.
Schlussbemerkungen zur OsCommerce Umstellung auf PHP5
Grundsätzlich muss man schon wissen, wie man alles umstellt und was man ändert. Vorallem im Checkout kann es mit den Modulen Shipping und Payment zu schwierigen Situationen kommen, ob die Variable umgestellt wird und man auch keine vergessen hat. Alle Zahlungs- und Shipping, sowie Order-Total-Module sollten daher nochmal manuell durchgesehen werden.
Von den OsCommerce Contributions gibt es für frische Shops auch einen Patch [3] , der allerdings hier nicht benötigt wurde. Soweit ich es verstanden habe, wird hierbei auch nur die htaccess/php.ini modifieziert, um doch wieder register_globals auf on zu setzen.
Die komplette OsCommerce Umstellung auf PHP5 ohne register_globals kann durchaus 1-2 Tage in Anspruch nehmen und sollte nur von Profis durchgeführt werden.
Wem das zuviel Aufwand bedeutet, kann natürlich überlegen, gleich einen neuen Online-Shop erstellen zu lassen, z.B. auf Basis von Prestashop oder Magento.
weiterführende Links
[1] Forenbeitrag zu OsCommerce und PHP5
[2] Prepare for PHP6
[3] Register Globals Patch Files
Bookmarks:
Delicious Facebook Google Yahoo Mr. Wong Linkarena Digg