PDOException: SQLSTATE[HY000] [2002] No such file or directory PDOException:SQLSTATE[HY000] [2002]:没有这样的文件或目录

25
我把PushChatServer文件夹放在htdocs目录下,并创建了名为puschat的数据库,尝试运行@"http://localhost/PushChatServer/api/test/database.php"。然后我遇到了以下异常。
我想做同样的事情来解释这个链接http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2
我已经完成了所有步骤,但是我得到了这个异常:
“无法连接到数据库。原因:异常'PDOException',消息为'SQLSTATE [HY000] [2002]找不到文件或目录',位于/Applications/MAMP/htdocs/PushChatServer/api/test/database.php的17行。堆栈跟踪:#0 /Applications/MAMP/htdocs/PushChatServer/api/test/database.php(17):PDO->__construct('mysql:host = loca ...','root','root',数组)#1 {main}”。

希望有人能回答这个问题,因为在我看来问题应该被更好地描述... - ZygD
看一下“PushChatServer”的文档。通常会有一个名为config.php的文件。现在它正在使用默认值(localhost和空用户和密码),这就是为什么它对你不起作用的原因。 - Marki555
所以根据教程你已经在主机上运行了MySQL,通过phpmyadmin设置了pushchat数据库和数据库用户,但它仍然不起作用? - Marki555
是的,MySql正在运行。所有事情都按预期工作,除了数据库连接问题。@Marki555 - user4276168
显示剩余5条评论
11个回答

54

1
由于某种奇怪的原因,这对我起作用了 - 在MySQL上使用Nextcloud。 - cslotty

27

快速测试(在shell中运行):

php -r "new PDO('mysql:host=localhost;dbname=test', 'username', 'password');"

SQLSTATE[HY000] [2002] No such file or directory的意思是php找不到mysql.default_socket文件。通过修改php.ini文件来修复它。在Mac上,它是 mysql.default_socket = /tmp/mysql.sock(请参见MySQL连接不起作用:2002没有这样的文件或目录

SQLSTATE[HY000] [1044] Access denied for user 'username'@'localhost' 恭喜!您现在已经拥有了正确的mysql.default_socket设置。修复dbname/username/password。

另请参见PHP中创建PDO连接时出错


谢谢!这对我起作用了。我在我的 Mac OS X 10.10 上使用 PHP 7.1.9,运行的是来自 macport 的 mysql 5.7 服务器。 对于 macport 的 mysql,mysql.sock 存储在 /opt/local/var/run/mysql57/mysqld.sock。 我在尝试使用 Laravel 5.5 运行 'php artisan migrate:install' 时遇到了这个错误。 - RJ Cole
你好社区,我虽然没有使用 Laravel,但仍然遇到了类似的错误,请看看这里的问题:https://stackoverflow.com/questions/60796332/this-php-code-works-in-localhost-but-not-on-server - Kiran Patel

7

我在使用简单的PDO代码时,遇到了与PHP 5.6.30(macOS Sierra)相同的错误:

$pdo = new PDO('mysql:host=localhost;dbname=db_php', 'root', '');

我也收到了同样的错误信息。为了解决这个问题,我在我的代码中将“localhost”更改为IP(回环)“127.0.0.1”:

$pdo = new PDO('mysql:host=127.0.0.1;dbname=db_php', 'root', '');

测试连接:

$ php -r "new PDO('mysql:host=127.0.0.1;dbname=db_php', 'root', '');"

这对我有用!

4

重新启动您的数据库和本地Web服务器:

sudo service mysqld restart

应该可以工作!


这个回答可能被点踩了,因为它不太“技术性”,但它对我很有用,所以点赞似乎是公平的。 - Mere Development

4

PDO对localhost有特殊处理:

来自http://php.net/manual/en/ref.pdo-mysql.connection.php

注意:仅适用于Unix系统:当主机名设置为“localhost”时,连接到服务器是通过域套接字进行的。如果PDO_MYSQL编译使用libmysqlclient,则套接字文件的位置位于libmysqlclient的编译位置。如果PDO_MYSQL编译使用mysqlnd,则可以通过pdo_mysql.default_socket设置默认套接字。

这就是为什么PDO和mysql_connect在localhost上会有不同行为的原因。

因此,如果您想使用PDO进行TCP连接,请永远不要使用localhost而是使用127.0.0.1。


3

我在使用Mysql PDO时遇到了同样的错误,这段代码对我有效!

<?php
$dsn = 'mysql:host=127.0.0.1;dbname=testdb';
$username = 'username';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

$dbh = new PDO($dsn, $username, $password, $options);
?>

我从http://php.net/manual/en/ref.pdo-mysql.connection.php获取了这段代码。


3

我不确定这对你是否有效;但我使用CakePHP,在我忘记在“host”末尾加上端口号时,我会遇到此错误。

希望这能帮到你!

Before

'test' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'root',
        'password' => 'root',
        'database' => 'mylogin',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'quoteIdentifiers' => false,
        'log' => false,
        //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
        'url' => env('DATABASE_TEST_URL', null),
    ]

之后

'test' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost:8080',
        'username' => 'root',
        'password' => 'root',
        'database' => 'mylogin',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'quoteIdentifiers' => false,
        'log' => false,
        //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
        'url' => env('DATABASE_TEST_URL', null),
    ]

3
在shell中运行以下命令,我认为它会有所帮助。
php artisan cache:clear
php artisan config:clear 
php artisan view:clear

我真的没想到解决方案会这么简单,但先生,这三行代码解决了我的问题。 - Semih Arslanoglu

1
在Mac OSX/MAMP上,您可能会在/Applications/MAMP/tmp/mysql文件夹中找到一个mysql.sock.lock文件。
您可以安全地删除mysql.sock.lock文件,并且您应该是处于良好状态的。

0
很高兴地报告,现在可以直接在/etc/php.ini中调整PDO套接字,尽管较旧的资料表明它只能在编译php/pdo时指定。
[Pdo_mysql]
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

[MySQLi]
mysqli.default_socket = /var/run/mysqld/mysqld.sock

[MySQL]
mysql.default_socket = /var/run/mysqld/mysqld.sock

源代码 PHP 设置 MySQL socket 位置


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