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

ただし、データベース クラスでこれらを定義し、登録クラスに接続ファイルを要求するように指示しました。私は何を間違っていますか?登録クラスでデータベース接続を呼び出す方法がわかりませんか? 誰にもアイデアはありますか?

class.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!';
  }
}
?>

class.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

1

クラスを次のように作り直すことをお勧めします。

class.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);

class.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 に答える