在PDO中调用非对象的成员函数prepare()

时间:2012-11-18 04:33:34

标签: php pdo

大家好我的代码有问题。使用__construct()我收到致命错误:在非对象上调用成员函数prepare()但没有它我的代码正在运行。

class Animals{

public $db_fields;

 public function __construct(){
  $this->db_fields = $this->get_fields();

  foreach($this->db_fields as $field){
  $this->$field = "";
 }


 public function get_fields(){
  global $dbh;

  $q = $dbh->prepare("DESCRIBE animals");
  $q->execute();
  $db_fields = $q->fetchAll(PDO::FETCH_COLUMN);

  return $db_fields;
 }
}
$f = new Animals();

/*** mysql hostname ***/
$hostname = 'localhost';
/*** mysql username ***/
$username = 'root';
/*** mysql password ***/
$password = '';
/*** mysql database***/
$dbname = 'animals';

try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database <br />';

$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}

我只想让我的字段(animal_id,animal_type,animal_name)与

一样工作
public $animal_id;
public $animal_type;
public $animal_name;

1 个答案:

答案 0 :(得分:0)

您必须在创建Animals之后实例化$dbh对象,否则get_fields()函数中未定义它。

$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$f = new Animals();

话虽这么说,更好的设计是使用依赖注入,并将$dbh对象发送到类,如下所示:

$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$f = new Animals( $dbh);

因此,您更新的课程将如下所示:

class Animals{

    private $dbh;

    public function __construct( $dbh){
        $this->dbh = $dbh;
    }

    public function get_fields(){
        $q = $this->dbh->prepare("DESCRIBE animals");
    }
}

好处?你摆脱了global变量。通常,需要一个全局变量是一个糟糕的设计,你想避免它。您可以根据您遇到的问题了解原因 - 它需要设置全局状态才能运行。