2012-12-01 48 views
0

我收到以下消息:

Notice: Undefined variable: dbh in /var/www/PDO/Functions/PDOFunctions.php on line 12 Fatal error: Call to a member function prepare() on a non-object in /var/www/PDO/Functions/PDOFunctions.php on line 12

$dbh = new PDO('mysql:host=localhost;dbname=pdo', 'root', 'xxxxxxxxxxx'); 
global $dbh; 


function PDOFetch($Var) 
{ 
    $sth = $dbh->prepare("$Var"); //Error Line 
    $sth->execute(); 
    $result = $sth->fetchAll(); 
    return $result; 
} 

function PDONumb ($Var) 
{ 
    $Query = $dbh->prepare("{$Var}"); 
    $Execute->execute(); 
    $count = $Execute->rowCount(); 
    return $count; 
} 

什麼是我的代碼的問題?

+2

'global $ dbh'進入函數內部。 –

+0

看看我的簡單[DByte庫](https://github.com/Xeoncross/DByte)。 – Xeoncross

+0

問題是你不知道'global'是如何工作的。你應該用google搜索並閱讀文檔,然後再問Stack Overflow的問題...... – meagar

回答

2

在PHP中,在函數中訪問一個全局變量,你必須聲明,它屬於全球範圍內使用全球關鍵字。

function PDOFetch($Var) 
{ 
    global $dbh; 
    $sth = $dbh->prepare("$Var"); //Error Line 
    $sth->execute(); 
    $result = $sth->fetchAll(); 
    return $result; 
} 

除非聲明爲從全局範圍導入,否則函數中使用的所有變量都是該函數的局部變量。

NOTICE錯誤是一個有用的警告,您可能正在做一些您沒有料到的事情。

+0

修復了這個問題,定時器讓我在10分鐘內將問題標記爲答案:) thankyou –

3

使用全局變量是不好的做法。對於像這樣簡單的事情,您可以將您的代碼重寫爲簡單的類。在此過程中,您還可以輕鬆創建和使用多個數據庫句柄。

class Db 
{ 
    private $dbh = null; 

    public function __construct() 
    { 
     $this->dbh = new PDO('mysql:host=localhost;dbname=pdo', 'root', 'xxxxxxxxxxx'); 
    } 

    public function PDOFetch($Var) 
    { 
     $sth = $this->dbh->prepare("$Var"); //Error Line 
     $sth->execute(); 
     $result = $sth->fetchAll(); 
     return $result; 
    } 

    public function PDONumb ($Var) 
    { 
     $sth = $this->dbh->prepare("{$Var}"); 
     $sth->execute(); 
     $count = $sth->rowCount(); 
     return $count; 
    } 
    // Other methods here 
} 

然後,它的:

$dbc1 = new Db(); 
$dbc2 = new Db(); // Hey I have 2 connections now, cool 
$result1 = $dbc1->PDOFetch(..); 
$result2 = $dbc2->PDOFetch(..); 

請注意,您PDONumb被打破,是行不通的,所以我用一個固定的扔這一點。

+0

將查看這個入侵到我的系統!謝謝!是的,我只是剛剛審查一個:) –