设置时,$ dbh不是可识别的变量?

时间:2012-12-01 01:31:30

标签: php pdo

我收到以下消息:

  

注意:未定义的变量:第12行的/var/www/PDO/Functions/PDOFunctions.php中的dbh致命错误:在/ var / www / PDO / Functions中的非对象上调用成员函数prepare()第12行/PDOFunctions.php

$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;
}

我的代码有什么问题?

3 个答案:

答案 0 :(得分: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已损坏且不起作用,因此我也提出了修复方法。

答案 1 :(得分:2)

您不会声明变量全局一次,然后它在所有函数中都可用。

在每个需要访问它的函数中声明全局变量。

请参阅http://php.net/manual/en/language.variables.scope.php

中使用global的示例

答案 2 :(得分:2)

在PHP中,要访问函数中的全局变量,必须使用global关键字声明它属于全局范围。

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

函数中使用的所有变量都是该函数的本地变量,除非声明从全局范围导入。

NOTICE错误是一个有用的警告,表示您可能正在做一些您没想到的事情。