PDOException SQLSTATE [HY000] [2002] Tidak ada file atau direktori tersebut


320

Saya percaya bahwa saya telah berhasil menyebarkan situs saya (sangat mendasar) ke fortrabbit, tetapi segera setelah saya terhubung ke SSH untuk menjalankan beberapa perintah (seperti php artisan migrateatau php artisan db:seed) saya mendapatkan pesan kesalahan:

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

Pada titik tertentu migrasi pasti berhasil, karena meja saya ada di sana - tetapi ini tidak menjelaskan mengapa itu tidak berfungsi untuk saya sekarang.



1
kadang-kadang itu hanya karena Anda belum menginstal mysql
Hassan Gilak

Jawaban:


142

Pesan kesalahan menunjukkan bahwa koneksi MySQL melalui soket dicoba (yang tidak didukung).

Dalam konteks Laravel (pengrajin), Anda mungkin ingin menggunakan lingkungan yang berbeda / benar. Misalnya: php artisan migrate --env=production(atau lingkungan apa pun). Lihat di sini .


1
Ini adalah solusi untuk masalah saya, salah satu pengembang di perusahaan kami tidak menggunakan Homestead dan terhubung ke mysql melalui soket. Saya menghapus konfigurasi soket dalam file app / database.php saya. Masalah terpecahkan
borislemke

Saya hanya perlu mengaktifkan ekstensi mysqli.so di php.ini
Mehulkumar

4
Saya harus menambahkan "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" ke config / database.php
Carlosngel Carlos del Pozo Muela

halo komunitas, saya mendapatkan kesalahan ini walaupun saya tidak menggunakan laravel dapatkah Anda melihat masalahnya di sini adalah stackoverflow.com/questions/60796332/...
Kiran Patel

656

Laravel 4: Ubah "host" dalam app/config/database.phpfile dari "localhost" menjadi "127.0.0.1"

Laravel 5: Ubah "DB_HOST" dalam .envfile dari "localhost" menjadi "127.0.0.1"

Saya memiliki masalah yang sama persis. Tidak ada solusi di atas yang berfungsi untuk saya. Saya memecahkan masalah dengan mengubah "host" di file /app/config/database.php dari "localhost" menjadi "127.0.0.1".

Tidak yakin mengapa "localhost" tidak berfungsi secara default, tetapi saya menemukan jawaban ini dalam pertanyaan serupa yang diselesaikan di posting symfony2. https://stackoverflow.com/a/9251924/1231563

Pembaruan: Beberapa orang bertanya mengapa perbaikan ini berhasil, jadi saya telah melakukan sedikit riset tentang topik ini. Tampaknya mereka menggunakan jenis koneksi berbeda seperti yang dijelaskan dalam posting ini https://stackoverflow.com/a/9715164/1231563

Masalah yang muncul di sini adalah bahwa "localhost" menggunakan soket UNIX dan tidak dapat menemukan database di direktori standar. Namun "127.0.0.1" menggunakan TCP (Transmission Control Protocol), yang pada dasarnya berarti dijalankan melalui "internet lokal" pada komputer Anda yang jauh lebih dapat diandalkan daripada soket UNIX dalam kasus ini.


3
aneh bahwa itu adalah solusi bagi saya juga, tetapi saya dapat terhubung dari baris perintah dengan mysql --host = localhost - yang berfungsi, tetapi tidak dari PDO.
John

26
Saya ingin tahu MENGAPA localhosttidak bekerja dan 127.0.0.1melakukan ??
Justin

6
Ini bekerja untuk saya pada sistem MAMP yang menjalankan file php pada baris perintah (terminal). Ini berfungsi sebagai halaman web, tetapi bukan sebagai file baris perintah sampai saya mengubah localhost menjadi '127.0.0.1'
Samuel Fullman

1
@ Justin Saya pikir itu karena localhost mencoba menggunakan socket, sementara 127.0.0.1 menggunakan TCP.
pebbo

10
A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost. dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html
x-yuri

94

Saya mendapat masalah yang sama dan saya menjalankan Mac OS X 10.10 Yosemite. Saya telah mengaktifkan Server Apache dan PHP yang sudah dilengkapi dengan OS. Lalu saya baru saja mengkonfigurasi perpustakaan mCrypt untuk memulai. Setelah itu ketika saya bekerja dengan model dan DB saya mendapat kesalahan:

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

