1

我收到以下消息:

注意:未定义变量:第 12 行 /var/www/PDO/Functions/PDOFunctions.php 中的 dbh 致命错误:在 /var/www/PDO/Functions/PDOFunctions 中的非对象上调用成员函数 prepare()。第 12 行的 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;
}

我的代码有什么问题?

4

3 回答 3

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 已损坏且无法正常工作,因此我也对此进行了修复。

于 2012-12-01T01:45:54.800 回答
2

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

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

请参阅http://php.net/manual/en/language.variables.scope.phpglobal中的使用示例

于 2012-12-01T01:34:02.963 回答
2

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

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

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

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

于 2012-12-01T01:34:05.087 回答