我收到以下消息:
注意:未定义的变量:第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;
}
我的代码有什么问题?
答案 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错误是一个有用的警告,表示您可能正在做一些您没想到的事情。