wake-up-neo.com

PDOException SQLSTATE [HY000] [2002] Keine solche Datei oder kein solches Verzeichnis

Ich glaube, dass ich meine (sehr einfache) Site erfolgreich für fortrabbit bereitgestellt habe, aber sobald ich eine Verbindung zu SSH herstelle, um einige Befehle auszuführen (z. B. php artisan migrate oder php artisan db:seed), erhalte ich eine Fehlermeldung:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

Irgendwann muss die Migration funktioniert haben, denn meine Tabellen sind da - aber das erklärt nicht, warum es jetzt bei mir nicht funktioniert.

258
Daniel Hollands

Die Fehlermeldung zeigt an, dass eine MySQL-Verbindung über Socket versucht wird (was nicht unterstützt wird).

Im Kontext von Laravel (Handwerker) möchten Sie wahrscheinlich eine andere/die richtige Umgebung verwenden. ZB: php artisan migrate --env=production (oder in welcher Umgebung auch immer). Siehe hier .

119
ukautz

Laravel 4: "Host" in der app/config/database.php Datei von "localhost" auf "127.0.0.1" ändern

Laravel 5: Ändern Sie "DB_Host" in der Datei .env von "localhost" in "127.0.0.1".

Ich hatte genau das gleiche Problem. Keine der oben genannten Lösungen hat bei mir funktioniert. Ich habe das Problem gelöst, indem ich den "Host" in der Datei /app/config/database.php von "localhost" auf "127.0.0.1" geändert habe.

Ich bin mir nicht sicher, warum "localhost" standardmäßig nicht funktioniert, aber ich habe diese Antwort in einer ähnlichen Frage gefunden, die in einem symfony2-Post gelöst wurde. https://stackoverflow.com/a/9251924/123156

Update: Einige Leute haben gefragt, warum dieses Update funktioniert, deshalb habe ich ein wenig über das Thema recherchiert. Es scheint, als würden sie unterschiedliche Verbindungstypen verwenden, wie in diesem Beitrag erläutert https://stackoverflow.com/a/9715164/123156

Das Problem, das hier auftrat, ist, dass "localhost" einen UNIX-Socket verwendet und die Datenbank nicht im Standardverzeichnis finden kann. "127.0.0.1" verwendet jedoch TCP (Transmission Control Protocol), was im Wesentlichen bedeutet, dass es über das "lokale Internet" auf Ihrem Computer ausgeführt wird und in diesem Fall wesentlich zuverlässiger ist als der UNIX-Socket.

587
stuyam

Ich habe das gleiche Problem und verwende Mac OS X 10.10 Yosemite. Ich habe den Apache Server und PHP aktiviert, die bereits mit dem Betriebssystem geliefert werden. Dann habe ich gerade die mCrypt-Bibliothek konfiguriert, um loszulegen. Danach, als ich mit Modellen und DB arbeitete, bekam ich den Fehler:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

Der Grund, den ich gefunden habe, ist, dass PHP und MySQL sich nicht selbst verbinden können. Um dieses Problem zu beheben, folge ich den folgenden Schritten:

  1. Öffne ein Terminal und verbinde dich mit mysql mit:

    mysql -u root -p
    
  2. Sie werden nach dem zugehörigen Passwort gefragt. Sobald Sie die mysql-Eingabeaufforderung erhalten, geben Sie den folgenden Befehl ein:

    mysql> show variables like '%sock%'
    
  3. Sie erhalten so etwas:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Behalten Sie den Wert der letzten Zeile bei:

    /tmp/mysql.sock
    
  5. Suchen Sie in Ihrem Projektordner laravel nach der Datei database.php , in der Sie die DB-Verbindung konfigurieren Parameter. Fügen Sie im Abschnitt mysql die nächste Zeile am Ende hinzu:

    'unix_socket' => '/tmp/mysql.sock'
    
  6. Sie müssen so etwas haben:

    'mysql' => array(
            'driver'    => 'mysql',
            'Host'      => 'localhost',
            'database'  => 'SchoolBoard',
            'username'  => 'root',
            'password'  => 'venturaa',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/tmp/mysql.sock',
        ),
    

