我的代码昨天工作得很好,今天它突然不想连接到我的数据库。我没有更改它或代码上的任何设置,也没有更新任何软件。我所做的就是这样:

new PDO('mysql:host=localhost;port=3306;dbname=test', 'username', 'password');

我收到一条很好的异常消息:

Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in ...

事情是:我显然不是尝试使用 unix 套接字而是使用 TCP/IP 进行连接。我究竟做错了什么?我在这里缺少什么吗?

谢谢你的帮助。

有帮助吗?

解决方案

您使用的是Unix套接字。当读取<!>“localhost <!>”时; MySQL客户端库不会将其解释为TCP主机<!>“localhost <!>”;并解析该名称,但使用默认的Socket位置。要在本地计算机上使用TCP,必须使用127.0.0.1作为主机名。

在DSN中指定过去使用unix_socket而不是host。用于localhost的套接字的位置可以在编译时或在某些版本的PHP中使用pdo_mysql.default_socketphp.ini中定义。

其他提示

来自有关使用 PDO 连接到 MySQL 的 PHP 文档: PDO_MYSQL DNS

最后的注释说:

仅限 Unix:

当主机名设置为“ localhost”时,将与服务器的连接通过域套接字进行。如果PDO_MYSQL是针对libmysql编译的,则插座文件的位置位于LibMysQL的位置。如果PDO_MYSQL是针对mySQLND编译的,则可以通过pdo_mysql.default_socket设置设置默认套接字。

因此,为了解决这个问题,您必须在 php.ini 中正确配置 mysql.sock 的位置

  1. 找到您的 mysql.sock 文件。常见地点:

    • /tmp/mysql.sock
    • /tmp/mysql/mysql.sock
    • /var/mysql/mysql.sock
    • 或者如果您使用 MAMP 或 LAMP 在 tmp 文件夹中查找 mysql
  2. 编辑 php.ini 文件并正确设置 pdo_mysql.default_socket 的值

  3. 重新启动 Apache 服务器以获取 php.ini 文件中的更改

在Ubuntu上,您可以在php.ini中使用此设置

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

我刚刚添加了这一行:

'unix_socket'   => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock',

一切都很顺利。

Drush的文档有更新,此处

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top