2013-05-11 124 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