Re: Upgraded PHP version from 5.3 to 7.0.33 now database functions are broken...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/09/2021 20:24, Bo Berglund wrote:
Half a week ago I upgraded my webhost website to use PHP 7 instead of the old
5.3 in order to make PHPmailer work, which it did after some work.
Upgrading PHP 5.3 to 7.0 is a very big jump (PHP 5.3 thru 5.6 contain major changes from the abandoned PHP 6, among others) and I would expect code to break. In exactly what ways it will break will depend on the code. If the code is still using a lot of early PHP 5 / PHP 4-like constructs, you're going to run into more problems than if it was written with 5.3 era best practices.

However, it is now well-trodden ground, so there's a number of tools, and plenty of articles and help out there for common issues people will encounter.

You can find a list of changes in the "Migrating" appendices in the PHP Manual:
https://www.php.net/manual/en/appendices.php

The appendices for older versions can be found in the Zend hosted "legacy" manual:
https://php-legacy-docs.zend.com/manual/php5/en/appendices

You'll want to pay particular attention to the "breaking changes" sections.

There are also tools that can help with finding most breaking changes. I've used the PHPCompatibility CodeSniffer ruleset, but there's also a range of others - a search for "php 5 to 7 migration tools" brings up some good articles.

While I've not yet used it myself, one tool I've heard good things about for actually making changes to your code is Rector. A quick search suggests this can handle PHP 5.3 to 7+ upgrades.


But a side effect of this seems to be that the database functionality of a
completely *different* web application on the same server has broken down...

I can now no longer use a Windows config application which updates the database
with new content by http posting new data to the database via php based
handlers.
If you previously used the old ext/mysql (mysql_* functions), these have been removed and you should use either MySQLi or PDO instead. Note that neither of these are drop-in replacements for the mysql_* functions. To aid in the upgrading process you can find shim libraries for ext/mysql that act as a bridge. You should replace these with either MySQLi or PDO as soon as possible tho to ensure your code continues to work in the future as these shim libraries are unlikely to be maintained and will stop working in future PHP versions themselves.


I suspect that there is some simple syntrax change that is the cause but I don't
know how to test it on the site. There are php handlers working as if the data
came from a web form but it does not, instead a POST call is created in the old
Windows application and sent to the server.

Any ideas how I can go about debugging this?
I am thinking about using curl to send the commands to the respective handler
php file or else I have to create a web form which can post data the same way as
the Windows App does...

Any suggestions on the best approach?
curl or a test webpage or something else?
PHP does not know or care exactly how the POST data was submitted. Data submitted through a Curl request will look exactly the same as data posted from a form on a web page. Creating a web page with a form that submits the same data as you expect to be submitted by another script via Curl is one way I have tested APIs in the past.

One notice from when I worked on the emailing form beginning of this week:

I was able to enable php errors sent to the calling browser using this:
ini_set('display_errors', '1');
at the top of the php files.
In addition the display_errors, you can direct errors to a log file using the `error_log` and `log_errors` ini directives (which can both be set using ini_set()): https://www.php.net/manual/en/errorfunc.configuration.php#ini.log-errors

You should also ensure that your `error_reporting` level includes warnings, notices and deprecation notices while upgrading because these indicate potential bugs in your change and behavior that may (/ does) change in future versions.

Sidenote: As I recall the exact "meaning" of E_ALL changed at some point between PHP 5.3 and PHP 7. You can always use '-1' to mean "all errors and notices of all types", or you may need to use a more specific error reporting level as shown in some of the examples on https://www.php.net/manual/en/function.error-reporting.php


Then I got error output related to the include done from a php file to the php
file doing debug logging, which was used in several php files
.
I had to change the includes like this:

From:  include 'logdebug.php';
To:    include_once 'logdebug.php';

Otherwise I got a strange error I had not seen before.

Could the same be the cause here regarding the following include:

include ($_SERVER["DOCUMENT_ROOT"] . '/php/appdbdata.php');

It is present in each of the function related php files and uses the construct
above to make sure the correct file is included no matter where the using php
file is located.

But do I always need include_once with PHP 7?

The behavior of include_once itself hasn't changed between PHP 5.3 and 7 as far as I recall. Most likely it's another issue that you need to fix, rather than swapping out include for include_once, which could itself break code if the file is supposed to be included multiple times.


Without seeing actual code or error messages it's very hard to advise on specific cases.

If you encounter specific problems you can't see how to solve, please post the full error message and the related code. It may help you to try to produce a short example that reproduces the issue.



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux