From 2a6e22d8974bb02de576ff100e7476d8cdcda3ca Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Fri, 23 Jun 2017 14:41:39 -0700 Subject: [PATCH] CRM-20768 - install - Accept mysql port == Background == In previous releases, the web-based installation script allowed you to enter the MySQL "server" with a `host:port` combination (e.g. `127.0.0.1:3307`). I believe this regressed during the mysql=>mysqli transition. == Before == If you use the web-based install UI and enter a `host:port` combination, the error messages indicate a confusing mix of information (e.g. some indicating port 3306, some indicating port 3307). == After == If you use the web-based install UI and enter a `host:port` combination, it uses the specified port. ---------------------------------------- * CRM-20768: Web-based installation should accept non-standard MySQL port https://issues.civicrm.org/jira/browse/CRM-20768 --- install/index.php | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/install/index.php b/install/index.php index cdd7012d3c51..74e3e6c7b30a 100644 --- a/install/index.php +++ b/install/index.php @@ -550,6 +550,30 @@ public function checkdatabase($databaseConfig, $dbName) { } } + /** + * Connect via mysqli. + * + * This is exactly the same as mysqli_connect(), except that it accepts + * the port as part of the `$host`. + * + * @param $host + * @param $username + * @param $password + * @param string $database + * @return \mysqli + */ + protected function connect($host, $username, $password, $database = '') { + $hostParts = explode(':', $host); + if (count($hostParts) > 1) { + list ($host, $port) = $hostParts; + } + else { + $port = ''; + } + $conn = @mysqli_connect($host, $username, $password, $database, $port); + return $conn; + } + /** * Check everything except the database. */ @@ -950,7 +974,7 @@ public function requireApacheModule($moduleName, $testDetails) { */ public function requireMysqlConnection($server, $username, $password, $testDetails) { $this->testing($testDetails); - $this->conn = @mysqli_connect($server, $username, $password); + $this->conn = $this->connect($server, $username, $password); if ($this->conn) { return TRUE; @@ -967,7 +991,7 @@ public function requireMysqlConnection($server, $username, $password, $testDetai */ public function requireMySQLServer($server, $testDetails) { $this->testing($testDetails); - $conn = @mysqli_connect($server, NULL, NULL); + $conn = $this->connect($server, NULL, NULL); if ($conn || mysqli_connect_errno() < 2000) { return TRUE; @@ -1012,7 +1036,7 @@ public function requireMySQLVersion($version, $testDetails) { */ public function requireMySQLInnoDB($server, $username, $password, $database, $testDetails) { $this->testing($testDetails); - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); if (!$conn) { $testDetails[2] .= ' ' . ts("Could not determine if MySQL has InnoDB support. Assuming no."); $this->error($testDetails); @@ -1047,7 +1071,7 @@ public function requireMySQLInnoDB($server, $username, $password, $database, $te */ public function requireMySQLTempTables($server, $username, $password, $database, $testDetails) { $this->testing($testDetails); - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); if (!$conn) { $testDetails[2] = ts('Could not login to the database.'); $this->error($testDetails); @@ -1077,7 +1101,7 @@ public function requireMySQLTempTables($server, $username, $password, $database, */ public function requireMySQLTrigger($server, $username, $password, $database, $testDetails) { $this->testing($testDetails); - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); if (!$conn) { $testDetails[2] = ts('Could not login to the database.'); $this->error($testDetails); @@ -1117,7 +1141,7 @@ public function requireMySQLTrigger($server, $username, $password, $database, $t */ public function requireMySQLLockTables($server, $username, $password, $database, $testDetails) { $this->testing($testDetails); - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); if (!$conn) { $testDetails[2] = ts('Could not connect to the database server.'); $this->error($testDetails); @@ -1164,7 +1188,7 @@ public function requireMySQLLockTables($server, $username, $password, $database, */ public function requireMySQLAutoIncrementIncrementOne($server, $username, $password, $testDetails) { $this->testing($testDetails); - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); if (!$conn) { $testDetails[2] = ts('Could not connect to the database server.'); $this->error($testDetails); @@ -1198,7 +1222,7 @@ public function requireMySQLAutoIncrementIncrementOne($server, $username, $passw */ public function requireMySQLThreadStack($server, $username, $password, $database, $minValueKB, $testDetails) { $this->testing($testDetails); - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); if (!$conn) { $testDetails[2] = ts('Could not connect to the database server.'); $this->error($testDetails); @@ -1242,7 +1266,7 @@ public function requireDatabaseOrCreatePermissions( $onlyRequire = FALSE ) { $this->testing($testDetails); - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); $okay = NULL; if (@mysqli_select_db($conn, $database)) { @@ -1381,7 +1405,7 @@ class Installer extends InstallRequirements { * @param $database */ public function createDatabaseIfNotExists($server, $username, $password, $database) { - $conn = @mysqli_connect($server, $username, $password); + $conn = $this->connect($server, $username, $password); if (@mysqli_select_db($conn, $database)) { // skip if database already present