Jetzt nur noch die Änderungen speichern und die Seite neu laden und es muss funktionieren!

80
Alex Ventura

Ich bin aus einem anderen Grund auf den Fehler [PDOException] SQLSTATE[HY000] [2002] No such file or directory gestoßen. Ich habe gerade einen brandneuen LAMP-Stack auf Ubuntu 12.04 mit Apache 2.4.7, PHP v5.5.10 und MySQL 5.6.16 fertiggestellt. Ich habe meine Seiten zurückverlegt und sie angezündet. Aber ich konnte meine Laravel 4.2.x-basierte Site wegen des [PDOException] oben nicht laden. Also überprüfte ich php -i | grep pdo und bemerkte diese Zeile:

pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock

Aber in meiner /etc/my.cnf befindet sich die Socken-Datei tatsächlich in /var/run/mysqld/mysqld.sock.

Also habe ich meine php.ini geöffnet und den Wert für pdo_mysql.default_socket gesetzt:

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

Dann habe ich Apache neu gestartet und php -i | grep pdo überprüft:

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

Das hat es für mich behoben.

45
dcarrith

Die Antwort von @stuyam löste das Problem "Keine solche Datei oder Verzeichnis" für mich

Kurze Antwort: Ändern Sie "Host" in der Datei /app/config/database.php von "localhost" auf "127.0.0.1".

Aber dann hatte ich einen Fehler "Verbindung abgelehnt". Wenn jemand das gleiche Problem hatte, bestand meine Lösung darin, die Datei app/config/local/database.php so zu aktualisieren, dass der Port 8889 lautet:

