【问题标题】:PDOException: SQLSTATE[HY000] [2002] No such file or directoryPDOException: SQLSTATE[HY000] [2002] 没有这样的文件或目录
【发布时间】:2015-06-24 02:00:03
【问题描述】:

我已将 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

我已经做了所有这些,但我得到了这个例外

无法连接到数据库。原因:在/Applications/MAMP/htdocs/PushChatServer/api/test/database.php:17 中带有消息“SQLSTATE[HY000] [2002] 没有这样的文件或目录”的异常“PDOException”:17 堆栈跟踪:#0 /Applications/MAMP /htdocs/PushChatServer/api/test/database.php(17): PDO->__construct('mysql:host=loca...', 'root', 'root', Array) #1 {main}

【问题讨论】:

标签: php mamp


【解决方案1】:

重启你的数据库和本地网络服务器:

sudo service mysqld restart

应该可以了!

【讨论】:

  • 这被否决了大概是因为它不是一个非常“技术性”的答案,但它对我有用,所以投票似乎只是公平的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我真的没想到解决方案这么简单,但是先生这三行解决了我的问题
    【解决方案4】:

    您需要将主机从localhost 更改为127.0.0.1

    Laravel 4:在您的 app/config/database.php 中尝试将主机从 localhost 更改为 127.0.0.1

    Laravel 5:在 .env 文件中,将 DB_HOSTlocalhost 更改为 127.0.0.1

    来源:PDOException SQLSTATE[HY000] [2002] No such file or directory

    【讨论】:

    • 不管出于什么奇怪的原因,这对我有用 - MySQL 上的 nextcloud。
    【解决方案5】:

    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

    【讨论】:

      【解决方案6】:

      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。

      【讨论】:

        【解决方案7】:

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

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

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

        $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', '');"
        

        这项工作是给我的!

        【讨论】:

          【解决方案8】:

          我不确定这是否适合您;但是我使用的是 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),
              ]
          

          【讨论】:

            【解决方案9】:

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

            php -r "new PDO('mysql:hostname=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 (参见PHP - MySQL connection not working: 2002 No such file or directory

            SQLSTATE[HY000] [1044] 用户 'username'@'localhost' 的访问被拒绝 恭喜!您现在拥有正确的 mysql.default_socket 设置。修复您的数据库名/用户名/密码。

            另见Error on creating connection to PDO in PHP

            【讨论】:

            • 谢谢!这对我有用。我在 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”时遇到了这个错误。
            • 你好社区,即使我没有使用 laravel,我也遇到了类似的错误,你能看看这里的问题吗stackoverflow.com/questions/60796332/…
            【解决方案10】:

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

            "d]682\#%yl1nb3"
            

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

            "d]682\#%yI1nb3"
            

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

            【讨论】:

              猜你喜欢
              • 2020-05-07
              相关资源
              最近更新 更多