Errore durante la connessione a MySQL tramite PHP / PDO
Domanda
Il mio codice ha funzionato bene ieri e oggi improvvisamente non voglio collegarmi al mio database. Non ho modificato alcuna impostazione su di esso o sul codice e non ho nemmeno aggiornato alcun software. Tutto ciò che faccio è questo:
nuovo PDO ('mysql: host = localhost; port = 3306; dbname = test', 'username', 'password');
E ricevo un bel messaggio di eccezione che dice questo:
Avvertenza: PDO :: __ construct (): [2002] Nessun file o directory (tentando di connettersi tramite unix: ///tmp/mysql.sock) in ...
Il fatto è: chiaramente non sto provando a connettermi usando un socket unix ma usando TCP / IP. Che cosa sto facendo di sbagliato? C'è qualcosa che mi manca qui?
Grazie per l'aiuto.
Soluzione
Stai usando un socket Unix. Durante la lettura di " localhost " Le librerie client MySQL non lo interpretano come host TCP "localhost" e risolvi quel nome ma usa la posizione predefinita del socket. Per usare TCP sul computer locale devi usare 127.0.0.1
come nome host.
Per specificare il passato, utilizzare unix_socket
anziché host
nel DSN. La posizione del socket utilizzato per localhost
può essere definita in fase di compilazione o in alcune versioni di PHP utilizzando pdo_mysql.default_socket
in php.ini
.
Altri suggerimenti
Dalla documentazione PHP sulla connessione a MySQL tramite PDO: PDO_MYSQL DNS
La nota alla fine dice:
Solo Unix:
Quando il nome host è impostato su " localhost " ;, quindi la connessione a il server viene creato tramite un socket di dominio. Se viene compilato PDO_MYSQL libmysql quindi la posizione del file socket è su libmysql compilato in posizione. Se PDO_MYSQL è compilato su mysqlnd a il socket predefinito può essere impostato tramite l'impostazione pdo_mysql.default_socket.
Quindi per risolvere questo problema dovresti configurare correttamente in php.ini la posizione del tuo mysql.sock
-
Trova il tuo file mysql.sock. Posizioni comuni:
- /tmp/mysql.sock
- /tmp/mysql/mysql.sock
- /var/mysql/mysql.sock
- o se usi MAMP o LAMP cerca nella cartella tmp per mysql
-
Modifica il tuo file php.ini e imposta correttamente il valore per pdo_mysql.default_socket
-
Riavvia il server Apache per rilevare le modifiche nel file php.ini
Su Ubuntu, puoi usare questa impostazione in php.ini
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
Ho appena aggiunto questa riga:
'unix_socket' => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock',
e tutto andava bene.
C'è un aggiornamento ai documenti per Drush che è documentato qui .