Edit report at http://bugs.php.net/bug.php?id=52434&edit=1
ID: 52434 User updated by: anthon dot pang at gmail dot com Reported by: anthon dot pang at gmail dot com -Summary: mysqlnd: host cannot be a hostname +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 New Comment: 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"; Previous Comments: ------------------------------------------------------------------------ [2010-07-25 06:31:41] dtajchre...@php.net 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