Edit report at http://bugs.php.net/bug.php?id=52434&edit=1
ID: 52434
Comment by: neweracracker at gmail dot com
Reported by: anthon dot pang at gmail dot com
Summary: mysqlnd: host cannot be "localhost" when connecting
to tcp port
Status: Bogus
Type: Bug
Package: MySQL related
Operating System: Ubuntu 10.04
PHP Version: 5.3.3
Block user comment: N
New Comment:
Hello.
I am able to reproduce this issue with:
Windows 7 build 7600 (Ultimate Edition) x86
PHP Version 5.3.3 MSVC6
mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $
MySQL 5.1.50
Steps to reproduce:
1. Download phpmyadmin
2. Extract on html/www/public_html (or similar)
3. Try to connect to mysql (example: login)
4. It won't work, stop php
5. Edit config.inc.php and change localhost to 127.0.0.1
6. No more errors. I guess this needs a fix
Previous Comments:
------------------------------------------------------------------------
[2010-07-25 19:00:49] anthon dot pang at gmail dot com
Ok. I'll open a Documentation bug for this compat buster.
------------------------------------------------------------------------
[2010-07-25 18:33:43] [email protected]
The patch won't be added as then "localhost" has two meanings - one time
meaning "use the unixdomain socket in the default location" and one time
actually "resolve localhost and use TCP" as it is taught in many places
that "localhost" in MySQL has the first meaning we keep it there.
------------------------------------------------------------------------
[2010-07-25 09:05:29] anthon dot pang at gmail dot com
Seriously?
http://www.php.net/manual/en/ref.pdo-mysql.connection.php gives two
examples:
mysql:host=localhost;port=3307;dbname=testdb
mysql:unix_socket=/tmp/mysql.sock;dbname=testdb
And my DSN (constructed by Zend Framework) follows the first example.
Where does it say I have to define the unix socket in php.ini if I
intend to connect using the tcp port?
Here's the fix:
--- mysqlnd.c.bak 2010-07-25 02:47:29.000000000 -0400
+++ mysqlnd.c 2010-07-25 02:49:37.000000000 -0400
@@ -635,7 +635,7 @@
char * transport = NULL;
int transport_len;
#ifndef PHP_WIN32
- if (host_len == sizeof("localhost") - 1 &&
!strncasecmp(host, "localhost", host_len)) {
+ if (!port && host_len == sizeof("localhost") - 1 &&
!strncasecmp(host, "localhost", host_len)) {
DBG_INF_FMT("socket=%s", socket? socket:"n/a");
if (!socket) {
socket = "/tmp/mysql.sock";
------------------------------------------------------------------------
[2010-07-25 06:31:41] [email protected]
Tell PHP where your mysql.sock file is via the DSN or
pdo_mysql.default_socket in
the php.ini file and your error will go away. Your conclusion is way
off.
http://www.php.net/manual/en/ref.pdo-mysql.connection.php
------------------------------------------------------------------------
[2010-07-25 04:42:45] anthon dot pang at gmail dot com
Description:
------------
With PDO_MYSQL, if PHP is linked with mysql client libraries (instead of
mysqlnd), the DSN can contain a host parameter with a hostname, e.g.,
host=localhost.
However, with mysqlnd, the host has to be an ip address, e.g.,
host=127.0.0.1. This occurs for '--with-mysqli=mysqlnd' or
'--with-pdo-mysql=mysqlnd'. It appears mysqlnd wants to use a Unix
socket even though the port is explictly specified,
This backward incompatibility surprises users migrating from php 5.2.x
and find their apps suddenly can't connect.
MySQL 5.1.41
Test script:
---------------
>From Zend Framework 1.10.6:
$_isConnected = @mysqli_real_connect(
$this->_connection,
$this->_config['host'],
$this->_config['username'],
$this->_config['password'],
$this->_config['dbname'],
$port
);
Expected result:
----------------
Expect it to connect.
Actual result:
--------------
Warning: PDO::__construct() [pdo.--construct]: [2002] No such file or
directory (trying to connect via unix:///tmp/mysql.sock) in
/var/www/libs/Zend/Db/Adapter/Pdo/Abstract.php on line 129
SQLSTATE[HY000] [2002] No such file or directory
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=52434&edit=1