Ich glaube, ich habe ein Problem damit, zu verstehen, wie OOP funktioniert. Ich habe bereits den Code geändert, dass es funktioniert, aber es ist nicht der richtige Weg, denke ich. Folgendes Szenario (Nein, ich erstelle kein Benutzerlogin selbst, es ist wirklich nur für lokale Entwickler, um OOP besser zu verstehen):
Ich habe eine database.php-Datei:
class Database {
/* Properties */
private $conn;
private $dsn = 'mysql:dbname=test;host=127.0.0.1';
private $user="root";
private $password = '';
/* Creates database connection */
public function __construct() {
try {
$this->conn = new PDO($this->dsn, $this->user, $this->password);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "";
die();
}
return $this->conn;
}
}
In dieser Klasse erstelle ich also eine Datenbankverbindung und gebe die Verbindung (Objekt?)
Dann habe ich eine zweite Klasse, die berühmte User-Klasse (eigentlich verwende ich kein Autoload, aber ich weiß davon):
include "database.php";
class User {
/* Properties */
private $conn;
/* Get database access */
public function __construct() {
$this->conn = new Database();
}
/* Login a user */
public function login() {
$stmt = $this->conn->prepare("SELECT username, usermail FROM user");
if($stmt->execute()) {
while($rows = $stmt->fetch()) {
$fetch[] = $rows;
}
return $fetch;
}
else {
return false;
}
}
}
Das sind also meine zwei Klassen. Nichts Großes, wie Sie sehen. Lassen Sie sich jetzt nicht durch den Funktionsnamen verwirren login
– Eigentlich versuche ich nur, einige Benutzernamen und Benutzermails aus der Datenbank auszuwählen und sie anzuzeigen. Dies versuche ich zu erreichen durch:
$user = new User();
$list = $user->login();
foreach($list as $test) {
echo $test["username"];
}
Und hier kommt das Problem. Wenn ich diesen Code ausführe, bekomme ich folgende Fehlermeldung:
Nicht erfasster Fehler: Aufruf der undefinierten Methode Database::prepare()
Und ich bin mir nicht sicher, ob ich wirklich verstehe, was diesen Fehler verursacht.
Der Code funktioniert gut, wenn ich die folgenden Dinge ändere:
Ändern $conn
in database.php auf öffentlich statt privat (ich denke, das ist schlecht …? Aber wenn es privat ist, kann ich nur Abfragen innerhalb der Database-Klasse ausführen, habe ich Recht? Soll ich also alle diese Abfragen in die Database-Klasse stellen? ? Das finde ich schlecht, denn bei einem großen Projekt wird es schon richtig groß..)
Und die zweite Veränderung, die ich machen muss, ist: Veränderung $this->conn->prepare
zu $this->conn->conn->prepare
in der user.php-Datei. Und hier habe ich wirklich keine Ahnung warum.
Ich meine, im Konstruktor der user.php
Ich habe eine $this->conn = new Database()
und da mir die neue Datenbank das Verbindungsobjekt aus der DB-Klasse zurückgibt, weiß ich wirklich nicht, warum es eine zweite geben muss conn->
Der Konstruktor sollte nichts zurückgeben: stackoverflow.com/questions/6849572/… – um Zugriff auf diese Methode zu haben
Database
Klasse müsste verlängert werdenPDO
– CD001
26. April 2017 um 9:58 Uhr
Dein Fehler ist
$this->conn->prepare(
Sie versuchen, die Vorbereitungsfunktion für Ihre Datenbankklasse aufzurufen, aber es gibt keine Vorbereitungsfunktion. du könntest das machen$conn
of Database public, was dazu führen würde$this->conn->conn->prepare
. der Rückgabewert Ihrer Datenbank__construct()
gibt ein Datenbankobjekt zurück, nicht die Verbindung, selbst wenn Sieretrun $this->conn
– Nitro.de
26. April 2017 um 9:59 Uhr
das ist richtig, denn in Ihrem
Database
Klasseconn
istPDO
Beispiel und hat solche Fähigkeiten– xmike
26. April 2017 um 10:01 Uhr
@Twinfriends ja, da bin ich mir sicher. Wenn Sie das Login in die Datenbankklasse einfügen,
$this->conn
ist das PDO-Objekt von Database, nicht das Database-Objekt selbst– Nitro.de
26. April 2017 um 10:02 Uhr
Innerhalb der Datenbankklasse, die Sie aufrufen würden
$this->conn
– in diesem Fall das ist eine PDO-Instanz, also existiert die Methode und gut ist. Wenn Sie instanziierenDatabase
aber von außen erschaffst du ein neuesDatabase
Objekt, das nur die von Ihnen definierten Methoden hat – es sei denn, Sie erweitern eine andere Klasse.– CD001
26. April 2017 um 10:02 Uhr