Verwendung globaler Variablen innerhalb von Funktionen
DieKerstin
- php
Hallo,
ich erzeuge mit einer index.php eien HTML Seite. In diese index.php habe ich nun mit:
<?php
include 'functions.php';
?>
eine functions.php eingebunden in der ich einige Funktionen habe die jeweils einen Datenbank Zugriff machen. Dmit ich die DB Connection nicht in jeder function einzeln herstellen muss, dachte ich mir das so: (Datei functions.php)
<?php
$db = @new mysqli('localhost', '***', '***', '***');
if (mysqli_connect_errno())
{
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
...
function foo()
{
$sql = "SELECT name FROM ...
$result = $db->query($sql);
...
}
...
?>
Das funktioniert aber leider nicht. Wenn ich die Connection erst innerhalb der Funktion "foo()" herstelle geht es. Ich denke, dass die Variable $db die außerhalb von "foo()" deklariert wurde innerhalb von "foo()" nicht bekannt ist.
Wie macht man das richtig?
$db = @new mysqli('localhost', '***', '***', '***');
Ist es Absicht, dass du die Fehlermeldungen unterdrückst?
Ich denke, dass die Variable $db [...]
$db ist genaugenommen eine Instanz der mysqli-Klasse.
Wie macht man das richtig?
Die Gültigkeit von Variablen (aka. Scope) kannst du im PHP-Manual nachschlagen.
Hi!
Ich denke, dass die Variable $db [...]
$db ist genaugenommen eine Instanz der mysqli-Klasse.
$db ist genaugenommen eine Variable, deren Inhalt eine Instanz ...
Wie macht man das richtig?
Die Gültigkeit von Variablen (aka. Scope) kannst du im PHP-Manual nachschlagen.
Mit einer globalen Variable und dem Schlüsselwort global rumzuhantieren ist nicht besonders elegant. Elegantere Lösungen wären:
Vorschlag 1:
Ein Singleton-Pattern, ausgeführt als Funktion:
function getInstance(){
[link:http://de3.php.net/manual/en/language.variables.scope.php#language.variables.scope.static@title=static] $instance = null;
if ($instance == null)
$instance = Initialisierung;
return $instance;
}
Anwendung von überall her:
$db = getInstance();
$db->...
Vorschlag 2:
Eine Datenzugriffsabstraktionsklasse. Die Erzeugung der DB-Instanz zu zentralisieren kann man als einen ersten Schritt ansehen. Weitergehen könnte man alle Datenzugriffe in eine Klasse legen, in der jeder einzelne Datenwunsch von einer Methode erledigt wird. Diese Klasse kann sich dann intern um die Verwaltung der DB-Instanz kümmern, wobei sich auch da ein Singleton anbietet. Damit nun nicht von dieser Klasse eine Instanz angelegt werden muss, und man somit vom Regen in die Traufe kommt, kann man diese Klasse statisch entwerfen. Das heißt, die Datenmethoden werden statisch aufgerufen und die DB-Instanz (und eventuell weitere interne Werte) werden in statischen Klassenvariablen abgelegt.
Als Beispiel könnte die Abfrage eines Users so aussehen:
$user = Data::getUser($id);
Die Methode getUser() kümmert sich selbständig um das Beschaffen und Bereitstellen der benötigen Daten für den einen User.
Lo!