echo $begrüßung;
Fortsetzung von Komplettes Projekt in OOP.
Ich rufe hiermit den großen Dedlfix und Co. auf, mich weiterhin zu unterstützen ;).
Es haben sich ja schon einige Antworten eingefunden. Teilweise gehen sie aber andere Wege als ich im Sinn hatte. Und das ist auch nicht verkehrt, denn die einzig wahre Lösung gibt es nicht. Wie auch immer, es folgen einige Anmerkungen aus meiner Sicht.
public static $db_host;
public static $db_user;
public static $db_pw;
public static $db_name;
public static $db_connection;
Braucht jemand diese Angaben außer den Mitgliedern deiner Klasse? Wohl kaum. Für die Zugangsdaten reichen private Variablen, wenn sie überhaupt benötigt werden. Also, die Variablen meine ich. Die Zugangsdaten brauchst du nur um die Verbindung aufzubauen. Die soll ja auch, während das Script läuft, nicht wieder geschlossen werden. Es reicht also, wenn die die Verbindung aufbauende Methode sich die Zugangsdaten besorgt. Eine Konfigurationsdatei ist dafür einer der möglichen guten Wege. Ein weiteres Rumhantieren mit diesen Daten außerhalb der Klasse entfällt dann.
Und auch die Connection ist nichts, was öffentlich zugänglich sein sollte. Genau das willst du ja kapseln.
Singleton
public static function db_singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
Auf das $c kannst du verzichten.
self::$instance = new db();
ist zum einen ausreichend und zum anderen sehe ich keinen Anwendungsfall bei dem der Klassenname nicht bekannt ist. Der einzige Grund für deinen Weg ist meines Erachtens, dass du dir die Möglichkeit der Umbenennung der Klasse vorbehalten willst und für diesen Fall diese Stelle nicht mehr anpassen willst. Für alle anderen klassenintern Verweise auf den Klassennamen kannst du ja self:: verwenden ...
Datenbankwerte setzen
public function db_set_vars($host,$name,$pw,$dbname){
$db_host=$host;
$db_user=$user;
$db_pw=$pw;
$db_name=$dbname;
... und das musst du auch. So wie du es mit der self::$instance gemacht hast, musst du es auch mit den anderen Klassenvariablen machen.
Allerdings darf das Setzen der Zugangsdaten - so du es doch von außen tun willst - nicht als Methode der Instanz implementiert sein. Denn in dem Fall müsste der erste Verwender die Zugangsdaten setzen und die anderen brauchen und dürfen das nicht mehr. Woher weiß denn aber der erste, dass er der erste ist? Er muss das nicht wissen, muss sich also auch nicht um die Zugangsdaten kümmern müssen.
Wenn du dabei bleibst und die Daten explizit bereitstellst, dann mach das mit einer statischen Methode, die irgendwo am Scriptanfang mit anderen Initialisierungsaufgaben aufgerufen wird. Normalerweise müsste sich diese Methode auch noch gegen Zweitaufruf wehren. Wenn also beispielsweise der Host schon gesetzt ist, dann ein ignorierendes return; oder dem Aufrufer einen Fehler vor die Füße werfen.
# Zur Datenbank verbinden
public function db_connect()
Der Verbindungsauf- und -abbau ist auch keine Angelegenheit der Verwender. Die stellen solche Anforderungen wie eine Query auszuführen. Wenn dazu eine Verbindung benötigt wird, muss das die Query-Methode bei Bedarf erledigen. Sie kann dazu eine private Connect-Methode aufrufen, welche ihrerseits nachschaut, ob die Verbindung schon besteht und wenn nicht, sie herstellt.
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
} else {
echo "alles korrekt";
Aufgabe der DB-Klasse ist nicht, auf den Bildschirm zu malen. Wenn sie sich mitzuteilen gedenkt, dann über Rückgabewerte oder Fehlermeldungen oder Exceptions.
$user="name";
$pw="pw";
$sql="INSERT INTO users(user,pw) VALUES('".$user."','".$pw."')";
Wenn du die Query selbst zusammenbaust, musst du dich auch selbst um die kontextgerechte Behandlung kümmern. Mit diesen beiden Werten ist das zwar nicht nötig, aber wenn es nur ein Test sein sollte, hättest du die Werte auch direkt in die Query einbauen können.
Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\_next\allethemen\classes\class.db.php on line 52
Line: 52 $db_connection->query($query);
Was ist denn daran falsch? Warum ist es kein Objekt, ich habe es doch oben als Objekt instanziert:
Kontrollausgaben! Mit einer solchen hättest du sehen können, dass $db_connection null ist. Und mit einem aus E_ALL stehenden error_reporting hätte auch noch ein Zugriff auf eine nicht vorhandene Variable angezeigt werden müssen.
Es ist also kein Objekt sondern eine nicht vorhandene Variable. Es gehört zum Grundlagenwissen der OOP, einfache Variablen von Instanzvariablen von Klassenvariablen zu unterscheiden. Alle drei Typen werden unterschiedlich notiert.
echo "$verabschiedung $name";