2012-06-15 17 views
12

Próbuję użyć sterownika MySQL PDO w mojej aplikacji CodeIgniter. To jest mój config bazy danych:Nie działa sterownik bazy danych kodu PDI CodeIgniter

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

Jednak dostaję ten błąd, gdy załadować Kontroler:

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

Sprawdziłem źródła danych przy użyciu die($this->hostname); w pdo_driver.php i wychodzi jako :

localhost;dbname=testdatabase 

, więc otrzymuje poprawną nazwę bazy danych. Baza danych istnieje i mam uruchomiony MySQL.

Co może być nie tak? Dziękuję Ci.

+1

Sidenote: Niedawno przeczytałem changelog dla nowej wersji (2.1.1) i istnieją pewne poprawki dotyczące sterownika PDO. Możesz to sprawdzić: –

+0

Martin, otrzymuję podobny błąd: 'Błąd krytyczny: Niepowodzenie wyjątku 'PDOException' z komunikatem 'could not find driver' in ... ((kilka baz danych i główny katalog/pliki na liście)). .. syetem/database/drivers/pdo/pdo_driver.php na linii 114' Jestem na tyle nowy, że nie mogę nawet powiedzieć, czy twój hack pomoże mi. Gdzie i co ** dokładnie ** edytowałeś w '.../system/database/drivers/pdo/pdo_driver.php'? Jestem dość początkującym na tematy związane z konfiguracją. Wydaje mi się dziwne, że włamanie do pliku systemowego jest potrzebne, aby PDO działało w CI v.2.1.1, czyż nie? Dlaczego (w większości przypadków) inni nie potrzebują hacku, o którym wspomniałeś? – govinda

+0

@govinda, Zrobiłem mój w linii 81, zaraz po 'else {...}' w konstruktorze klasy. Wydaje się dziwne, że musisz to zhackować, ale od czasu mojej poprawki nie znalazłem nic złego. –

Odpowiedz

8

Tak nie powinno być.

localhost;dbname=testdatabase 

powinny być

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

Dzięki, zmodyfikowałem sterownik CodeIgniter PDO na następujący: '$ this-> hostname = 'mysql: dbname ='. $ This-> database. '; Host ='. $ This-> hostname;' i wydaje się działać teraz. :) –

+3

Modyfikowanie podstawowego sterownika jest niepotrzebne i zostanie przerwane podczas następnej aktualizacji CI, chyba że ponownie wprowadzisz zmianę do pliku podstawowego. Podejmij poniższe podejście, edytując plik ustawień bazy danych. – PaulSkinner

30

W pliku /application/config/database.php gdzie jest

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

musi być

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

localhost lub hosta bazy danych.

+2

+1 - Nie można tego nigdzie znaleźć, rocka! – Chris

+1

Doh. Oczywiście, że powinien. Po prostu założyłem, że CI poradzi sobie z tym wszystkim. – PaulSkinner

1

Według CodeIgniter za Database Configuration stronie

Dla kierowcy PDO, należy zmienić 'hostname => 'localhost'' do "'hostname' => mysql:host=localhost" jak poniżej:

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

sterownik PDO wymaga pełnego DSN ciąg znaków, który należy podać. Ciąg jak ten

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

podczas korzystania z tego ciągu należy usunąć hosta i databasename wartość z tablicy. Myślę, że następujący przykład daje ci pomysł.

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

Dzięki

Powiązane problemy