无法使用mysqli_connect连接,但mysql_connect可以正常工作..?

4

I got the credentials for connecting to MySQL directly from my hosting provider (1and1). However, when I try to connect with the following code:

$db_hostname = 'localhost/tmp/mysql5.sock';
$db_database = 'db543062602';
$db_username = '***********';
$db_password = '***********';

$dbc = mysqli_connect($db_hostname, $db_username, $db_password, $db_database)
    or die('Error connecting to MySQL server');
?>

ERROR:

Warning: mysqli_connect(): (HY000/2005): Unknown MySQL server host 'localhost/tmp/mysql5.sock' (1) in /homepages/... ... ... /purge.php on line 10 Error connecting to MySQL server

The credentials are all the same. In fact, it works when connecting using mysql_connect(), but it doesn't want to work with mysql_connect()! Any thoughts on what could be causing the problem?


$db_hostname 只是 localhost,不是吗? - Andy Holmes
1and1建议使用提供的路径,但我也尝试过不加'/tmp/...'。我还尝试使用IP地址,但无济于事。 - bboysupaman
有趣的是...我直接从1and1的“MySQL数据库设置和配置”页面复制了当前主机名。 - bboysupaman
你能试一下 $dbc = new mysqli($db_hostname, $db_username, $db_password, $db_database); 看看它是否也无法连接吗? - icecub
同样的问题。我觉得他们可能将我的信息列错了吗? - bboysupaman
显示剩余4条评论
4个回答

10

你可能误解了1&1的说明,或者他们犯了一个错误。

阅读mysqli_connect()的手册页面。它显示第一个参数应该是主机名,可以是名称或IP地址。不要在该参数中包含套接字。

您可以选择将套接字文件指定为第六个参数。

/* WRONG */
mysqli_connect('localhost/tmp/mysql5.sock', ... );

/* WRONG */
mysqli_connect('localhost:/tmp/mysql5.sock', ... );

/* RIGHT */
mysqli_connect('localhost', $db_username, $db_password, $db_database, null, '/tmp/mysql5.sock'); 

此外,我想知道为什么它们要求你指定套接字。他们应该在主机的php.ini文件中定义一个默认值,这样你就不必指定。除非他们在同一台主机上运行多个mysqld实例。


就是这样了!非常感谢比尔!我想知道为什么他们告诉我那是我的主机名?不过没关系!再次感谢! - bboysupaman

2

快速查看mysqli_connect()的手册页面

mysqli mysqli_connect ([ string $host = ini_get("mysqli.default_host") [, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") [, string $dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket = ini_get("mysqli.default_socket") ]]]]]] )

...和:

host

可以是主机名或IP地址。将NULL值或字符串“localhost”传递给此参数,则假定为本地主机。在可能的情况下,将使用管道而不是TCP/IP协议。

socket

指定应使用的套接字或命名管道。

我承认手册页面可能需要一个示例,但您正在尝试的语法没有任何痕迹。


请记住,mysqlimysql遗留版本的不同扩展

resource mysql_connect ([ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, bool $new_link = false [, int $client_flags = 0 ]]]]] )

...其中:

server

MySQL服务器。它还可以包括端口号。例如“hostname:port”或本地套接字的路径,例如“:/path/to/socket”用于localhost。


恕我直言,我必须不同意。如果您查看文档提供的示例(特别是过程式样例),您会发现我的语法完全匹配。 - bboysupaman
1
我可能忽略了什么,但我没有看到任何使用本地套接字或第一个参数不是主机名或IP地址的示例 :-? - Álvaro González
我必须道歉。我没有意识到你的意思是第一个参数不包括套接字。我的错误。我也会给你点赞。 - bboysupaman

0

我认为你的主机名应该是:

localhost:/tmp/mysql5.sock

而不是:

localhost/tmp/mysql5.sock

参考

或者似乎还有另一种方法可以找到您的主机,因此您应该尝试从面板获取数据。


@bboysupaman 你也可以查看http://help.1and1.com/hosting-c37630/databases-c85147/mysql-database-c37730/mysql-database-connection-credentials-a748746.html - Marcin Nabiałek
我现在来看一下。这真让人发疯。哈哈。 - bboysupaman
那个面板中的信息与我输入的相匹配。 - bboysupaman
所以你只需要与1&1支持团队联系。那可能是最好的解决方案。 - Marcin Nabiałek

0
请在您服务器的php.ini文件中添加以下代码: mysql.default_socket = /tmp/mysql5.sock;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接