2009-07-21 55 views
1

我有一些數據庫信息存儲在config.inc.php中,我試圖用它來訪問我有的類中的數據庫,但由於某些原因,變量爲空。繼承人的代碼:php定義的變量具有空值

<?php 

require_once 'dbinterface.php'; 
require_once 'config.inc.php'; 

class user { 

    ... 

    function user($id) { 
     $this->db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']); 
     ... 
    } 
... 
?> 

和這裏的config.inc.php文件:

<?php 

$DB['host'] = '192.168.1.107'; 
$DB['user'] = '****'; 
$DB['pass'] = '****'; 
$DB['database'] = 'qa'; 

?> 

我不知道爲什麼我得到空,但這裏是我的證明:

Fatal error: Uncaught exception 'Exception' with message 'No database selected' in D:\development\PHP\qanda\dbinterface.php:18 Stack trace: #0 D:\development\PHP\qanda\user.class.php(17): db->db(NULL, NULL, NULL, NULL) #1 D:\development\PHP\qanda\log.php(17): user->user('1') #2 {main} thrown in D:\development\PHP\qanda\dbinterface.php on line 18

+0

這是所有在config.inc.php? – AndyMcKenna 2009-07-21 20:15:04

回答

4

你將不得不宣佈$DB作爲global這個工作:

global $DB; 

$DB['host'] = '192.168.1.107'; 
$DB['user'] = '****'; 
$DB['pass'] = '****'; 
$DB['database'] = 'qa'; 

而在你的類定義:

function user($id) { 
     global $DB; 
     $this->db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']); 
     ... 
    } 
1

您將文件包含在課程範圍之外。如果您將需求移動到函數內部,它將按預期工作。

更好的選擇是將它包含在構造函數中,循環遍歷$DB數組,並將其值分配給$this->DB,以便您可以在任何類的函數中訪問它。您還需要修改您的功能以使用$this->DB而不是$DB

function __construct() { 
    require_once 'dbinterface.php'; 
    $this->DB = array(); 
    foreach ($DB as $key => $value) { 
     $this->DB[$key] = $value; 
    } 
} 
+0

+1 - 在函數的開始處移動require或添加「全局$ DB」 – Greg 2009-07-21 20:18:07

+0

另外,如果您在開啓NOTICES的情況下開發,則會發現更多easliy – Greg 2009-07-21 20:20:05

3

您有variable scoping問題。如果您config.inc文件包括在全球範圍內,那麼這應該工作:

function user($id) { 
    global $DB; 
    $this->db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']); 
    ... 
} 
1

通常,使用全局變量是一個壞主意。在這種情況下,它可以工作,但並不是最佳的。最好的想法是使用定義。

define('DB_HOST', '192.168.1.107'); 
define('DB_USER', '****'); 
define('DB_PASS', '****'); 
define('DB_DATABASE', 'qa'); 

... 

function user($id) { 
    $this->db = new db(DB_HOST, DB_USER, DB_PASS, DB_DATABASE); 
    ... 
}