dedlfix: Komplettes Projekt in OOP

Beitrag lesen

echo $begrüßung;

» Was sind ihre Aufgaben? Vielleicht können sie ja als Methoden der database-Klasse realisiert werden.
In der database.ext sind folgende Methoden enthalten:

Mit anderen Worten, sie enthalten Statementerstellung. Das würde Aufgabe einer eigenständigen Klasse sein. Dummerweise braucht man für mysqli::real_escape_string() eine geöffnete Verbindung (und mysqli::set_charset() muss auch ausgeführt sein). Die kannst du dir in deinem Fall über das Singleton holen. Die Statement-Klasse muss man auch mehrfach aufrufen können, um unterschiedliche Statements zu erzeugen. Sie muss also "ganz normal" bleiben.

################# db_make_rwu_sentence

Was heißt rwu? Das solltest du dokumentieren. Außerdem: Schau dir mal die PHPDoc-Syntax an.

  		if($rwu==1||$rwu==2){  		// Typ 1 oder 2  
  			$this->rwu\_sentence .= ($rwu==1) ? $what : "'".$what."'";  
  		} elseif($rwu==3) { 		// Typ 3  
  			$this->rwu\_sentence .= $what."='".$what\_insert[$x]."'";  

Hier fehlt die kontextgerechte Behandlung der Strings. Ein O'Brien macht dir nur einen Syntaxfehler. Ein gezieltes Ausnutzen dieser SQL-Injection-Lücke gefährdet deinen Datenbestand.

  		$this->query="INSERT INTO ".$from\_table." (".$this->db\_make\_rwu\_sentence($what\_array,'',1);  

Auch der Tabellenname erfordert eine kontextgerechte Behandlung, wenn du ihn als einen variablen Bestandteil einfügst. Dafür gibt es aber keine vorgefertigte Funktion, du müsstest dir eine gemäß den Regeln für Identifier selbst erstellen.

  		$this->query="UPDATE ".$from\_table." SET ";  
  		$this->query.=$this->db\_make\_rwu\_sentence($what\_array,$what\_insert,3);  
  		$this->query.=" WHERE ".$when;  

Schau dir mal die Funktion sprintf() an. Mit der bekommst du die Stringerstellung (meiner Meinung nach) übersichtlicher hin.

$this->query= sprintf("UPDATE %s SET %s WHERE %s",
    escape_table_name($from_table),
    $this->db_make_rwu_sentence($what_array,$what_insert,3),
    $when);

Und darein sollen auch noch:
function db_prepared_statement($query,$whatkind,$params){}

Zum Erstellen eines mysqli_stmt-Objekts benötigst du ein mysqli-Objekt. Wenn du also noch kein mysqli_stmt-Objekt hast, würde diese Funktion besser in die Basisklasse passen. Als Ergebnis solltest du entweder ein Objekt einer Result-Klasse oder eine andere Datenstuktur bekommen.

Wenn du sowieso die Statements erst noch zusammenbauen lässt, ist das Verwenden von Prepared Statements nicht sehr sinnvoll. Das Handling ist deutlich aufwendiger als das Statement auf herkömmliche Weise (inklusive Maskierung und Quotierung) zu erstellen, mysql::query() aufzurufen und das Ergebnis abzuholen.

################# db_count_found_or_affected_rows
################# db_fetch_object
################# db_free_result

Das ist Bestandteil des Ergebnismengenhandlings. Es ist sinnvoll, das vom Statement zu trennen, denn ein Statement kann mehrere Resultsets liefern (auch wenn du solche Statements wahrscheinlich nicht verwenden wirst).

################# db_close

Keiner deiner DB-Objekt-Verwender kann wissen, wann die Verbindung geschlossen werden kann. Wenn überhaupt, kann nur der Destruktor die Verbindung schließen oder der Automatismus am Scriptende.

» »» Die MainKlasse wird wieder als Singleton P. gemacht
» Was ist die Aufgabe der MainKlasse?
Hier sind so "Standard"-Funktionen drin. Ich nenne mal Beispiele:
function check_arrays(}
function get_all_requests_in_array(){}

Das soll also eigentlich eine Tools/Utility/Helper-Klasse werden. Die Methoden scheinen mir eigenständig arbeiten zu können, sind also nur in den Klassenrahmen gehängte Funktionen. Dann brauchst du keine Instanz und kein Singleton sondern kannst die Methoden als statisch deklarieren.

» Das database-Objekt wird ja durch das Singleton Pattern in dem Moment erstellt, wenn der erste Zugriff darauf erfolgt. Ein anderweitiges Anlegen ist weder sinnvoll noch nötig und widerspricht auch dem Singleton Pattern, das verlangt, dass der Konstruktor nicht anderweitig aufgerufen werden darf, also private zu sein hat. Die einzige Möglichkeit an ein "gesingletontes" Objekt zu kommen ist der Aufruf der statischen getInstance-Methode (oder wie auch immer man sie nennt). Und jeder, der das Objekt braucht, holt es sich selbst durch Aufruf dieser Methode. Es muss also nicht noch irgendwo anders (global) abgelegt werden.

Achso okay also spart man sich das "$object = new Classname;"

Es geht nicht nur um das Sparen sondern um das Unmöglichmachen einer direkten Instantiierung. Sonst kann ja jeder kommen und sich Instanzen erstellen, was das Singleton ad absurdum führte.

Vielen Dank für die Zend-FW Links. Allerdings möchte auf jeden Fall auf Zend o.ä. verzichten!

Ja, aber du kannst ja mal da reinschauen und die Erfahrung die dort drinsteckt in dein Wissen aufzunehmen versuchen.

echo "$verabschiedung $name";