Alasan saya menemukan ini hanya karena PHP dan MySQL tidak dapat terhubung sendiri. Untuk memperbaiki masalah ini, saya mengikuti langkah-langkah berikut:

  1. Buka terminal dan hubungkan ke mysql dengan:

    mysql -u root -p
  2. Ini akan menanyakan kata sandi terkait. Kemudian setelah Anda mendapatkan mysql promt ketik perintah selanjutnya:

    mysql> show variables like '%sock%'
  3. Anda akan mendapatkan sesuatu seperti ini:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
  4. Pertahankan nilai baris terakhir:

    /tmp/mysql.sock
  5. Di laravelfolder proyek Anda , cari file database.php di mana Anda mengkonfigurasi parameter koneksi DB. Di bagian mysql tambahkan baris berikutnya di akhir:

    'unix_socket' => '/tmp/mysql.sock'
  6. Anda harus memiliki sesuatu seperti ini:

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

Sekarang hanya simpan perubahan, dan muat ulang halaman dan itu harus bekerja!


3
Solusi paling "langsung ke masalah". Terima kasih, ini membuat saya tetap menjalankan Laravel dengan MAMP pro
animaacija

Terima kasih untuk ini. Ini berhasil untuk saya. Menggunakan OSX 10.10.5 MAMP Pro
marknt15

Ini bekerja untuk saya juga dengan MAMP pro dan OS X 10.11.x. Akhirnya menjadi:/Applications/MAMP/tmp/mysql/mysql.sock
Bort License Plate

1
+1. Menggunakan "127.0.0.1" di konfigurasi bukan "localhost" seperti yang dikatakan Yamartino dalam jawabannya bekerja dengan baik tetapi lebih cepat dengan soket dan jawaban ini memecahkan masalah. Sayang mysql memperlakukan "localhost" dengan cara yang aneh ketika unix_socket didefinisikan ...
Shautieh

@GregFerrell Ya itu benar tapi baik ... Saya harap ini bisa berguna
alexventuraio

51

Saya menemukan [PDOException] SQLSTATE[HY000] [2002] No such file or directorykesalahan karena alasan yang berbeda. Saya baru saja selesai membangun tumpukan LAMP baru di Ubuntu 12.04 dengan Apache 2.4.7, PHP v5.5.10 dan MySQL 5.6.16. Saya memindahkan situs saya kembali dan memecat mereka. Tapi, saya tidak dapat memuat situs berbasis Laravel 4.2.x saya karena hal di [PDOException]atas. Jadi, saya memeriksa php -i | grep pdodan memperhatikan baris ini:

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

Tapi, di file /etc/my.cnf saya sebenarnya ada di /var/run/mysqld/mysqld.sock.

Jadi, saya membuka php.ini saya dan menetapkan nilai untuk pdo_mysql.default_socket:

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

Kemudian, saya memulai kembali apache dan memeriksa php -i | grep pdo:

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

Itu memperbaikinya bagi saya.


Ini adalah perbaikan yang bekerja untuk saya, masalahnya adalah saya menginstal dua versi mysql dan menghapus satu, perubahan 127.0.0.1 tidak berfungsi atau menambahkan kaus kaki di konfigurasi, terima kasih! @dcarrith
Luis

2
Ini membantu saya menemukan masalah saya - yaitu saya menggunakan OSX bundled php, bukan biner php MAMP. Jadi pastikan Anda menggunakan versi php yang tepat yang menunjuk ke php.ini yang benar, dll. Pasti "doh!" saat.
capung

43

Jawaban dari @stuyam memecahkan masalah "Tidak ada file atau direktori" bagi saya

Jawaban singkat: Ubah "host" di file /app/config/database.php dari "localhost" menjadi "127.0.0.1"

Tapi kemudian saya mengalami kesalahan "Sambungan ditolak". Jika ada yang memiliki masalah yang sama, solusi saya untuk ini adalah memperbarui file app / config / local / database.php sehingga portnya adalah 8889:

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

4
Dalam kasus saya, itu 'port' => '33060'tetapi jawaban ini membuat saya di sana!
mopo922

26

Jika Anda menggunakan Laravel Homestead, pastikan Anda memanggil perintah di server.

