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.

Daniel Hollands
sumber
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 .

ukautz
sumber
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.

stuyam
sumber
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!

alexventuraio
sumber
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.

dcarrith
sumber
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'    => '',
    ),
Marlow
sumber
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.

Koen B.
sumber
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
Carlos ABS
sumber
19

Mamp pengguna aktifkan opsi Izinkan akses jaringan ke MYSQL

masukkan deskripsi gambar di sini

George John
sumber
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'),
RaviNila
sumber
18

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

NuOne
sumber
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.

Thomas Decaux
sumber
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
Justin
sumber
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 !!

cyber8200
sumber
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!

anoraq
sumber
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

Ahmed Awan
sumber
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.

Lano
sumber
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

jahat
sumber
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.


sumber
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.

Anna Logg
sumber
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.

RAWGIT
sumber
1

Jika Anda menggunakan Laravel Homestead, berikut adalah pengaturannya

(termasuk Mesin Vagrant-Virtual)

profil .bash

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

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install
ErcanE
sumber
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

Alberto Alegria
sumber
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.

james2doyle
sumber
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.

Brad
sumber
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.

Oscar David
sumber
0

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

cmac
sumber
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.

Ben Wilson
sumber
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

MrMesees
sumber
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!

Ifeanyi Amadi
sumber
0

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

Skenario saya adalah setelah migrasi server.

Raphael Cangucu
sumber