dedlfix: Connection-Handle global verwenden

Beitrag lesen

echo $begrüßung;

Bei jedem Query muss so wie ich das verstehe der Rückgabewert der Verbindung mit übergeben werden. Aber: Diesen Wert habe ich nicht immer "zur Hand", insbesondere wenn ich mich in verschiedenen Klassen bewege. Natürlich könnte ich bei jedem Funktionsaufruf die Variable mit übergeben, aber das erscheint mir etwas umständig.

Hat jemand von euch eine gute Lösung für mich?

Ob du sie auch gut findest, musst du selbst entscheiden :-)

Ich entnehme deiner Beschreibung, dass du deine Datenbankverbindung einmal irgendwo "oben" geöffnet und deine Datenbankabfragen quer über das restliche Script verteilt hast.

Ich kann mir mehrere Möglichkeiten vorstellen, dein Problem zu umgehen, aber alle laufen mehr oder weniger auf das Singleton-Muster hinaus. Ein Muster (Pattern) ist keine konkrete Implementation einer Lösung, sondern nur eine Art und Weise, ein Problem zu lösen. Singleton liefert allen Anfragenden die selbe Instanz eines Dinges. Gibt es dieses Ding noch nicht, wird es erzeugt, ansonsten wird immer nur diese eine erzeugte Instanz geliefert.

Du könntest dir eine Funktion schreiben, die ein Datenbankhandle zurückgibt

funktion dbConnection() {  
  static $conn = null;  
  
  if ($conn == NULL)  
    $conn = initialisierung();  
  
  return $conn;  
}

Das Connectionhandle wird in der statischen lokalen Variable $conn gespeichert, deren Inhalt auch dann erhalten bleibt, wenn die Funktion verlassen wird. $conn ist aber außerhalb der Funktion nicht ansprechbar. An allen Stellen, an denen du nun das DB-Handle brauchst, übergibst du es durch den Aufruf von dbConnection. (Funktionsaufrufe sind ja auch nicht durch Variablengültigkeitsbereiche eingeschränkt.)

$result = query(dbConnection(), ...);

Eine Grundinitialisierung im Script wird nicht benötigt, denn das erledigt dbConnection() bei Bedarf.

Soweit die Lösung mit dem wenigsten Umstellungsaufwand deiner bisherigen Scripte. Da du aber sowieso schon mit Klassen arbeitest, bietet es sich eigentlich an, mit mysqli im OOP-Stil zu arbeiten, und nicht prozedural. Und auch hier bietet sich das Singleton-Muster an, eine Funktion oder statische Methode zu erstellen, die man mit der Lieferung und ggf. Erzeugung einer Instanz beauftragen kann.

Eine weitere Möglichkeit ist, eine Datenbankabstraktionsschicht in die Anwendung einzubauen, um damit wieder mehr datenbankspezifischen Code von der eigentlichen Anwendungslogik zu entfernen. Das kann man soweit treiben, dass die Anwendung am Ende gar nicht mehr mitbekommt, wer der eigentliche Datenlieferant ist. Man ruft nur noch eine Funktion/Methode (ggf. mit Parametern) auf und erhält die Daten in bereits abgepackter Form (z.B. Array).

echo "$verabschiedung $name";