Es ist ein Scoping-Fehler. Sie machen $DBH
eine globale Variable. Wenn Sie die Funktion eingeben, ist die globale Variable nicht verfügbar. Sie haben 5 echte Optionen.
1. Verwenden Sie das Schlüsselwort global
function doSomething() {
global $DBH;
//...
Dies ist keine gute Idee, da es die Wartung und Prüfung einer PITA macht. Stellen Sie sich vor, Sie versuchen diesen Funktionsaufruf zu debuggen. Sie müssen jetzt gehen, herauszufinden, wo $DBH
definiert, um zu versuchen, um herauszufinden, was los ist ...
2. Stellen Sie $DBH
ein Parameter an die Funktion
function doSomething(MySQLi $DBH) {
Es hat den Vorteil, explizit. Aber es ist immer noch nicht großartig, da der aufrufende Code dann die globale Variable verfolgen muss.
3. Erstellen Sie eine Funktion zu "get" die $DBH
Objekt
function getDBH() {
static $DBH = null;
if (is_null($DBH)) {
$DBH = new mysqli(...);
}
return $DBH;
}
function doSomething() {
$DBH = getDBH();
}
Dies hat den Vorteil der globalen Variablen Problem um immer vollständig. Es ist aber auch schwierig, mehrere Verbindungen zu haben oder den Code für andere Verbindungen wiederzuverwenden.
4. Erstellen Sie eine Klasse Zugriff auf die Datenbank
class Database {
public function __construct($host, $user, $pass) {
$this->DBH = new MySQli($host, $user, $pass);
}
public function doSOmething() {
$this->DBH->foo();
}
}
Diese kapselt alles für Sie zu wickeln. Der gesamte Datenbankzugriff erfolgt über eine einzige Klasse, sodass Sie sich keine Gedanken über den globalen Variablenzugriff oder etwas anderes machen müssen.
5. Verwenden Sie eine vordefinierte Klasse/Rahmen
Dies ist die beste Option, da Sie es zu tun, sich nicht kümmern müssen.
Database Access Klassen:
Voll Frameworks:
Wirklich, die Möglichkeiten sind endlos. Finde etwas, das du magst und bleibe dabei. Es wird Ihr Leben wirklich einfacher machen ...
Viel Glück!
+1 Schöne Reihe von Optionen. –
es funktionierte nicht für mich: http://stackoverflow.com/questions/40080426/fatal-error-call-to-a-member-function-prepare-on-a-non-object-in-but-value – fresher