2012-06-15 24 views
12

Sto provando a utilizzare il driver MySQL PDO nell'applicazione CodeIgniter. Questo è il mio config database:CodeIgniter Driver database PDO non funzionante

$active_group = 'default'; 
$active_record = TRUE; 

$db['default']['hostname'] = 'localhost'; 
$db['default']['username'] = 'root'; 
$db['default']['password'] = ''; 
$db['default']['database'] = 'testdatabase'; 
$db['default']['dbdriver'] = 'pdo'; 
$db['default']['dbprefix'] = ''; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = TRUE; 
$db['default']['cache_on'] = FALSE; 
$db['default']['cachedir'] = ''; 
$db['default']['char_set'] = 'utf8'; 
$db['default']['dbcollat'] = 'utf8_general_ci'; 
$db['default']['swap_pre'] = ''; 
$db['default']['autoinit'] = TRUE; 
$db['default']['stricton'] = FALSE; 

Tuttavia, sto ottenendo questo errore quando carico un controller:

Fatal error: Uncaught exception 'PDOException' with message 'invalid data source name' in C:\xampp\htdocs\testsite\system\database\drivers\pdo\pdo_driver.php:114

Ho controllato la fonte dei dati utilizzando die($this->hostname); in pdo_driver.php e sta venendo fuori come :

localhost;dbname=testdatabase 

quindi sta ottenendo il nome corretto del database. Il database esiste e io ho MySQL in esecuzione.

Cosa potrebbe andare storto qui? Grazie.

+1

Sidenote: Recentemente ho letto il changelog della nuova versione (2.1.1) e ci sono alcune correzioni per quanto riguarda il driver PDO. Potresti volerlo controllare –

+0

Martin, sto riscontrando un errore simile: 'Errore irreversibile: eccezione non rilevata 'PDOException' con messaggio 'impossibile trovare il driver' in ... ((diversi database e directory principali/file elencati)). .. syetem/database/drivers/pdo/pdo_driver.php on line 114' Sono abbastanza nuovo da non riuscire nemmeno a capire se il tuo hacker mi aiuterà. Dove e cosa ** esattamente ** hai modificato in '.../system/database/drivers/pdo/pdo_driver.php'? Sono abbastanza newbie su argomenti di configurazione. Mi sembra strano che sia necessario un hack per un file di sistema per far funzionare PDO in CI v.2.1.1, no? Perché gli altri (presumibilmente la maggior parte) non hanno bisogno dell'hack che hai menzionato? – govinda

+0

@govinda, ho fatto il mio sulla riga 81, subito dopo 'else {...}' nel costruttore della classe. Sembra strano che tu abbia bisogno di hackerarlo, ma non ho trovato nulla di sbagliato con esso dal momento della mia correzione. –

risposta

8

Questo non dovrebbe essere il caso.

localhost;dbname=testdatabase 

dovrebbe essere

mysql:dbname=testdatabase;host=localhost; 
+1

Grazie, ho modificato il driver CodeIgniter PDO a questo: '$ this-> hostname = 'mysql: dbname ='. $ This-> database. '; Host ='. $ This-> hostname;' e sembra funzionare adesso. :) –

+3

La modifica del driver principale non è necessaria e si interromperà la prossima volta che si aggiorna CI, a meno che non si ricordi di apportare nuovamente la modifica al file principale. Segui l'approccio di seguito, modificando invece il file delle impostazioni del database. – PaulSkinner

30

su File /application/config/database.php dove è

$db['default']['hostname'] = 'localhost'; 

deve essere

$db['default']['hostname'] = 'mysql:host=localhost'; 

localhost o l'host del database.

+2

+1 - Impossibile trovare da nessuna parte, rock! – Chris

+1

Doh. Certo che dovrebbe Ho solo supposto che CI si sarebbe comportata in modo esagerato. – PaulSkinner

1

Secondo la pagina di CodeIgniter Database Configuration,

Per il driver PDO, è necessario modificare il 'hostname => 'localhost'' a "'hostname' => mysql:host=localhost" come di seguito:

$db['default'] = array(
    'dsn' => '', 
    'hostname' => 'mysql:host=localhost', 
    'username' => 'root', 
    'password' => '', 
    'database' => 'database_name', 
    'dbdriver' => 'pdo', 
    'dbprefix' => '', 
    'pconnect' => FALSE, 
    'db_debug' => (ENVIRONMENT !== 'production'), 
    ..... 
    ..... 
); 
6

conducente DOP richiedono un DSN completo stringa da fornire. La stringa come questo

'dsn' = ‘mysql:host=localhost;dbname=databasename’; 

quando si utilizza questa stringa si dovrebbe rimuovere host e databasename valore dalla matrice. Penso che il seguente esempio ti dia un'idea.

$db['default'] = array(
'dsn' => 'mysql:host=localhost;dbname=codeigniter3', 
'hostname' => '', 
'username' => 'root', 
'password' => '', 
'database' => '', 
'dbdriver' => 'pdo', 
'dbprefix' => '', 
'pconnect' => FALSE, 
'db_debug' => TRUE, 
'cache_on' => FALSE, 
'cachedir' => '', 
'char_set' => 'utf8', 
'dbcollat' => 'utf8_general_ci', 
'swap_pre' => '', 
'encrypt' => FALSE, 
'compress' => FALSE, 
'stricton' => FALSE, 
'failover' => array(), 
'save_queries' => TRUE 
); 

Grazie

Problemi correlati