Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter PDO数据库驱动程序不工作_Php_Mysql_Codeigniter_Pdo - Fatal编程技术网

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

Php CodeIgniter PDO数据库驱动程序不工作,php,mysql,codeigniter,pdo,Php,Mysql,Codeigniter,Pdo,我正在尝试在CodeIgniter应用程序中使用PDO MySQL驱动程序。这是我的数据库配置: $active_group = 'default'; $active_record = TRUE; $db['default']['hostname'] = 'localhost'; $db['default']['username'] = 'root'; $db['default']['password'] = ''; $db['default']['database'] = 'testdata

我正在尝试在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”,消息“invalid” 中的“数据源名称” C:\xampp\htdocs\testsite\system\database\drivers\pdo\pdo_driver.php:114

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

localhost;dbname=testdatabase
因此,它得到了正确的数据库名称。数据库已经存在,我的MySQL正在运行


这里会出什么问题?谢谢。

情况不应该是这样

localhost;dbname=testdatabase
应该是

mysql:dbname=testdatabase;host=localhost;

文件/application/config/database.php中的

$db['default']['hostname'] = 'localhost';
一定是

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

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

根据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'),
     .....
     .....
);

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

谢谢

谢谢,我将CodeIgniter PDO驱动程序修改为:
$this->hostname='mysql:dbname='。$this->database';主机='。$this->hostname现在似乎可以工作了。:)修改核心驱动程序是不必要的,并且将在下次更新CI时中断,除非您记得再次更改核心文件。采用下面的方法,编辑数据库设置文件。旁注:我最近阅读了新版本(2.1.1)的更改日志,其中有一些关于PDO驱动程序的错误修复。您可能想检查一下,Martin,我收到了一个类似的错误:
致命错误:未捕获异常“PDOException”,消息为“找不到驱动程序”,位于…(列出了几个数据库和核心目录/文件))。。。syetem/database/drivers/pdo/pdo_driver.php第114行
我是个新手,我甚至不知道你的黑客是否会帮我。您在
../system/database/drivers/pdo/pdo_driver.php
中编辑了哪些内容?我在配置方面是个新手。在我看来,要使PDO在CI v.2.1.1中工作,需要对系统文件进行黑客攻击,这似乎很奇怪,不是吗?为什么(假设大多数)其他人不需要你提到的黑客?@govinda,我在第81行做了我的,就在类构造函数中的
else{…}
之后。你真的需要破解它,这看起来很奇怪,但自从我修复它之后,我发现它没有任何问题。马丁,你能把它作为一个完整的想法告诉我吗?我想确定我是否正在破解一个核心系统文件。你的意思是说你把
../system/database/drivers/pdo/pdo_driver.php
的开箱即用的行#81改为:
empty($this->database)或$this->hostname.=';dbname='.$this->database
,指向以下内容:
empty($this->database)或$this->hostname='mysql:dbname='。$this->database';主机='。$this->hostname?或者你可以这样说吗哪一行从what改为what…?我把它放在了pastebin上:只需下载该文件并用pastebin中的文件替换
/system/database/drivers/pdo/pdo_driver.php
,就可以了。只更改了一行,因此它应该是开箱即用的。Doh。当然应该。我只是假设CI会马上处理。严格地说,那不是主机名。正确的方法是在db配置中为dsn提供一个值,如下所述。