Jump to content

PDO Port handling bug


DigitalSparky

Recommended Posts

Hi folks,

Couldn't find this reported, however it seems there's a bit of an issue when attempting to install 4.0.0 using PHP 7.

It appears there's a syntax error when taking into account MySQL Ports

I've configured my development environment to use MySQL on port 13306 and entered the host as 127.0.0.1:13306
Installation works perfectly on PHP 5.6.23 (via FPM & CLI), however via PHP 7.0.18 it throws the following error:

SQLSTATE[HY000] [2002] Failed to parse address "127.0.0.1:13306:3306"

Changing config.php to the host as 127.0.0.1 and port 13306 does not remedy this issue, as such it appears that I'm unable to use PHP 7.0 with MySQL from a fresh install.

Oddly enough an upgrade, admittedly on a slightly older php7 version, worked without issue.

Note: it was installed using 127.0.0.1:13306 in the host string, as there was no separate port, despite the configuration having a port option.
The exception is occurring on line 74 of core/ServiceProviders/MinphpBridge.php (the new PDO connection setup).

var_dump($dbInfo); shows the following data:
 

array(10) {
  ["driver"]=>
  string(5) "mysql"
  ["host"]=>
  string(9) "127.0.0.1"
  ["port"]=>
  string(5) "13306"
  ["database"]=>
  string(6) "blesta"
  ["user"]=>
  string(6) "blesta"
  ["pass"]=>
  string(6) "blesta"
  ["persistent"]=>
  bool(false)
  ["charset_query"]=>
  string(16) "SET NAMES 'utf8'"
  ["sqlmode_query"]=>
  string(26) "SET sql_mode='TRADITIONAL'"
  ["options"]=>
  array(0) {
  }
}

I've confirmed via debug that the data being input to new PDO is:

string(40) "mysql:dbname=blesta;host=127.0.0.1:13306"

Changing lines 64 to 74 from:

            $connection = new PDO(
                $dbInfo['driver'] . ':dbname=' . $dbInfo['database']
                . ';host=' . $dbInfo['host'] . (
                    isset($dbInfo['port'])
                    ? ':' . $dbInfo['port']
                    : ''
                ),
                $dbInfo['user'],
                $dbInfo['pass'],
                $options
            );

to

            $connection = new PDO(
                $dbInfo['driver'] . ':dbname=' . $dbInfo['database']
                . ';host=' . $dbInfo['host'] . (
                    isset($dbInfo['port'])
                    ? ';port=' . $dbInfo['port']
                    : ''
                ),
                $dbInfo['user'],
                $dbInfo['pass'],
                $options
            );

Resolves the issue, and the site is now operational.

This fix obviously relies on the port being explicitly set, so having a field to fill in that port is still required.

Edit: looks like it worked doing the upgrade because my other upgrade was on my other laptop, that runs mysql on 3306...

Link to comment
Share on other sites

  • 2 weeks later...
  • Tyson locked this topic
Guest
This topic is now closed to further replies.
×
×
  • Create New...