PDO - Frage

Kalito

Erfahrenes Mitglied
Hallo,

ich habe eine Klasse Datenbank, welche im Konstruktor eien PDO-Verbindung aufbaut.
PHP:
class Database extends PDO {
    
    protected $database;
    private $connectionArray = array(
        'host'     => 'mysql:dbname=database;host=127.0.0.1',
        'user'     => 'root', 
        'password' => ''
    );
        
    public function __construct() {
        try {
            $this->database = parent::__construct($this->connectionArray['host'], $this->connectionArray['user'], $this->connectionArray['password']);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }
    }
}


Dann habe ich eine Testklasse, welche ein Objekt der Datenbank-Klasee erstellt
PHP:
class Test {
        public function __construct() {
            parent::$this->database = new Database();
        }

        public function test(){
            $query = "SELECT name FROM firstname WHERE id = 1";
            $stmt  =  $this->database-> prepare($query);           
            $stmt -> execute(array(':id' =>2));
            var_dump($result);
        }
       $test = new Test();
       $test->test();
}

Soweit klappt das auch, nun wollte ich aber meine Selectabfragen alle über eine Funktion in der Datenbank.php abwickeln
PHP:
   public function find($query, $params = null){   
        $statement = $this->database->prepare($query);
        $statement -> execute($params);
        
        return $statement->fetch();
    }

In der function test hätte ich dann
PHP:
    $result= $this->database->find($query);

geschrieben.

Jedoch kommt beim Anruf die Fehlermeldung, dass die Verwendung von Prepare auf ein Non-Object nicht möglich sei. Ich verstehe jetzt nur nicht warum.

Hier nochmal der ganze Code:
Database.php
PHP:
class Database extends PDO {
    
    protected $database;
    private $connectionArray = array(
        'host'     => 'mysql:dbname=Testdatengenerator;host=127.0.0.1',
        'user'     => 'root', 
        'password' => ''
    );
        
    public function __construct() {
        try {
            $this->database = parent::__construct($this->connectionArray['host'], $this->connectionArray['user'], $this->connectionArray['password']);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }
    }
    
    public function find($query, $params = null){   
        $statement = $this->database->prepare($query);
        $statement -> execute($params);
        
        return $statement->fetch();
    }
    
}

Test.php
PHP:
require_once 'Database.php';


class Test extends Database{
        
        public function __construct() {
            parent::$this->database = new Database();
        }

        public function test(){
            $query = "SELECT name FROM firstname WHERE id = 1";
//            $stmt  =  $this->database-> prepare($query);
//            $stmt -> execute(array(':id' =>2));

            $result= $this->database->find($query);
            var_dump($result);
        }
}

$test = new Test();
$test->test();
 
Interessanter Aufruf in deinem Construkteur. Den kenne ich so nicht

PHP:
parent::$this->database = new Database(); 

//Da database als protected definiert ist, kannst du doch direkt darauf zgreifen
$this->database = new Database();
 
Du Instanzierst in einer Kind-Klasse die Eltern-Klasse hmm ich glaub das ist nicht so gedacht.
In deiner Klasse Test sollte im Construct stehen:
PHP:
parent::__construct()

Sei doch bitte so lieb und schreib in deiner Beschreibung der Test klasse das extends Schlüsselwort auch dazu ;)

Ein var_dump auf $this->database vor dem preapre sollte dir erklären, warum das so nicht geht.
 
Zurück