2009-09-16 57 views
24

Dzisiaj usunąłem i ponownie zainstalowałem najnowszą wersję lampp, aby przejść do wersji 5.30 i nagle bardzo prosta aplikacja nie łączy się z bazą danych mysql. Używam PDO połączyć i odbieranie następujący błąd:Błąd podczas tworzenia połączenia z PDO w 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 

ja nie łapie błąd w tej chwili, ze względu na debugowanie go.

Poniższy kod wystarczy, aby replikować problem w moim systemie:

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

szuka w internecie, znalazłem jedną lub dwie inne osoby z tego samego problemu, ale żaden z nich nie otrzymał odpowiedzi, znacznie mniej pracujący. Czy ktoś wie, co się dzieje? Czy jest coś, czego mi brakowało w konfiguracji? Co muszę zrobić, aby to naprawić?

Odpowiedz

51

Zazwyczaj oznacza to, że trzeba określić TCP/IP (1), albo powiedzieć MySQL, gdzie jest gniazdo Unix (2):

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

Nie jestem pewien, dlaczego MySQL czasami przyjmuje "localhost" w znaczeniu "Mam zamiar użyć gniazda Unix" – TML

+1

Perfect. Problem został rozwiązany za pomocą opcji 2, chociaż w przypadku instalacji lamp Xampp musiałem użyć /opt/lampp/var/mysql/mysql.sock. – krdluzni

+0

Pewnie. Cieszę się, że udało ci się znaleźć gniazdo - po prostu rzuciłem w nie przykład i modliłem się, żebyś go znalazł. :) – TML

1

Najczęstszą przyczyną błędu, takiego jak ten, jest brak działania MySQL.

+0

Sprawdziłem, że już. Nawet do momentu wyłączenia i ponownego uruchomienia. – krdluzni

+0

Skąd wiadomo, że to najczęściej *? – dakab

9

może chcesz zmodyfikować php.ini tak PDO można znaleźć mysql.sock, określając pdo_mysql.default_socket = /opt/lampp/var/mysql/mysql.sock (w przypadku xampp). Nie zapomnij ponownie uruchomić Apache po zmianie php.ini.

(Niestety, to wydaje się być powtarzające się rozwiązanie).

24

Można również użyć 127.0.0.1, zamiast określać "localhost", w łańcuchu połączenia db, aby uniknąć tego problemu w ogóle.

+4

Przyjęta odpowiedź jest dla sysadmins, ta jest dla programistów;) dziękuję! – jack

4

Używam MAMP 2.0.1 i Symfony 1.4 z Doctrine dla tego projektu.

Trzecia opcja pracował dla mnie z małą modyfikacją: w /config/databases.yml

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