'mysql' => array(
        'driver'    => 'mysql',
        'Host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
40
Marlow

Wenn Sie Laravel Homestead verwenden, stellen Sie sicher, dass Sie die Befehle auf dem Server aufrufen.

Homestead ssh

Dann gehen Sie einfach in das richtige Verzeichnis und geben dort Ihren Befehl ein.

24
Koen B.

In meinem Fall hatte ich überhaupt kein Problem, habe nur vergessen, den MySQL-Dienst zu starten ...

Sudo service mysqld start
17
Carlos ABS

Mamp user enable option Erlaubt den Netzwerkzugriff auf MYSQL

enter image description here

16
George John

Fügen Sie den Pfad mysql.sock in die Datei database.php wie im folgenden Beispiel hinzu

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

Beispiel

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'Host' => env('DB_Host', 'localhost'),
        'port' => env('DB_PORT', '8889'),
15
RaviNila

Es hat funktioniert, nachdem ich von DB_Host=localhost zu DB_Host=127.0.0.1 in der ENV-Datei gewechselt habe

13
NuOne

Dies liegt daran, dass PDO den "localhost" -Host speziell behandelt:

Hinweis: Nur Unix: Wenn der Hostname auf "localhost" eingestellt ist, wird die Verbindung zum Server über einen Domain-Socket hergestellt. Wenn PDO_MYSQL mit libmysqlclient kompiliert wird, befindet sich der Speicherort der Socket-Datei am Speicherort von libmysqlclient in. Wenn PDO_MYSQL mit mysql kompiliert wird und ein Standard-Socket über die Einstellung pdo_mysql.default_socket festgelegt werden kann.

(von http://php.net/manual/en/ref.pdo-mysql.connection.php )

Wenn Sie localhost in 127.0.0.1 ändern, wird die Verwendung von TCP "erzwungen".

Hinweis: mysqli_connect funktioniert gut mit localhost.

13
Thomas Decaux

Aufbauend auf der Antwort von @dcarrith ...

Anstatt die Konfigurationsdateien zu bearbeiten, habe ich an der Stelle, an der PHP sucht, einen Alias ​​erstellt, der eine Verbindung zum echten mysql.sock herstellt. ( Quelle )

Führen Sie einfach diese beiden Befehle aus (kein Neustart erforderlich):

mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
11
Justin

Schritt 1

Finden Sie den Pfad zu Ihrem Unix_Socket. Führen Sie dazu einfach netstat -ln | grep mysql aus.

Sie sollten so etwas bekommen

unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock

Schritt 2

Nimm das und füge es in deinen nix_socket Parameter ein

'mysql' => array(
            'driver'    => 'mysql',
            'Host'      => '67.25.71.187',
            'database'  => 'dbname',
            'username'  => 'username',
            'password'  => '***',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket'    => '/var/run/mysqld/mysqld.sock' <-----
            ),
        ),

Ich hoffe es hilft !!

10
kyo

Ich arbeite mit MAMP Pro und hatte beim Migrieren (Erstellen von DB-Tabellen) ein ähnliches Problem. Ich habe auch ein paar dieser Vorschläge ausprobiert, habe es aber nicht für mich getan.

Also habe ich einfach (nach einer Stunde googeln) zwei Dinge zur /config/database.php hinzugefügt.

'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'

Funktioniert jetzt gut!

7
anoraq

Überprüfen Sie Ihren Port sorgfältig. In meinem Fall war es 8889 und ich verwende 8888. Ändern Sie "DB_Host" von "localhost" auf "127.0.0.1" und umgekehrt

3
Ahmed Awan

Ab Laravel 5 befinden sich der Datenbank-Benutzername und das Kennwort in der ENV-Datei, die im Projektverzeichnis vorhanden ist, z.

DB_Host=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1

Wie Sie sehen, überschreiben diese Umgebungsvariablen die 'forge'-Zeichenfolgen hier, sodass das Ändern dieser Zeichenfolgen keine Auswirkungen hat:

    'mysql' => [
        'driver'    => 'mysql',
        'Host'      => env('DB_Host', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

Weitere Informationen finden Sie hier https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables

2
malhal

Versuch, eine Verbindung zu localhost herzustellen:

SQLSTATE[HY000] [2002] No such file or directory

Versuch, eine Verbindung zu 127.0.0.1 herzustellen:

SQLSTATE[HY000] [2002] Connection refused

OK, kommentieren/entfernen Sie einfach die folgende Einstellung aus my.cnf (unter OS X 10.5: /opt/local/etc/mysqlxx/my.cnf), um Folgendes zu erhalten:

[mysqld]
# skip-networking

Stoppen und starten Sie natürlich MySQL Server.

2
Anna Logg

Ich bin auf dieses Problem gestoßen, als ich PHPUnit in Elixir/Gulp und Homestead als meine Vagrant-Umgebung ausgeführt habe.

In meinem Fall habe ich die .env-Datei von DB_Host=localhost in DB_Host=192.168.10.10 bearbeitet, wobei 192.168.10.10 die IP meines Vagrant/Homestead-Hosts ist.

2
user5373314

Wenn Sie Laravel Homestead verwenden, finden Sie hier Einstellungen

(einschließlich Vagrant-Virtual Machine)

. bash-profile

alias vm="ssh [email protected] -p 2222"

database.php

    'mysql' => [
        'driver'    => 'mysql',
        'Host'      => env('DB_Host', '127.0.0.1'),
        'database'  => env('DB_DATABASE', 'Homestead'),
        'username'  => env('DB_USERNAME', 'Homestead'),
        'password'  => env('DB_PASSWORD', 'secret'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

Terminal

vm

[email protected]:~/Code/projectFolder  php artisan migrate:install
1
ErcanE

Wenn noch jemand nach der Antwort sucht, überprüfen Sie einfach Ihre .env-Datei. Aus irgendeinem Grund laravel eine .env.example-Datei erstellen, sodass all diese Antworten bei mir nicht funktionierten. Ich habe mein Problem beim Umbenennen von .env.example in .env behoben

1
Alberto Alegria

Ich hatte diese Probleme, als ich meine Anwendung mit Docker-Containern ausführte.

Die Lösung war der Name des MySQL-Dienstcontainers, den ich in docker_compose.yml auf DB_Host verwendet habe. In meinem Fall war es db:

DB_Host=db

Ich hoffe es hilft.

1
Lano

Ich hatte ähnliche Probleme beim Zugriff auf meine Drupal Website. Ich habe das Problem behoben, indem ich die Befehlszeile geöffnet und meinen MySQL-Server oder -Dienst neu gestartet habe:

service mysqld restart

Das sollte funktionieren. Wenn nicht, starten Sie Ihren lokalen Webserver neu:

service httpd restart

Das sollte genug sein. Hoffe, es funktioniert auch für andere Umgebungen. Beachten Sie, dass diese Befehle im Allgemeinen Superuser-Berechtigungen erfordern.

1
RAWGIT

Dies passierte mir, weil MySQL nicht lief. MySQL konnte nicht gestartet werden, da das Verzeichnis /usr/local/etc/my.cnf.d/ fehlte.

Dies wurde von meiner /usr/local/etc/my.cnf Konfigurationsdatei als Glob-Include (include /usr/local/etc/my.cnf.d/*.cnf) benötigt.

Durch Ausführen von mkdir /usr/local/etc/my.cnf.d und anschließendes Starten von MySQL wurde das Problem behoben.

1
james2doyle

In meinem Fall habe ich php artisan migrate auf meinem Mac-Terminal ausgeführt, als ich ssh in vagrant einbinden und von dort ausführen musste. Hoffe das hilft jemandem die Kopfschmerzen.

1
Brad

Wenn Sie eine virtuelle Maschine verwenden, stellen Sie sicher, dass Sie in diese Maschine ssh und zu Ihrem App-Ordner navigieren und von dort aus den Befehl php artisan migrate aufrufen.

0
cmac

In manchen Fällen hatte ich einfach verwendet

vagrant up

anstatt von

Homestead up

für meine Forge-Larven-Konfiguration mit Homestead. Ich gehe davon aus, dass dies bedeutete, dass die Site bedient wurde, aber der MySQL-Server wurde nie gebootet. Als ich mit dem letzteren Befehl meine Vagrant-Box startete, verschwand der Fehler.

0
Ben Wilson

All diese Antworten scheinen schwer zu heben ...

Ich habe gerade eine .env -Datei erstellt. habe meine bootstrap/app.php -Datei bearbeitet und die folgende Zeile auskommentiert ...

Dotenv::load(__DIR__.'/../');

Hoffe das hilft jemandem

0
MrMesees

In meinem Fall musste ich den Bootstrap/Cache-Ordner entfernen und es erneut versuchen.

Mein Szenario war nach einer Servermigration.

0
Raphael Cangucu

Für alle, die versuchen, eine neue Datenbankverbindung herzustellen, die nicht auf laravel, sondern hier auf der Suche nach Antworten zum Ausführen von PDO vom Terminal aus ist. Dies würde Ihnen helfen. Und Sie können es so umgestalten, dass es für Sie am besten funktioniert.

<?php

class db
{
   private $DBHOST = 'localhost'; // you don't need 127.0.0.1
   private $DRIVER = 'mysql';
   private $PORT   = '8888'; // database port. 8888 is mine
   private $DB     = 'example-db';
   private $PASS   = 'example-pass';
   private $USER   = 'root';
   private $SOCKS  = ''; // can fill this or leave blank.


   // - connect (dummy connection)
   private function con()
   {
       if ($this->SOCKS == '')
       {
           // run Shell command to get 
           $socks = Shell_exec('netstat -ln | grep mysql');
           $socks = trim(substr($socks, strpos($socks, '/')));

           $this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
       }
       else
       {
          $this->SOCKS = ';unix_socket='.$this->SOCKS;
       }

       $dsn = $this->DRIVER.':Host='.$this->DBHOST.';dbname='.$this->DB;

       // add socks
       $dsn .= $this->SOCKS;

       // add port
       $dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';

       // extablish connection
       $con = new PDO($dsn, $user, $pass);

       // return PDO instance.
       return $con;
   }
   // - ends here

   // now you can call $this->con() within class to use connection 
   // would run fine on any terminal

} 

ich hoffe es hilft!

0
Ifeanyi Amadi