Das ist ein Scoping-Fehler. Sie machen $DBH
eine globale Variable. Wenn Sie also die Funktion eingeben, ist die globale Variable nicht verfügbar. Sie haben 5 echte Optionen.
1. Verwenden Sie das globale Schlüsselwort
function doSomething() {
global $DBH;
//...
Das ist keine gute Idee, da es die Wartung und das Testen zu einer PITA macht. Stellen Sie sich vor, Sie versuchen, diesen Funktionsaufruf zu debuggen. Sie müssen jetzt herausfinden, wo $DBH
ist definiert, um herauszufinden, was hier vor sich geht...
2. Machen Sie $DBH
ein Parameter für die Funktion
function doSomething(MySQLi $DBH) {
Sie hat den Vorteil, dass sie eindeutig ist. Aber es ist immer noch nicht toll, da der aufrufende Code dann die globale Variable im Auge behalten muss.
3. Erstellen Sie eine Funktion zum "Holen" der $DBH
Objekt
function getDBH() {
static $DBH = null;
if (is_null($DBH)) {
$DBH = new mysqli(...);
}
return $DBH;
}
function doSomething() {
$DBH = getDBH();
}
Dies hat den Vorteil, dass das Problem der globalen Variablen vollständig umgangen wird. Aber es ist auch schwer, mehrere Verbindungen zu haben oder einen Teil des Codes für andere Verbindungen wiederzuverwenden.
4. Erstellen Sie eine Klasse für den Datenbankzugriff
class Database {
public function __construct($host, $user, $pass) {
$this->DBH = new MySQli($host, $user, $pass);
}
public function doSOmething() {
$this->DBH->foo();
}
}
Damit ist alles für Sie auf den Punkt gebracht. Der gesamte Datenbankzugriff erfolgt über eine einzige Klasse, so dass Sie sich nicht um den Zugriff auf globale Variablen oder andere Dinge kümmern müssen.
5. Verwendung einer vorgefertigten Klasse/eines vorgefertigten Rahmens
Dies ist die beste Option, da Sie sich nicht selbst darum kümmern müssen.
Datenbankzugriffsklassen:
Vollständige Rahmenwerke:
Die Auswahl ist wirklich endlos. Finden Sie etwas, das Sie mögen, und bleiben Sie dabei. Es wird Ihr Leben wirklich einfacher machen...