2013-05-11 117 views
-1

我创建了一个MySQL连接阵列,并把它传递给一个连接方法,例如:未定义的阵列偏移,但偏移存在

$database->connect(array(ROOT_DB_HOST, 
     ROOT_DB_NAME, ROOT_DB_USERNAME, ROOT_DB_PASSWORD)); 

当我print_r() connect方法我进去的阵列我的期望:

Array 
(
    [0] => localhost 
    [1] => dbname 
    [2] => dbuser 
    [3] => dbpass 
) 

但是,在connect方法中,我将数组值传递给了DSN字符串,并且我收到了未定义的0,1,2,3偏移量。这里是DSN字符串:

$this->dbh = new PDO('mysql:host='. $connection[0] .';dbname=' . $connection[1],  $connection[2], $connection[3]); 

所以我传递值作为一个数组,并将其插入到PDO构造器和接收错误,我不知道是怎么回事,什么想法吗?

方法:

public function connect($connection) { 
    try { 
     $this->dbh = new PDO('mysql:host='. $connection[0] .';dbname=' . $connection[1], $connection[2], $connection[3]); 
     $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    } catch(PDOException $e) { 
     throw new Exception($e->getMessage()); 
    } 
} 

错误:

Notice: Undefined offset: 0 in database.class.php on line 16 Notice: Undefined offset: 1 in database.class.php on line 16 Notice: Undefined offset: 2 in database.class.php on line 16 Notice: Undefined offset: 3 in database.class.php on line 16

Fatal error: Uncaught exception 'Exception' with message 'SQLSTATE[28000] [1045] Access denied for user 'apache'@'localhost' (using password: NO)' in database.class.php:20 Stack trace: #0 sandboxx.php(16): Database->connect(Array) #1 {main} thrown in database.class.php on line 200

+0

发布您得到的**确切**错误消息。 – Jocelyn 2013-05-11 22:10:04

+1

你也可以发布“connect()”方法的代码吗? – Niko 2013-05-11 22:10:57

+0

当你使用var_dump数组和var_dump $连接时,你会得到什么? – 2013-05-11 22:44:48

回答

-1

你必须串接您的数据库处理的一个问题。如果您先创建
dsn,然后在处理程序中使用它。

$dsn = 'mysql:host='.$connection[0].';dbname='.$connection[1].''; 
$dbh = new PDO($dsn, $connection[2], $connection[3]); 
-1

是什么在存储常量阵点?为什么不使用它们?
另外,你有很奇怪的处理异常的方法。

public function connect($connection) { 
    $opt = array(
     PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
     PDO::ATTR_EMULATE_PREPARES => false, 
    ); 
    $dsn = 'mysql:host='. ROOT_DB_HOST .';dbname='.ROOT_DB_NAME; 
    $this->dbh = new PDO($dsn, ROOT_DB_USERNAME, ROOT_DB_PASSWORD, $opt); 
} 

个人而言,我不明白为什么PDO有这样配置不一致,利用三种不同的设置 - DSN,参数和选项。
为什么你不能给PDO提供一系列设置 - 这是一个谜。

+0

我把它们放入一个序列化数组中,并对它们进行反序列化,因为应用程序必须读/写多个远程数据库,我只是发现代码容易处理的方式。就我处理例外情况而言,我总是乐于学习处理新事物的方法,所以你能澄清你的意思吗? – Naterade 2013-05-13 20:32:29

+1

我的意思是'抛出新的异常($ e-> getMessage());'没有任何意义。 – 2013-05-14 04:23:01