2013-08-28 9 views
9

Sto tentando di configurare un nuovo sito sul mio hosting (host route se è importante) ma continuo a ricevere questo errore quando provo a utilizzare PDO (il primo sito PDO sto cercando) :PHP PDO: impossibile connettersi, nome catalogo non valido

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 

Quando uso queste impostazioni:

$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'); 

Come il database è disposto:

enter image description here

Sono in grado di utilizzare mysqli connect fine sui miei altri sottodomini/sito principale, ma semplicemente non riesco a far funzionare PDO.

Ho provato questo, che ho visto in giro:

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

ma Retuns un errore di sintassi.

Qualcuno ha idea di cosa potrebbe causare questo?


Questo funziona tutto sul mio server locale, non è stato modificato nulla durante il caricamento oltre alla linea di connessione.

+0

Quale linea è 36? – Mike

+0

nuovo PDO ("mysql: host = 91.146.107.11 – Mihai

+0

@Mike Il suo $ stmt-> execute(); per la query mostrata sopra. –

risposta

11

Invece di:

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

Prova:

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

(aggiungere host =)

Ed è molto probabile che funziona sul server locale, perché avete mysql:localhost... o mysql:127.0.0.1... lì ed è ignorato (perché manca l'host =) e per impostazione predefinita è localhost.

+0

EDIT: questo l'ha risolto, grazie. –

1

Da PDO manual page, è possibile vedere che è necessario avvolgere la connessione in un blocco try/catch. In questo modo se qualcosa va storto con la connessione, lo dirà. Qualcosa di simile a questo:

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 
} 

Il motivo che si stanno ottenendo questo errore è perché c'è un errore con la connessione, ma dal momento che non si dica lo script di fermarsi, non è così. Guarda il messaggio di errore prodotto e come risolverlo dovrebbe essere reso ovvio. Sembra che la risposta di Michael Prajsnar sia corretta in quanto non stai impostando un "host".

Edit:

Come si è visto, DOP non fa lamentarsi se si lascia fuori il vostro host o dbname nella parte connessione DSN PDO (almeno su Unix). L'ho provato e lasciandolo vuoto lo avrò di default in "localhost" e quindi sono stato in grado di connettermi perfettamente, lasciandolo completamente fuori per le connessioni localhost, il che spiegherebbe perché ha funzionato sul tuo server locale ma non sul tuo server di produzione. In realtà, è del tutto possibile collegare fornendo assolutamente nulla nel DSN fatta eccezione per il motore di database in questo modo:

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

L'unico problema è che non verrà utilizzato un database, in modo da utilizzare un database, basta fare:

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

Tuttavia, con quello detto, ho i miei dubbi che in realtà si è tentato il collegamento utilizzando un blocco try/catch (come si parla nei vostri commenti) a meno che in qualche modo fornito le credenziali di database valido. L'unico modo in cui farlo in questo modo non ha prodotto alcun tipo di errore è se si è effettivamente connessi correttamente e selezionato il database kennyi81_gamersite.In caso contrario, avresti visto un messaggio come questo:

Impossibile connettersi al database. "mysql", ha dichiarato: SQLSTATE [28000] [1045] Accesso negato per l'utente 'kennyi81_gamer' @ 'localhost' (usando la password: YES)

In sintesi, avvolgere sempre il vostro collegamento in un blocco try/catch se si desidera per trovare errori durante la connessione. Assicurati di non rilanciare (e non prendere) lo o potresti esporre le tue credenziali di accesso.

+0

L'ho provato ma nessun messaggio è mai apparso a parte quello che ho già ricevuto. –

+0

@ TristanCunningham Vedi il mio edit – Mike

+1

Lasciando un'eccezione anche uncunto * ti dirà * e innescherà un errore fatale, fermando così l'ulteriore esecuzione.Questa tendenza a consigliare agli sviluppatori di catturare eccezioni e stampare solo il messaggio sembra essere il prossimo round di PHP di terribile consiglio – Phil