CodeIgniter的PDO数据库驱动程序无法工作

12

我正在尝试在我的CodeIgniter应用程序中使用PDO MySQL驱动程序。这是我的数据库配置:

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

然而,当我加载一个控制器时,我遇到了以下错误:

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

我已经使用pdo_driver.php中的die($this->hostname);检查了数据源,结果显示为:

localhost;dbname=testdatabase

所以它获取了正确的数据库名称。该数据库存在,并且我已经运行了MySQL。

可能出了什么问题?谢谢。


1
附注:我最近阅读了新版本(2.1.1)的更改日志,关于PDO驱动程序有一些错误修复。你可能想要检查一下。 - Damien Pirsy
Martin,我也遇到了类似的错误:Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in...((列出了几个数据库和核心目录/文件))... syetem/database/drivers/pdo/pdo_driver.php on line 114我还是新手,甚至无法确定你的黑客方法是否能帮助我。你在 .../system/database/drivers/pdo/pdo_driver.php 中究竟编辑了什么?我对配置主题非常陌生。在CI v.2.1.1中需要修改系统文件才能使PDO工作似乎有些奇怪,不是吗?为什么(大多数)其他人不需要你提到的这个黑客方法呢? - govinda
马丁,你能把它完整地表达一下吗?我想确定我是否正在黑掉核心系统文件。你的意思是说,你将.../system/database/drivers/pdo/pdo_driver.php的第81行从这个内容:empty($this->database) OR $this->hostname .= ';dbname='.$this->database; 改成了这个内容:empty($this->database) OR $this->hostname = 'mysql:dbname='.$this->database.';host='.$this->hostname;?还是你可以这样说:哪一行从什么改成了什么? - govinda
1
我已经将它上传到Pastebin上了:http://pastebin.com/SzBcdHGr,只需下载该文件并用Pastebin上的文件替换`/system/database/drivers/pdo/pdo_driver.php`即可。只更改了一行,所以应该可以直接使用。 - James Dawson
这与我尝试猜测$db ['local_dev'] ['hostname']在我的数据库配置中应该是什么值(不成功)时得到的结果类似。如果您有任何更多的想法,我很愿意听取。顺便说一下,我们的/system/database/drivers/pdo/pdo_driver.php副本之间有一些差异,这是我的副本:http://pastebin.com/hV9Ezaqp。您可能会发现第192行上的差异特别有趣。我很快就无法理解了,所以你最好自己看一下。让我知道你对此的想法。 - govinda
显示剩余3条评论
4个回答

29

在文件/application/config/database.php中,位置在哪里

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

必须是

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

本地主机或您的数据库主机。


1
当然应该处理。我只是假定CI会自动处理它。 - PaulSkinner
严格来说,那不是一个主机名。正确的方法是在数据库配置中提供dsn的值,如下面的答案所述。 - S. Imp

11
这不应该是这样的。
localhost;dbname=testdatabase

应该是这样的

mysql:dbname=testdatabase;host=localhost;

1
谢谢,我已经将CodeIgniter PDO驱动程序修改为:$this->hostname = 'mysql:dbname='.$this->database.';host='.$this->hostname; ,现在看起来它能够正常工作。 :) - James Dawson
3
修改核心驱动程序是不必要的,而且如果您忘记再次修改核心文件,下次更新 CI 时会出现错误。请使用以下方法,编辑您的数据库设置文件。 - PaulSkinner

7
PDO驱动程序需要提供完整的DSN字符串。字符串格式如下:
'dsn' = ‘mysql:host=localhost;dbname=databasename’;

当您使用此字符串时,应从数组中删除主机和数据库名称的值。我认为以下示例会给您一个想法。
$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
);

谢谢


0
根据CodeIgniter的数据库配置页面,
对于PDO驱动程序,您应该将'hostname => 'localhost''更改为"'hostname' => mysql:host=localhost",如下所示:
$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'mysql:host=localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'database_name',
    'dbdriver' => 'pdo',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
     .....
     .....
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接