dedlfix: Komplettes Projekt in OOP

Beitrag lesen

echo $begrüßung;

Ich überlege gerade folgendes. Da MySQLi ja eh komplett OOP ist, brauche ich ja rein theoretisch garkeine DB Klasse. Ich wil trotzdem eine machen um ggf. irgendwann falls nötig auf ein anderes DBMS umsteigen zu können, eine DBKlasse machen.

Bedenke, dass der Umstieg normalerweise deshalb erfolgt, weil man Feature X haben will, dass im alten System nicht vorhanden war. Es erfordert dann meist auch ein grundlegendes Umstricken des DB-Handlings und mancher Statements (andere Syntax).

Aber wenn man das jetzt mal alles zusammenfasst, sollte diese nur die Methoden "db_connect" sowie "db_prepare", "db_bind"(für bind_param / bind_result), "db_execute" beinhalten, welche ja voneinander abhängig sind irgendwo. Also packe ich die letzten Methoden jetzt in eine extra Klasse und sie bekommen das benötigte MySQLi-Objekt als Singleton oder kommen sie auch in die DB_Klasse und immer wenn ein MySQLi-Objekt per getInstance() erzeugt wird, wird dieses Objekt einer Variable der DBKlasse übergeben auf das die anderen Methoden der Klasse dann immer zurückgreifen können?

Du scheinst das Singleton Pattern noch nicht verstanden zu haben. Es muss nichts rumgereicht werden. Jeder kann sich die Instanz beim S. abholen, wenn er sie braucht.

Meine Vorgehensweise wäre, eine DB-Klasse zu erstellen, die irgendwie die Zugangsdaten bekommt und eine Methode bereitstellt, mit der man SQL-Statements ausführen und eine Ergebnismenge zurückbekommen kann. Das heißt, am Ende hat sie eine öffentliche Methode (plus gegebenenfalls Zugangsdatenübergabe). Man übergibt das vollständige SQL-Statement oder eins mit Platzhaltern zuzüglich der Werte. Alles weitere passiert intern. Die Methode kann sogar statisch sein, wenn keine weiteren öffentlichen Hilfsmethoden benötigt werden.

» Ich schrieb gestern, die Statementerzeugung solle in die Basisklasse. Oben schrieb ich, jeder instantiiere sie sich selbst. Es kommt darauf an, was du letztlich implementierst. Willst du ein Prepared Statement erstellen inklusive der Instanz eines mysqli_stmt-Objekts,

Das check ich nicht.

Es ist vielleicht etwas verwirrend, weil der Begriff Statement oftmals und mit unterschiedlicher Bedeutung auftaucht. Wenn "SQL" dabeisteht, dann ist ein SQL-Statement-String gemeint ("SELECT ...", "INSERT ...") ansonsten ein Prepared Statement, also ein Objekt, dass einen SQL-Statement-String bekommen kann und mit Werten verbunden und exekutiert werden kann.

Ich will das performante&sichere.

Performanter dürfte sein, auf (mysqli-) P.S. zu verzichten, wenn SQL-Statements erst noch zusammengebaut werden müssen und wenn Ergebnisse mit unterschiedlichen Spaltenanzahlen abgeholt werden müssen. Die Sicherheit lässt sich mit Maskieren erreichen.

Ich verstehe nicht den Unterschied zwischen MySQLi_stmt und normalem MySQli oder isses beide das gleiche?

Es gibt drei Klassen innerhalb der mysqli-Extension: mysqli, mysqli_stmt und mysqli_result. (Die vierte (mysqli_driver) ist uninteressant.) Eine mysqli-Klasse brauchst du immer. mysqli_result bekommst du als Ergebnis eines mysqli::query(). und mysqli::prepare() liefert dir ein mysqli_stmt-Objekt, an das du deine Parameter- und Result-Variablen binden musst sowie execute() und fetch() aufrufst. Wenn dir das soweit noch nicht klar ist, übe doch erst einmal den Umgang mit der mysqli-Extension, bevor du eine DB-API drumherum entwickelst.

Mein Ziel war es einfach die Möglichkeit von Multi-Querys zu nutzen und die Tatsache das dass benutzen von Prepared Statements schneller und sicher ist, sowie das ganze OOP ist.

Multi-Querys sind noch mal eine Kategorie für sich. Da kommen dann noch weitere Herausforderungen auf dich zu, wie der Umgang mit mehreren Resultsets. Schneller können P.S. nur sein, wenn man sie so verwendet, wie vorgesehen.

Wo liegt denn dann der Unterschied zwischen Singleton P. und eine public static Methode? Letzteres ist sicherer aufgrund des Public Sichtbarkeitsmodofizierer?

Eine statische Methode ist eine Methode einer Klasse, die ohne Instanz aufgerufen werden kann. Das Singleton Pattern ist mehr, es nutzt aber eine statische Methode, um seine Aufgabe zu erfüllen. Zunächst muss der Konstruktor private sein, damit keine Instanz direkt erzeugt werden kann. Neben der statischen öffentlichen Methode gibt es noch eine statische und private Eigenschaft, in der die Instanz geparkt wird, wenn sie bei der ersten Anforderung erzeugt wird. Anforderungen kommen immer über die statische Methode. Die gibt die geparkte Instant raus und instantiiert beim Erstaufruf vorher diese Instanz und legt sie in der statischen Eigenschaft ab. Wie das als Code aussieht ist im PHP-Handbuch zu sehen: Singleton Pattern.

echo "$verabschiedung $name";