PDOException:SQLSTATE[HY000] [2002]没有这样的文件或目录

问题描述 投票:0回答:11

我已将 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', Array) #1 {main}

php mamp
11个回答
54
投票

您需要将主机从

localhost
更改为
127.0.0.1

Laravel 4:在您的

app/config/database.php
中尝试将主机从
localhost
更改为
127.0.0.1

Laravel 5:在

.env
文件中,将
DB_HOST
localhost
更改为
127.0.0.1

来源:PDOException SQLSTATE[HY000] [2002]没有这样的文件或目录


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] 用户“用户名”@“localhost”的访问被拒绝 恭喜!您现在拥有正确的 mysql.default_socket 设置。修复您的数据库名/用户名/密码。

另请参阅在 PHP 中创建与 PDO 的连接时出错


7
投票

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

$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
投票

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。


4
投票

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

sudo service mysqld restart

应该可以!


3
投票

我不确定这是否适合您;但我使用 CakePHP,每当我忘记将端口号放在“主机”末尾时,就会收到此错误。

希望这有帮助!

之前

'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
投票

我对 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
投票

在 shell 中运行以下命令,我认为会有帮助。

php artisan cache:clear
php artisan config:clear 
php artisan view:clear

1
投票

在 Mac OSX/MAMP 上,您可能会在 /Applications/MAMP/tmp/mysql 文件夹中找到 mysql.sock.lock 文件。

您可以安全地删除文件 mysql.sock.lock 并且您应该处于良好状态。


0
投票

很高兴报告 PDO 套接字现在可以直接在 /etc/php.ini 中调整,尽管旧的来源表明它只能在编译 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 套接字位置


-1
投票

刚刚遇到了同样的问题,问题是密码。在教程中,作者将密码列出为:

"d]682\#%yl1nb3"

因此,根据@Marki555给出的建议,我查看了配置文件 - api_config.php。那里列出的密码是:

"d]682\#%yI1nb3"

大写“I”是导致问题的原因,因为您在数据库上为用户设置的密码具有小写l的密码,但它实际上正在寻找大写I。在我将pushchat用户的密码更改为大写后我,成功了!

© www.soinside.com 2019 - 2024. All rights reserved.