记Codeigniter中使用PDO的一个坑

1868
1
2015-08-19

由于项目需求,因此必须使用PDO且额外连接几个数据库,这些数据库的配置以DSN的形式存储在redis中。CI如何使用DSN来连接数据库?官方文档如是说:

或者你可以使用数据源名称(DSN,Data Source Name)作为参数,DSN 的格式必须类似于下面这样:

$dsn = 'dbdriver://username:password@hostname/database';
$this->load->database($dsn);

于是我按照文档使用正确的格式连接数据库

$this->db = $this->load->database('pdo://root:root@127.0.0.1/17koko_1', TRUE);

var_dump了一下this->db,结果如图

是个CI_DB_pdo_driver,看起来蛮正常的是吧。于是我使用这个连接开始操作数据库

是的如你所见报错了,而且不止query无法运行,几乎任何操作都报错。折腾了半天都无法解决,但使用

$this->mdb = $this->load->database('default', TRUE);

配置出来的mdb却可以正常操作数据库。诧异之余我决定把mdb也var_dump出来

我这样一截图,差异就很明显了。要知道当时我可是以肉眼比对了好久,才发现这两者之间的差距——对,用DSN连接的数据库实例没有"subdriver"值,且类型也不是CI_DB_pdo_mysql_driver,官方文档中怎么没有就pdo这一特例给点注释呢,坑我呢吧,我还以为那么智能了

最终,使用

$this->db = $this->load->database('pdo://root:root@127.0.0.1/17koko_1?subdriver=mysql', TRUE);

连接数据库,问题解决

昵称
邮箱
网址
七月流火sun的头像 2016-01-14 14:11

先顶后看