2009-09-16 18 views
24

Oggi ho rimosso e reinstallato l'ultima versione di lampp per passare a php 5.30 e improvvisamente un'applicazione molto semplice non riesce a connettersi al database mysql. Sto usando DOP per la connessione, e ricevendo il seguente errore:Errore durante la creazione della connessione a PDO in PHP

Warning: PDO::__construct() [pdo.--construct]: [2002] Invalid argument (trying to connect 
via unix://) in /home/raistlin/www/todoapp/home.php on line 9 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] 
Invalid argument' in /home/raistlin/www/todoapp/home.php:9 Stack trace: #0 
/home/raistlin/www/todoapp/home.php(9): PDO->__construct('mysql:host=loca...', 'USER', 
'PASSWORD') #1 {main} thrown in /home/raistlin/www/todoapp/home.php on line 9 

non sto prendendo piede l'errore in questo momento, per il bene di debug.

Il seguente codice è sufficiente per replicare il problema sul mio sistema:

<?php 
$DBACCESS = array(
    "connstring"=>"mysql:host=localhost;dbname=todoapp", 
    "host"=>"localhost", 
    "user"=>"user", 
    "password"=>"password", 
    "todoapp"=>"todoapp" 
    ); 

    echo implode('<br \>',$DBACCESS); 

    $dbh = new PDO($DBACCESS['connstring'],$DBACCESS['user'],$DBACCESS['password']); 

    $dbh = null; 
?> 

ricerca online, ho trovato una o due altre persone con lo stesso problema, ma nessuno di loro ha ricevuto una risposta, molto meno uno funzionante. Qualcuno sa cosa sta succedendo? C'è qualcosa che mi è mancato nella configurazione? Cosa devo fare per risolverlo?

risposta

51

di solito significa che è necessario specificare il protocollo TCP/IP (1), o dire MySQL in cui il socket Unix è (2):

  1. "mysql: host = 127.0.0.1" o "mysql: host = localhost; port = 3306"
  2. "mysql: unix_socket =/var/run/mysqld/mysqld.sock"
+1

Non sono sicuro del motivo per cui MySQL a volte prende "localhost" per significare "Uso una presa Unix" – TML

+1

Perfetto. Il problema è stato risolto con l'opzione 2, sebbene con l'installazione di xampp lampp, avevo bisogno di usare /opt/lampp/var/mysql/mysql.sock. – krdluzni

+0

Sicuro. Sono contento che tu sia riuscito a trovare la presa - ho appena lanciato un esempio e pregato che tu lo trovassi. :) – TML

1

La causa più comune di un errore di questo tipo è che MySQL non è in esecuzione.

+0

Ho controllato che, già. Anche al punto di spegnerlo e riavviarlo. – krdluzni

+0

Come fai a sapere che è il * più comune *? – dakab

9

Si potrebbe voler modificare php.ini così PDO può trovare mysql.sock specificando la pdo_mysql.default_socket = /opt/lampp/var/mysql/mysql.sock (nel caso di xampp). Non dimenticare di riavviare Apache dopo aver modificato php.ini.

(Siamo spiacenti, questa sembra essere una soluzione ripetuta).

24

È inoltre possibile utilizzare 127.0.0.1 anziché specificare "localhost" nella stringa di connessione db per evitare del tutto questo problema.

+4

La risposta accettata è per gli amministratori di sistema, questa è per gli sviluppatori;) grazie! – jack

4

Sto usando MAMP 2.0.1 e Symfony 1.4 con Doctrine per questo progetto.

Terza opzione ha funzionato per me con una piccola modifica: in /config/databases.yml

dsn: 'mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=MY_DB_NAME;' 
Problemi correlati