0

我有一个成功连接到我的本地主机和我的数据库的数据库类,我想选择我的用户数据库中的所有用户,但是当我调用我的数据库时,事实证明这比我想象的要困难得多。

我收到很多错误,例如:

Notice: Undefined variable: host in E:\xampp\htdocs\attendance\class.Register.php on line 10

Notice: Undefined variable: dbname in E:\xampp\htdocs\attendance\class.Register.php on line 10

Notice: Undefined variable: user in E:\xampp\htdocs\attendance\class.Register.php on line 10

Notice: Undefined variable: pass in E:\xampp\htdocs\attendance\class.Register.php on line 10

Fatal error: Call to undefined method Database::prepare() in E:\xampp\htdocs\attendance\class.Register.php on line 17

但是我已经在我的数据库类中定义了这些,并告诉我的注册类需要连接文件。我究竟做错了什么?我似乎无法弄清楚我应该如何在我的注册类中调用我的数据库连接?有人有想法么?

类.Connect.php

<?php

// Database connection PDO

class Database {

  public function __construct() {

  // Connection information
  $host   = 'localhost';
  $dbname = 'imanage';
  $user   = 'root';
  $pass   = '';

  // Attempt DB connection
  try
  {
    $this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //echo 'Successfully connected to the database!';
   }
   catch(PDOException $e)
   {
    echo $e->getMessage();
   }        
  }

  public function __destruct()
  {
    // Disconnect from DB
    $this->pdo = null;
    //echo 'Successfully disconnected from the database!';
  }
}
?>

类.Register.php

<?php

require 'class.Connect.php';
class Register {

    public function __construct()
    {
           $this->pdo = new Database($host, $dbname, $user, $pass); //ofcourse you can get the db connections details and database name from a config file
    }

        public function viewall() {

    $sql = "SELECT * FROM users";
    $stmt = $this->pdo->prepare($sql);
    $stmt->execute();
    // here you go:
    $users = $stmt->fetchAll();

    foreach ($users as $row) {
        print $row["firstname"] . "-" . $row["lastname"] ."<br/>";
    }
    }
}
$run = new Register();
$run->viewall();
?>
4

4 回答 4

2

您正在$this->pdo用于定义数据库连接,但忘记为类定义属性。

定义类属性如下。

class Register
{
    private  $pdo;
    public function __construct()
    {
         $this->pdo = new Database();    
    }

您的Database类构造函数不接受任何参数,因此在创建Database类对象期间避免传递参数。

于 2013-09-18T09:23:13.753 回答
1

让我建议你按如下方式修改这些类。

类.Connect.php

<?php

// Database connection PDO

class Database {

    public function __construct($host, $dbname, $user, $pass) {
        // Attempt DB connection
        try
        {
            $this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

类.Register.php

<?php

require 'class.Connect.php';

class Register {
        private $pdo;   // This variable will only be accessible from inside this class
    public function __construct($database)
         {

           $this->pdo = $database; //ofcourse you can get the db connections details and database name from a config file

然后像这样使用这些类。

// Connection information
$host   = 'localhost';
$dbname = 'imanage';
$user   = 'root';
$pass   = '';

$database = new Database($host, $dbname, $user, $pass);
$register = new Register($database);

这使这些类更具可移植性,并使它们更易于测试。

于 2013-09-18T09:41:50.083 回答
0

在您的代码中,您添加的注释是:

class Register {
    public function __construct()
         {
           $this->pdo = new Database($host, $dbname, $user, $pass); 
           // ofcourse you can get the db connections details and database 
           // name from a config file
       }

但这是一个对象,所以不,你实际上不能。一个对象基本上对外部世界一无所知,除非你明确告诉它。

因此,除非您想使用全局变量或其他类似的丑陋事物,否则您将需要修改创建新对象的方式:

$this->pdo = new Database();

您可以这样做,因为您的数据库类已经包含详细信息(其次,您的 Register 对象不知道它们,或者您必须在 Register 对象中声明它们并修改数据库类的构造函数以接受输入。

于 2013-09-18T09:47:09.620 回答
0

您的 Database 类没有“准备”方法。

因此,此代码:$stmt = $this->pdo->prepare($sql);将导致您遇到的致命错误。 $this->pdo仅包含您的 Database 类的实例。

Fatal error: Call to undefined method Database::prepare() in E:\xampp\htdocs\attendance\class.Register.php on line 17

你可以$stmt = $this->pdo->pdo->prepare($sql);在你的注册课上做。这将消除您遇到的错误。$this->pdo将是您的 Database 类的实例,然后该类中的属性 pdo 包含您的 pdo 类的实例。

于 2013-09-18T09:56:55.087 回答