2010-12-16 14 views
3

Wie kann ich globale DB-Variable innerhalb der Klasse verwenden? Lassen Sie uns sagen, ich habe dies in meinem config.phpVerwendung von globalen DB-Variablen innerhalb von Klassen in PHP

$dbh = new PDO("mysql:host=localhost;dbname=mydb", "root", ""); 

und ich möchte diese $ dbh innerhalb der Klasse wie folgt verwenden (MyClass.php)

class MyClass 
{ 
    public function DoSomething($plogin_id) 
    { 
     $sql = "SELECT * FROM mytable WHERE login_id = :login_id";  
     $stmt = $dbh->prepare($sql); //line 14 
     $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); 
    } 
} 

Und in meiner index.php I ist mit diesem MyClass wie folgt:

include "config.php"; 
$MyObject = new MyClass(); 
$login_result = $MyObject->DoSomething("admin"); 

Es gibt mir Fehler:

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\MyProject\admin\includes\classes\MyClass.php on line 14

Antwort

7

Sie haben irgendwie das $dbh Objekt MyClass passieren. Da Sie keine globalen Variablen verwenden möchten, sollten Sie sie an den Konstruktor MyClass übergeben.

Ihre MyClass und index.php könnte wie folgt aussehen:

class MyClass 
{ 
    protected $dbh = null; 

    public function __construct (PDO $Pdh) 
    { 
     $this->dbh = $Pdh; 
    } 

    public function DoSomething($plogin_id) 
    { 
     $sql = "SELECT * FROM mytable WHERE login_id = :login_id";  
     $stmt = $this->dbh->prepare($sql); //line 14 
     $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); 
    } 
} 

// in your index.php 
$MyObject = new MyClass ($dbh); 

Dies ist im Grunde ein Muster Dependency Injection genannt. Weitere Informationen dazu finden Sie unter this excellent tutorial.

0

Dies ist die am häufigsten verwendete Methode:

public function DoSomething($plogin_id){ 
    global $dbh; 
    ... 

Alternative Ansatz:

eine singleton für die Datenbankverbindung erstellen. Und Sie verwenden, dass anstelle einer globalen Variablen:

$stmt = MyDBConn::getInstance()->prepare($sql); 
+0

@Downvoter Erklären Sie bitte. –

+0

Sie befürworten die Verwendung von Globalen. –

+0

@Alin; Ich habe nicht abgestimmt, aber das Problem, das Sie tatsächlich auf den Titel der Frage beantworten, aber lassen Sie uns sagen, dass das OP das Problem missverstanden, sein Problem ist eigentlich nicht mit dieser – RageZ

1

Sie können es in Ihrer Funktion einführen, indem Sie:

global $dbh; 

Allerdings könnte es eine bessere Idee, um es in die Klasse hinzuzufügen, wie folgt aus:

class MyClass 
{ 
    private $dbh; 

    public function __construct($dbh) { 
     $this->dbh = $dbh; 
    } 

    public function DoSomething($plogin_id) 
    { 
     $sql = "SELECT * FROM mytable WHERE login_id = :login_id";  
     $stmt = $this->dbh->prepare($sql); //line 14 
     $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); 
    } 
} 

und dann:

include "config.php"; 
$MyObject = new MyClass($dbh); // I'm assuming $dbh is created in config.php 
$login_result = $MyObject->DoSomething("admin"); 

Oder, stellen Sie es in Ihre Funktion zum Zeitpunkt des Anrufs:

class MyClass 
{ 
    public function DoSomething($plogin_id, $dbh) 
    { 
     $sql = "SELECT * FROM mytable WHERE login_id = :login_id";  
     $stmt = $dbh->prepare($sql); //line 14 
     $stmt->bindParam(':login_id', $plogin_id, PDO::PARAM_STR); 
    } 
} 

Und dann:

include "config.php"; 
$MyObject = new MyClass($dbh); // I'm assuming $dbh is created in config.php 
$login_result = $MyObject->DoSomething("admin", $dbh); 
Verwandte Themen