homestead ssh

Kemudian cukup cd ke direktori yang benar dan jalankan perintah Anda di sana.


2
Ini berhasil, saya menjalankan perintah dari komputer saya alih-alih ssh ke VM terlebih dahulu dan menjalankan perintah di sana.
cmac

Saya selalu melupakan langkah ini. Heh. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant sshdalam kasus saya
Marcos Curvello

22

Dalam kasus saya, saya tidak punya masalah sama sekali, hanya lupa untuk memulai layanan mysql ...

sudo service mysqld start


18

Tambahkan path mysql.sock di file database.php seperti contoh di bawah ini

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

Cukup

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '8889'),

18

Ini bekerja setelah saya mengubah dari DB_HOST=localhostke DB_HOST=127.0.0.1file .env


2
Ini berhasil, Anda benar. Apakah Anda punya ide untuk menjelaskan mengapa localhosttidak berhasil?
Fusion

1
@Fusion jika Anda menjalankan aplikasi di dalam sebuah wadah, ia akan memahami 'localhost' sebagai wadah, 127.0.0.1 mengatakannya untuk menggunakan db tuan rumah
deathemperor

Saya juga punya masalah seperti itu, tidak bisa menghapus cache atau menjalankan servis tukang
Tom Mwenda

17

Ini karena PDO memperlakukan host "localhost" secara khusus:

Catatan: Hanya Unix: Ketika nama host diatur ke "localhost", maka koneksi ke server dilakukan melalui soket domain. Jika PDO_MYSQL dikompilasi melawan libmysqlclient maka lokasi file socket berada di libmysqlclient yang dikompilasi di lokasi. Jika PDO_MYSQL dikompilasi dengan mysqlnd, soket default dapat diatur melalui pengaturan pdo_mysql.default_socket.

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

Mengubah localhost ke 127.0.0.1 akan "memaksa" penggunaan TCP.

Catatan: mysqli_connect berfungsi baik dengan localhost.


12

Membangun jawaban dari @dcarrith ...

Alih-alih mengedit file konfigurasi, saya membuat alias di lokasi yang PHP cari yang terhubung ke mysql.sock nyata. ( sumber )

Jalankan saja kedua perintah ini (tidak perlu restart):

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

11

Langkah 1

Temukan path ke unix_socket Anda, untuk melakukannya jalankan saja netstat -ln | grep mysql

Anda harus mendapatkan sesuatu seperti ini

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

Langkah 2

Ambil itu dan tambahkan di param unix_socket Anda

'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' <-----
            ),
        ),

Semoga ini bisa membantu !!


8

Saya menjalankan MAMP Pro dan memiliki masalah yang sama ketika mencoba untuk bermigrasi (membuat tabel db). Mencoba beberapa saran yang disebutkan juga tetapi tidak melakukannya untuk saya.

Jadi, cukup (setelah satu jam googling), saya menambahkan dua hal ke /config/database.php.

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

Sekarang berfungsi dengan baik!


4

Periksa port Anda dengan cermat. Dalam kasus saya itu adalah 8889 dan saya menggunakan 8888. ubah "DB_HOST" dari "localhost" menjadi "127.0.0.1" dan sebaliknya


Hebat, terima kasih, port saya 3306 tapi port saya yang sebenarnya adalah 8889
David

4

Saya punya masalah ini ketika saya menjalankan aplikasi saya menggunakan wadah buruh pelabuhan.

Solusinya adalah meletakkan nama wadah layanan MySQL yang saya gunakan di docker_compose.ymlDB_HOST. Dalam kasus saya, itu adalah db:

DB_HOST=db

Semoga ini bisa membantu.


2

Pada Laravel 5 nama pengguna basis data dan kata sandi masuk dalam file .env yang ada di direktori proyek, misalnya

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

Seperti yang Anda lihat, variabel-variabel lingkungan ini mengesampingkan string 'tempa' di sini sehingga mengubahnya tidak berpengaruh:

    '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,
    ],

Informasi lebih lanjut ada di sini https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

Saya mengalami masalah ini ketika menjalankan PHPUnit di Elixir / Gulp, dan Homestead sebagai lingkungan Vagrant saya.

