CodeIgniter PDO 数据库驱动程序不工作

Posted

技术标签:

【中文标题】CodeIgniter PDO 数据库驱动程序不工作【英文标题】:CodeIgniter PDO database driver not working 【发布时间】:2012-06-18 18:09:20 【问题描述】:

我正在尝试在我的 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;

但是,当我加载控制器时出现此错误:

致命错误:未捕获异常“PDOException”,消息“无效” 数据源名称'在 C:\xampp\htdocs\testsite\system\database\drivers\pdo\pdo_driver.php:114

我在pdo_driver.php 中使用die($this->hostname); 检查了数据源,结果如下:

localhost;dbname=testdatabase

所以它得到了正确的数据库名称。数据库存在,我确实在运行 MySQL。

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

【问题讨论】:

旁注:我最近阅读了新版本 (2.1.1) 的更新日志,并且有一些关于 PDO 驱动程序的错误修正。你可能想检查一下 Martin,我遇到了类似的错误:Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in...((several database and core dir/ files listed))... syetem/database/drivers/pdo/pdo_driver.php on line 114 我是新手,我什至无法判断您的 hack 是否对我有帮助。您在.../system/database/drivers/pdo/pdo_driver.php具体在哪里编辑了哪些内容?我是配置主题的新手。让 PDO 在 CI v.2.1.1 中工作需要对系统文件进行 hack,这对我来说似乎很奇怪,不是吗?为什么(假设大多数)其他人不需要你提到的黑客? @govinda,我在第 81 行做了我的,就在类构造函数中的 else ... 之后。你需要破解它似乎很奇怪,但自从我修复它以来我没有发现任何问题。 Martin,你能把它拼写成一个完整的想法吗?我想确定我是否正在破解核心系统文件。您的意思是说您将.../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;?不然你能这么说吗? - 哪一行从什么变成什么...? 我把它放在了 pastebin 上:pastebin.com/SzBcdHGr 只需下载该文件并将 /system/database/drivers/pdo/pdo_driver.php 替换为 Pastebin 中的文件,它应该可以工作。仅更改了一行,因此它应该可以立即使用。 【参考方案1】:

关于文件/application/config/database.php在哪里

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

必须

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

localhost 或您的数据库主机。

【讨论】:

多哈。当然应该。我只是假设 CI 会立即处理它。 严格来说,这不是主机名。正确的方法是在 db 配置中为 dsn 提供一个值,如下面的答案所述。【参考方案2】:

不应该是这样的。

localhost;dbname=testdatabase

应该是

mysql:dbname=testdatabase;host=localhost;

【讨论】:

谢谢,我将 CodeIgniter PDO 驱动程序修改为:$this->hostname = 'mysql:dbname='.$this->database.';host='.$this->hostname;,它现在似乎可以工作了。 :) 修改核心驱动是不必要的,下次更新 CI 时会中断,除非您记得再次对核心文件进行更改。采用以下方法,改为编辑数据库设置文件。【参考方案3】:

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

谢谢

【讨论】:

【参考方案4】:

根据CodeIgniter的Database Configuration页面,

对于 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'),
     .....
     .....
);

【讨论】:

以上是关于CodeIgniter PDO 数据库驱动程序不工作的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter框架连接读取MS Access数据库文件

如何在codeigniter普通mysql和自定义pdo中运行并发数据库连接[重复]

如何在 codeigniter 3 中使用 PDO

在 CodeIgniter 3 中设置数据库连接超时

Codeigniter 数据库访问 - ORM 性能

在codeigniter中逃避足够的防止sql注入的保护