PEAR is discontinued

This is a static archive preserving historical releases and metadata. No new packages or updates will be published. For updates to existing packages, or to publish new packages, please use Composer and Packagist.

Home » Database » DB » Bug #2960

mysqli->connect fails due to unspecified socket/port

Details

Submitted2004-12-13 18:24 UTC
Fromoliver at realtsp dot com
Assigneddanielc
StatusClosed
PackageDB
PHP Version5.0.2
OSFreeBSD
Roadmaps(Not assigned)

Comments

[2004-12-13 18:24 UTC] oliver at realtsp dot com

Description:
------------
DB package V1.68.

The mysqli db->connect fails.

I googled around and searched the bug db, but couldn't find any mention of this problem. I was amazed since this seems like quite a generic problem for php5.0.2 with mysqli extension?

(I was previously running this code on php4.3.x with mysql extension and same version of DB without problems, but on RH Linux).

Have I missed something obvious? Seems to be related to Bug #1526, who is also using FreeBSD.

Reproduce code:
---------------
require_once('DB.php');
$dsn = 'mysqli://username:password@localhost/dbname';
$db = DB::connect($dsn);

I also tried with the array connect method, same result.

I tracked down the problem to these lines in mysqli.php:
} else {
$conn = @mysqli_connect(
$dsninfo['hostspec'],
$dsninfo['username'],
$dsninfo['password'],
$dsninfo['database'],
$dsninfo['port'],
$dsninfo['socket']
);
}

I inserted my own mysqli_connect call directly above the one in this one, with the same parameters, and it works. The difference is that I don't specify port and socket parameters which are optional according to here:
http://uk.php.net/manual/en/function.mysqli-connect.php

If I change the mysqli.php above lines as follows:

} else {
$conn = @mysqli_connect(
$dsninfo['hostspec'],
$dsninfo['username'],
$dsninfo['password'],
$dsninfo['database']
// ,
// $dsninfo['port'],
// $dsninfo['socket']
);
}

(ie commenting out the optional params) it works fine.

Proposed (proper) solution:

Should there be some logic to put "benign" values (rather than 'false' currently i think) into these params to stop mysqli_connect() getting confused? Or should we not pass them at all if they are not specified in dsn or connect array?

Expected result:
----------------
a valid DB object

Actual result:
--------------
DB Error: connect failed

[2004-12-14 08:13 UTC] oliver at realtsp dot com

thanks for coming back so quickly. sorry, yes I did the vardump when i was tracking down the bug and should have posted that output here in the first place, so here it is (db credentials changed for security reasons of course):

array(9) {
["phptype"]=>
string(6) "mysqli"
["dbsyntax"]=>
string(6) "mysqli"
["username"]=>
string(13) "username"
["password"]=>
string(8) "password"
["protocol"]=>
string(3) "tcp"
["hostspec"]=>
string(9) "localhost"
["port"]=>
bool(false)
["socket"]=>
bool(false)
["database"]=>
string(17) "dbname"
}

so the values for port and socket are both bool(false). Hardcoding them as null in the mysqli_connect() call results in the same error.

Additional info: The verbose version of the error is:
nativecode=Can't connect to local MySQL server through socket '' (2)

looks like the mysqli_connect() call interprets both bool(false) and null as an empty string rather than ignoring these parameters and fails as a result.

(I commented those lines out again after null didn't work just to prove that not passing the extra params definitely works, and it does).

[2004-12-14 08:25 UTC] oliver at realtsp dot com

I also tried just commenting the socket param and leaving the port line in tact. This works! so the problem is specific to the socket param only.

The guy in Bug #1526 also spoke about using '/tmp/mysql.sock' as the socket param. This is indeed the correct path to the default location of the mysql unix socket under FreeBSD. Putting this in the mysqli_connect() call, makes it work.

However, this is not really a solution, because the mysqli extension should figure out to use the local socket if connecting to localhost, or at least that is my interpretation of this from the php manual:

http://uk.php.net/manual/en/function.mysqli-connect.php
<quote>
Passing the NULL value or the string "localhost" to this parameter, the local host is assumed. When possible, pipes will be used instead of the TCP/IP protocol.
</quote>

[2004-12-14 08:31 UTC] oliver at realtsp dot com

so I have put in a slightly tidier "fix" than just the commenting of the socket param. Not sure if this qualifies as a patch? It works for me, but not sure about other implications.

} else {
if ($dsninfo['socket']) {
$conn = @mysqli_connect(
$dsninfo['hostspec'],
$dsninfo['username'],
$dsninfo['password'],
$dsninfo['database'],
$dsninfo['port'],
$dsninfo['socket']
);
} else {
$conn = @mysqli_connect(
$dsninfo['hostspec'],
$dsninfo['username'],
$dsninfo['password'],
$dsninfo['database'],
$dsninfo['port']
);

}
}

over to you ;-)

[2004-12-14 17:43 UTC] oliver at realtsp dot com

I have searched the php bugs db for entries relating to mysqli_connect but found nothing.

I am not sure I agree that this is a php problem. Basically mysqli.php is calling the mysqli_connect() php function with all optional parameters but failing to provide valid values for some of them (ie the port and socket params).

If I say to the php guys, here I want to be able to call mysqli_connect() with socket=false and expect it to just ignore the parameter eventhough I have passed it, then they will just tell me to not do that, right?

[2004-12-14 18:54 UTC] oliver at realtsp dot com

I am not in a position to compile 5.0.3RC2. But I have posted this bug:
http://bugs.php.net/bug.php?id=31094

If this produces no result, I will test again with 5.0.3 when it is released.

[2004-12-19 08:13 UTC] oliver at realtsp dot com

you were right. just installed php-5.0.3 and the problem has been fixed. closing this bug

[2005-01-21 03:54 UTC] cere dot yahoo at gmail dot com

This appears to still be a problem in php4-3.10. I am having this exact same problem...though I cannot find a situation that fixes it yet.

-Cere