Dalam kasus saya saya edit file .env dari DB_HOST=localhostke DB_HOST=192.168.10.10mana 192.168.10.10adalah IP dari saya tuan Vagrant / Homestead.


2

Coba sambungkan ke localhost:

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

Coba sambungkan ke 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, cukup beri komentar / hapus pengaturan berikut dari my.cnf (di OS X 10.5:) /opt/local/etc/mysqlxx/my.cnfuntuk mendapatkan:

[mysqld]
# skip-networking

Tentu saja, hentikan dan mulai MySQL Server.


2

Saya memiliki masalah serupa dalam mengakses situs web Drupal saya. Saya memperbaikinya dengan membuka baris perintah, dan me-restart server atau layanan MySQL saya:

service mysqld restart

Ini seharusnya bekerja. Jika tidak, mulai ulang server web Anda:

service httpd restart

Itu sudah cukup. Semoga berhasil untuk lingkungan lain juga. Perhatikan bahwa perintah ini umumnya memerlukan hak pengguna super.


1

Jika Anda menggunakan Laravel Homestead, berikut adalah pengaturannya

(termasuk Mesin Vagrant-Virtual)

profil .bash

alias vm="ssh vagrant@127.0.0.1 -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

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install

1

Jika ada yang masih mencari jawabannya, cukup periksa file .env Anda. Untuk beberapa alasan, laravel membuat file .env.example, jadi semua jawaban ini tidak berfungsi untuk saya. Saya memperbaiki masalah saya dengan mengubah nama .env.example menjadi .env


Tidak ada jawaban yang benar untuk pertanyaan ini karena ada berbagai kesalahan yang dapat dibuat. Ini adalah salah satunya, karena gagal menyalin file .env ke server jauh. Jadi ada baiknya memeriksa file .env di server tempat Anda mencoba menjalankan kueri untuk memastikan bahwa keduanya ada dan berisi informasi yang diperlukan untuk membuat koneksi.
petercoles

1

Ini terjadi pada saya karena MySQL tidak berjalan. MySQL gagal memulai karena saya punya yang hilang/usr/local/etc/my.cnf.d/ direktori yang .

Ini sedang diminta oleh /usr/local/etc/my.cnffile konfigurasi saya sebagai glob termasuk (include /usr/local/etc/my.cnf.d/*.cnf ).

Berjalan mkdir /usr/local/etc/my.cnf.d, dan kemudian mulai MySQL, perbaiki masalah.


1

Dalam kasus saya, saya menjalankan php tukang melakukan migrasi di terminal mac saya, ketika saya perlu ssh ke gelandangan dan menjalankannya dari sana. Semoga itu bisa membantu sakit kepala seseorang.


1

Saya memiliki masalah yang sama menggunakan nama layanan Docker dan MySQL db di file docker_compose.yml:

Saya menambahkan berikut ini di .envfile:

DB_HOST=db

Anda juga harus memastikan bahwa host Anda dapat ditemukan dari aplikasi php.

Itu karena PHP tidak tahu host mana yang digunakan untuk menghubungkan.


0

Saat menggunakan VirtualMachine pastikan Anda ssh ke mesin itu dan navigasikan ke folder App Anda dan panggil perintah migrasi artisan php dari sana.


0

Dalam hal ini, saya hanya menggunakan

vagrant up

dari pada

homestead up

untuk setup forge larval saya menggunakan homestead. Saya berasumsi ini berarti situs itu dilayani, tetapi server MySQL tidak pernah di-boot. Ketika saya menggunakan perintah terakhir untuk meluncurkan kotak gelandangan saya, kesalahan hilang.


0

Semua jawaban ini tampak seperti mengangkat berat ...

Saya baru saja membuat .envfile; mengedit bootstrap/app.phpfile saya , dan menghapus komentar pada baris berikut ...

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

Semoga ini bisa membantu seseorang


0

Bagi siapa pun yang mencoba membuat koneksi db segar bukan pada laravel tetapi bertemu di sini mencari jawaban untuk menjalankan PDO dari Terminal. Ini akan sangat membantu Anda. Dan Anda dapat mengubahnya agar bekerja paling baik untuk Anda.

<?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

} 

semoga membantu!


0

Dalam kasus saya, saya harus menghapus folder bootstrap / cache dan mencobanya lagi.

Skenario saya adalah setelah migrasi server.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.