2013-08-28 15 views
9

Próbuję skonfigurować nową witrynę na moim hostingu (trasa hosta, jeśli jest to ważne), ale nadal otrzymuję ten błąd, gdy próbuję używać PDO (pierwsza strona PDO im próbuje) :PHP PDO: Nie można się połączyć, nazwa katalogu jest niepoprawna.

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in /home/kennyi81/public_html/gamersite/login.php:36 Stack trace: #0 /home/kennyi81/public_html/gamersite/login.php(36): PDOStatement->execute() #1 {main} thrown in /home/kennyi81/public_html/gamersite/login.php on line 36 

Kiedy korzystać z tych ustawień:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

.... 

$stmt = $dbh->prepare('SELECT * FROM USERS WHERE ID = :id LIMIT 1'); 

Jak baza danych jest określone: ​​

enter image description here

Jestem w stanie używać mysqli connect fine na innych subdomenach/stronie głównej, ale nie mogę uzyskać działania PDO.

Próbowałem tego, co widziałem dookoła:

$stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1'); 

ale retuns błąd składni.

Ktoś ma pojęcie, co może być przyczyną?


To wszystko działa na moim lokalnym serwerze, nic się nie zmieniło przy wysyłaniu oprócz linii połączenia.

+0

Która linia ma 36? – Mike

+0

nowy CHNP ("mysql: host = 91.146.107.11 – Mihai

+0

@Mike Jego $ stmt-> execute(); dla kwerendy pokazanej powyżej –

Odpowiedz

11

Zamiast:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

Spróbuj:

$dbh = new PDO("mysql:host=91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

(dodać host =)

I to najprawdopodobniej działa na lokalnym serwerze, ponieważ masz mysql:localhost... lub mysql:127.0.0.1... tam i jest ignorowany (ponieważ go brakuje host =) i domyślnie jest to localhost.

+0

EDYCJA: To naprawiło, dzięki. –

1

Z poziomu PDO manual page widać, że należy zawinąć połączenie w bloku try/catch. W ten sposób, jeśli coś pójdzie nie tak z połączeniem, powie Ci to. Coś takiego:

try { 
    $dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 

    // Then actually do something about the error 
    logError($e->getMessage(), __FILE__, __LINE__); 
    emailErrorToAdmin($e->getMessage(), __FILE__, __LINE__); 
    // etc. 
    die(); // Comment this out if you want the script to continue execution 
} 

Powodem otrzymujesz ten błąd, ponieważ nie jest to błąd z połączeniem, ale ponieważ nie powiedzieć skrypt do zatrzymania, to nie. Spójrz na wygenerowany komunikat o błędzie, a sposób jego rozwiązania powinien stać się oczywisty. Wygląda na to, że odpowiedź Michaela Prajsnara jest poprawna, ponieważ nie ustawiasz "hosta".

Edit:

Jak się okazuje, PDO nie skarżą się, jeśli zostawisz swój host lub dbname w części DSN połączenia PDO (przynajmniej na Unix). Przetestowałem to i pozostawienie go pustego domyślnie ustawi go na "localhost" i dlatego jestem w stanie połączyć idealnie wszystko, pozostawiając to całkowicie dla połączeń localhost, co wyjaśniałoby, dlaczego działało na twoim lokalnym serwerze, ale nie na twoim serwerze produkcyjnym. W rzeczywistości, to jest całkowicie możliwe, aby połączyć dostarczanie absolutnie nic DSN wyjątkiem silnika bazodanowego tak:

$dbh = new PDO("mysql:", "kennyi81_gamer", "***************"); 

Jedynym problemem jest to, że nie będą korzystać z bazy danych, tak aby korzystać z bazy danych, po prostu zrobić:

if ($dbh->query("USE kennyi81_gamersite") === false)) { 
    // Handle the error 
} 

jednak z tym powiedział, mam wątpliwości że rzeczywiście próbował podłączenia za pomocą try/catch blok (jak wspomina w swoich komentarzach), chyba że w jakiś sposób pod warunkiem ważne poświadczenia bazy danych. TYLKO sposób, który robił to w ten sposób, nie powodował żadnego błędu, jeśli właściwie podłączyłeś się i wybrałeś bazę danych kennyi81_gamersite.Jeśli nie, zobaczysz komunikat podobny do następującego:

Nie można połączyć się z bazą danych. "mysql", powiedział: SQLSTATE [28000] [1045] Access denied for user 'kennyi81_gamer' @ 'localhost' (using password: YES)

Podsumowując, zawsze owiń połączenia w try/catch bloku jeśli chcesz znaleźć błędy podczas połączenia. Tylko pamiętaj, aby ponownie nie rzucać (i nie przechwytywać) numeru lub ujawnić dane logowania.

+0

Próbowałem, ale nie pojawiła się żadna wiadomość poza tą, którą już mam. –

+0

@ TristanCunningham Zobacz moją edycję – Mike

+1

Pozostawienie wyjątku bez przechwytywania również * powie ci *, jak również wywoła fatalny błąd, zatrzymując w ten sposób dalszą realizację.Ten trend polegający na informowaniu programistów o wychwytywaniu wyjątków i drukowaniu wiadomości wydaje się być kolejną rundą PHP rada – Phil

Powiązane problemy