Hotclutch 205 Posted August 26, 2021 Lets help each other out, and point out the required changes to bring our shops up to the PHP8 level. 1) Replacing tep_session_is_registered You will find this in several places throughout the osCommerce project, so you have to check for them all, and then change it over. Be careful to note the use of ! before tep_session_is_registered. eg. checkout_success.php FInd: if (!tep_session_is_registered('customer_id')) { Replace with: if (!isset($_SESSION['customer_id'])) { You will find several instances of tep_session_is_registered in application_top.php Then starting from account.php, account_edit.php ..., you will typically find: if (!tep_session_is_registered('customer_id')) { $navigation->set_snapshot(); tep_redirect(tep_href_link('login.php', '', 'SSL')); } Using tep_session_is_registered is a common condition for addons, so you have to check any mods you have made. Share this post Link to post Share on other sites
Demitry 79 Posted August 26, 2021 (edited) Instead of updating all of the files that use this osC function, why not just update the function itself in /includes/functions/sessions.php? Zombie Phoenix v1.0.8.3 has the latest version of this function. I haven't tried it yet, but it should work. https://www.php.net/manual/en/migration80.deprecated.php Edited August 26, 2021 by Demitry osCommerce: made for programmers, ...because store owners do not want to be programmers. https://trends.google.com/trends/explore?date=all&geo=US&q=oscommerce Share this post Link to post Share on other sites
Hotclutch 205 Posted August 26, 2021 I need to retract my first post. Yesterday i switched over to php8 for the first time and did a quick test order. The process failed on checkout_success.php and i may have incorrectly assumed that tep_session_is_registered was the code at fault. On closer inspection the failure was due to one of the checkout success modules. After reinstalling that module the problem disappeared. So I am going to revert the changes I mentioned above. This is what the function looks like in sessions.php: function tep_session_is_registered($variable) { if (PHP_VERSION < 4.3) { return session_is_registered($variable); } else { return isset($_SESSION) && array_key_exists($variable, $_SESSION); } } Can anybody see anything wrong with it that may cause a compatibility problem with php8 ? So for the moment I don't see any issues with php8 on the catalog side. The Admin breaks with the error: Fatal error: Uncaught Error: Call to undefined function get_magic_quotes_gpc() in Share this post Link to post Share on other sites
bonbec 149 Posted August 26, 2021 Perhaps like this (untested, I have to install Php8) ? : // handle magic_quotes_gpc turned off. if (PHP_VERSION < '8') { if (!get_magic_quotes_gpc()) { do_magic_quotes_gpc($HTTP_GET_VARS); do_magic_quotes_gpc($HTTP_POST_VARS); do_magic_quotes_gpc($HTTP_COOKIE_VARS); } } with OsC 2.2 since 2006 ... Share this post Link to post Share on other sites
Hotclutch 205 Posted August 26, 2021 9 minutes ago, bonbec said: Perhaps like this (untested, I have to install Php8) ? : // handle magic_quotes_gpc turned off. if (PHP_VERSION < '8') { if (!get_magic_quotes_gpc()) { do_magic_quotes_gpc($HTTP_GET_VARS); do_magic_quotes_gpc($HTTP_POST_VARS); do_magic_quotes_gpc($HTTP_COOKIE_VARS); } } This will work, it will have the same effect as commenting out the code like: // handle magic_quotes_gpc turned off. #if (!get_magic_quotes_gpc()) { #do_magic_quotes_gpc($HTTP_GET_VARS); #do_magic_quotes_gpc($HTTP_POST_VARS); #do_magic_quotes_gpc($HTTP_COOKIE_VARS); #} This is in admin/includes/functions/compatibility.php line 45 Share this post Link to post Share on other sites
Hotclutch 205 Posted August 26, 2021 The Admin is up and running, not too bad for an ancient piece of code Share this post Link to post Share on other sites
Hotclutch 205 Posted August 26, 2021 Undefined variable $cInfo admin/orders.php line 606 Share this post Link to post Share on other sites
Hotclutch 205 Posted August 26, 2021 $contents[] = array('text' => TEXT_INFO_DELETE_INTRO . '<br /><br /><strong>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</strong>'); replace with: #$contents[] = array('text' => TEXT_INFO_DELETE_INTRO . '<br /><br /><strong>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</strong>'); $contents[] = array('text' => TEXT_INFO_DELETE_INTRO . '<br /><br /><strong>' . $oInfo->customers_name . '</strong>'); Share this post Link to post Share on other sites
bonbec 149 Posted August 26, 2021 1 hour ago, Hotclutch said: This will work, it will have the same effect as commenting out the code like: Not exactly, what I'm suggesting keeps compatibility for versions of PHP <8 (for those who don't yet have PHP 8). with OsC 2.2 since 2006 ... Share this post Link to post Share on other sites
Hotclutch 205 Posted August 26, 2021 (edited) yes sure but i don't think that code has any effect on php versions > 5.4 because that feature has been deprecated since then. https://stackoverflow.com/questions/61054418/php-7-4-deprecated-get-magic-quotes-gpc-function-alternative/61260285 Edited August 26, 2021 by Hotclutch Share this post Link to post Share on other sites
Demitry 79 Posted August 26, 2021 (edited) The theme of this thread is to update to PHP8,... that means code related to PHP versions that precede 8.0 is irrelevant. Similarly, the first part of that conditional IF statement in the tep_session_is_registered function is useless because PHP versions of 4.3 and lower, are no longer supported. Edited August 26, 2021 by Demitry osCommerce: made for programmers, ...because store owners do not want to be programmers. https://trends.google.com/trends/explore?date=all&geo=US&q=oscommerce Share this post Link to post Share on other sites
Hotclutch 205 Posted August 26, 2021 yes, I realise the first part of the function is irrelevant, it could be rewritten as: function tep_session_is_registered($variable) { return isset($_SESSION) && array_key_exists($variable, $_SESSION); } its array_key_exists that I am not sure about. Anyway no errors are shown running with a debugger on. Share this post Link to post Share on other sites
Demitry 79 Posted August 27, 2021 Here is that function from Zombie Phoenix v1.0.8.0 (not v1.0.8.3 as I had posted prior): function tep_session_is_registered($variable) { trigger_error('The tep_session_is_registered function has been deprecated.', E_USER_DEPRECATED); return isset($_SESSION) && array_key_exists($variable, $_SESSION); } ...though I don't think this has anything to do with migrating to PHP8.0 Quote its array_key_exists that I am not sure about. array_key_exists() is not part of the deprecated functions in PHP8.0. See links below. https://www.php.net/manual/en/migration80.deprecated.php https://www.php.net/manual/en/function.array-key-exists.php 1 Hotclutch reacted to this osCommerce: made for programmers, ...because store owners do not want to be programmers. https://trends.google.com/trends/explore?date=all&geo=US&q=oscommerce Share this post Link to post Share on other sites
Hotclutch 205 Posted August 27, 2021 Does not look like there's much to do, surprisingly. Most of the (minor) errors were from old addon code. Share this post Link to post Share on other sites
Hotclutch 205 Posted September 6, 2021 So whats the difference in error reporting between the CEs and last official osCommerce? I see // Set the level of error reporting error_reporting(E_ALL & ~E_NOTICE); if (defined('E_DEPRECATED')) { error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); } on both them. I am running 2 test shops on the same php8 server environment, the one is Defrosted (created from Frozen), the other is W3 osCommerce, I created from scratch on a 2.3.4.1 installation. On the W3 osCommerce admin i get a fatal error in classes/split_page_results.php, whereas i see no problem for it on the Frozen admin. function display_count($query_numrows, $max_rows_per_page, $current_page_number, $text_output) { $to_num = ($max_rows_per_page * $current_page_number); if ($to_num > $query_numrows) $to_num = $query_numrows; $from_num = ($max_rows_per_page * ($current_page_number - 1)); if ($to_num == 0) { $from_num = 0; } else { $from_num++; } return sprintf($text_output, $from_num, $to_num, $query_numrows); } I googled this, and a possible solution appears to be: function display_count($query_numrows, $max_rows_per_page, $current_page_number, $text_output) { $to_num = ((int)$max_rows_per_page * (int)$current_page_number); if ($to_num > $query_numrows) $to_num = $query_numrows; $from_num = ((int)$max_rows_per_page * ((int)$current_page_number - 1)); if ($to_num == 0) { $from_num = 0; } else { $from_num++; } return sprintf($text_output, $from_num, $to_num, $query_numrows); } which does clear the error. Share this post Link to post Share on other sites
Hotclutch 205 Posted September 7, 2021 The following errors are thrown in admin whos online, when click on a customer row. Warning: Trying to access array offset on value of type null admin/includes/classes/shopping_cart.php on line 154 admin/includes/classes/shopping_cart.php on line 218 admin/includes/classes/shopping_cart.php on line 221 line 154: if ($this->contents[$products_id]) { line 218 if ($attribute_price['price_prefix'] == '+') { line 221 $this->total -= $qty * tep_add_tax($attribute_price['options_values_price'], $products_tax); Also Warning: Undefined array key "qty" on line 124: if ($this->contents[$key]['qty'] < 1) { Share this post Link to post Share on other sites
♥Smoky Barnable 83 Posted September 7, 2021 7 hours ago, Hotclutch said: The following errors are thrown in admin whos online, when click on a customer row. Warning: Trying to access array offset on value of type null admin/includes/classes/shopping_cart.php on line 154 admin/includes/classes/shopping_cart.php on line 218 admin/includes/classes/shopping_cart.php on line 221 line 154: if ($this->contents[$products_id]) { line 218 if ($attribute_price['price_prefix'] == '+') { line 221 $this->total -= $qty * tep_add_tax($attribute_price['options_values_price'], $products_tax); Also Warning: Undefined array key "qty" on line 124: if ($this->contents[$key]['qty'] < 1) { https://github.com/ruden/vanilla-oscommerce/blob/dev/catalog/admin/includes/classes/shopping_cart.php 1 Hotclutch reacted to this The water in a vessel is sparkling; the water in the sea is dark. The small truth has words which are clear; the great truth has great silence. - Rabindranath Tagore Share this post Link to post Share on other sites
Hotclutch 205 Posted September 7, 2021 ^^That clears Warning: Trying to access array offset on value of type null errors. Still leaves the undefined array key errors. Share this post Link to post Share on other sites
♥Smoky Barnable 83 Posted September 7, 2021 2 hours ago, Hotclutch said: ^^That clears Warning: Trying to access array offset on value of type null errors. Still leaves the undefined array key errors. Change: if ($this->contents[$key]['qty'] < 1) { to: if (isset($this->contents[$key]['qty']) < 1) { 1 Hotclutch reacted to this The water in a vessel is sparkling; the water in the sea is dark. The small truth has words which are clear; the great truth has great silence. - Rabindranath Tagore Share this post Link to post Share on other sites
Hotclutch 205 Posted September 8, 2021 ^^Thank you, that works. Also, replace if ($this->contents[$products_id]) { with if (isset($this->contents[$products_id])) { then all errors are cleared. Share this post Link to post Share on other sites
Hotclutch 205 Posted September 8, 2021 (edited) Warning: Trying to access array offset on value of type null /includes/classes/order.php on line 222 There are multiple warnings of this type in this section of code: $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID, 'currency' => $currency, 'currency_value' => $currencies->currencies[$currency]['value'], 'payment_method' => $payment, 'cc_type' => '', 'cc_owner' => '', 'cc_number' => '', 'cc_expires' => '', 'shipping_method' => $shipping['title'], 'shipping_cost' => $shipping['cost'], 'subtotal' => 0, 'tax' => 0, 'tax_groups' => array(), 'comments' => (tep_session_is_registered('comments') && !empty($comments) ? $comments : '')); If i do this: $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID, 'currency' => $currency, 'currency_value' => $currencies->currencies[$currency]['value'], 'payment_method' => $payment, 'cc_type' => '', 'cc_owner' => '', 'cc_number' => '', 'cc_expires' => '', #'shipping_method' => $shipping['title'], 'shipping_method' => isset($shipping['title']) ? $shipping['title'] : '', #'shipping_cost' => $shipping['cost'], 'shipping_cost' => isset($shipping['cost']) ? $shipping['cost'] : '', 'subtotal' => 0, 'tax' => 0, 'tax_groups' => array(), 'comments' => (tep_session_is_registered('comments') && !empty($comments) ? $comments : '')); the error is cleared, but is this the correct way to resolve this error? Edited September 8, 2021 by Hotclutch typo Share this post Link to post Share on other sites
Hotclutch 205 Posted September 8, 2021 what i gave above, don't work. Share this post Link to post Share on other sites
♥Smoky Barnable 83 Posted September 8, 2021 This is what I have and it seems to work. $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID, 'currency' => $currency, 'currency_value' => $currencies->currencies[$currency]['value'], 'payment_method' => $payment, 'cc_type' => '', 'cc_owner' => '', 'cc_number' => '', 'cc_expires' => '', 'shipping_method' => (isset($shipping['title']) ? $shipping['title'] : ''), 'shipping_cost' => (isset($shipping['cost']) ? $shipping['cost'] : 0), 'subtotal' => 0, 'tax' => 0, 'tax_groups' => array(), 'comments' => (isset($_SESSION['comments']) && !empty($comments) ? $comments : '')); The water in a vessel is sparkling; the water in the sea is dark. The small truth has words which are clear; the great truth has great silence. - Rabindranath Tagore Share this post Link to post Share on other sites
Hotclutch 205 Posted September 8, 2021 I had that also and it worked, but then as i did the others the debugger started to throw more errors. Need to look at it some more. $this->customer = array('firstname' => $customer_address['customers_firstname'], 'lastname' => $customer_address['customers_lastname'], 'company' => $customer_address['entry_company'], 'street_address' => $customer_address['entry_street_address'], 'suburb' => $customer_address['entry_suburb'], 'city' => $customer_address['entry_city'], 'postcode' => $customer_address['entry_postcode'], 'state' => ((tep_not_null($customer_address['entry_state'])) ? $customer_address['entry_state'] : $customer_address['zone_name']), 'zone_id' => $customer_address['entry_zone_id'], 'country' => array('id' => $customer_address['countries_id'], 'title' => $customer_address['countries_name'], 'iso_code_2' => $customer_address['countries_iso_code_2'], 'iso_code_3' => $customer_address['countries_iso_code_3']), 'format_id' => $customer_address['address_format_id'], 'telephone' => $customer_address['customers_telephone'], 'email_address' => $customer_address['customers_email_address']); $this->delivery = array('firstname' => $shipping_address['entry_firstname'], 'lastname' => $shipping_address['entry_lastname'], 'company' => $shipping_address['entry_company'], 'street_address' => $shipping_address['entry_street_address'], 'suburb' => $shipping_address['entry_suburb'], 'city' => $shipping_address['entry_city'], 'postcode' => $shipping_address['entry_postcode'], 'state' => ((tep_not_null($shipping_address['entry_state'])) ? $shipping_address['entry_state'] : $shipping_address['zone_name']), 'zone_id' => $shipping_address['entry_zone_id'], 'country' => array('id' => $shipping_address['countries_id'], 'title' => $shipping_address['countries_name'], 'iso_code_2' => $shipping_address['countries_iso_code_2'], 'iso_code_3' => $shipping_address['countries_iso_code_3']), 'country_id' => $shipping_address['entry_country_id'], 'format_id' => $shipping_address['address_format_id']); $this->billing = array('firstname' => $billing_address['entry_firstname'], 'lastname' => $billing_address['entry_lastname'], 'company' => $billing_address['entry_company'], 'street_address' => $billing_address['entry_street_address'], 'suburb' => $billing_address['entry_suburb'], 'city' => $billing_address['entry_city'], 'postcode' => $billing_address['entry_postcode'], 'state' => ((tep_not_null($billing_address['entry_state'])) ? $billing_address['entry_state'] : $billing_address['zone_name']), 'zone_id' => $billing_address['entry_zone_id'], 'country' => array('id' => $billing_address['countries_id'], 'title' => $billing_address['countries_name'], 'iso_code_2' => $billing_address['countries_iso_code_2'], 'iso_code_3' => $billing_address['countries_iso_code_3']), 'country_id' => $billing_address['entry_country_id'], 'format_id' => $billing_address['address_format_id']); All / most of these need to be done, then there is that one with tep_not_null ... Share this post Link to post Share on other sites
Hotclutch 205 Posted September 11, 2021 banner_manager.php throws an error. Warning: count(): Parameter must be an array or an object that implements Countable in admin/includes/classes/phplot.php on line 1324 if ( count($color_asked) == 3 ) { //already array of 3 rgb above is line 1324, the complete function is: function SetRgbColor($color_asked) { //Returns an array in R,G,B format 0-255 if ($color_asked == "") { $color_asked = array(0,0,0); }; if ( count($color_asked) == 3 ) { //already array of 3 rgb $ret_val = $color_asked; } else { // is asking for a color by string if(substr($color_asked,0,1) == "#") { //asking in #FFFFFF format. $ret_val = array(hexdec(substr($color_asked,1,2)), hexdec(substr($color_asked,3,2)), hexdec(substr($color,5,2))); } else { $ret_val = $this->rgb_array[$color_asked]; } } return $ret_val; } Share this post Link to post Share on other sites