2016-04-15 18 views
0

Ich möchte auf eine Connexion-Datenbank durch PDO auf eine statische Weise zugreifen, aber ich bekomme immer noch einen Fehler. Dies ist mein Code:statische und nicht statische Methode zu arbeiten

require_once 'include/class.Settings.php'; 

class MonthlySums{ 
    protected static $dbh; 
    public function __construct() { 
     $user = Settings::$db['user']; 
     $pass = Settings::$db['password']; 
     $dsn = 'mysql:host=' . Settings::$db['host'] . ';dbname=' . Settings::$db['db']; 

     try { 
      self::$dbh = new PDO($dsn, $user, $pass); 
     } catch(PDOException $e) { 
      die("Error! : " . $e->getMessage()); 
     } 

    } 
    public static function get($init_id) { 
     $sql = "SELECT `year`, `month`, `gains_monthly_sum` FROM `fxs_gain_sums` WHERE `init_id` = '$init_id'"; 
     $resultats = MonthlySums::$dbh->query($sql); 
     var_dump($resultats); 
    } 

} 

Ich habe diesen Fehler:

Fatal error: Call to a member function query() on a non-object in /home/public_html/gainlosssums.php on line 45 

Diese Linie ist: $resultats = MonthlySums::$dbh->query($sql);

Wie es eine statische Art und Weise funktioniert?

+0

ändern MonthlySums :: $ dbh-> query ($ sql); zu self :: $ dbh-> query ($ sql); –

+0

Schwerwiegender Fehler: Zugriff auf nicht deklarierte statische Eigenschaft: Einstellungen :: $ dbh in – pollux1er

+0

Ok, der vorherige Fehler ist wieder – pollux1er

Antwort

1

Wenn Sie eine statische Methode in einer Klasse aufrufen, wird der Konstruktor nicht automatisch aufgerufen, wenn Sie eine Instanz der Klasse erstellen. Mit Ihrem Code müssten Sie mindestens eine Instanz der Klasse erstellen, so dass die Datenbankverbindung in Ihrer statischen Variable festgelegt würde. Dann könntest du es auf deine gewünschte statische Art nennen.

(Bitte beachten:

Wenn Sie noch mit Ihrem Code fortsetzen möchten, können Sie es auf diese ändern könnte dies den geänderten Code des OP und ich bin nicht in andere Aspekte geht - nur das Ergebnis auf die Frage/Problem des OP)

require_once 'include/class.Settings.php'; 

class MonthlySums{ 
    protected static $dbh; 

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

    public static function databaseLogin(){ 
     $user = Settings::$db['user']; 
     $pass = Settings::$db['password']; 
     $dsn = 'mysql:host=' . Settings::$db['host'] . ';dbname=' . Settings::$db['db']; 

     try { 
      self::$dbh = new PDO($dsn, $user, $pass); 
     } catch(PDOException $e) { 
      die("Error! : " . $e->getMessage()); 
     } 
    } 

    public static function get($init_id) { 
     $sql = "SELECT `year`, `month`, `gains_monthly_sum` FROM `fxs_gain_sums` WHERE `init_id` = '$init_id'"; 
     $resultats = self::$dbh->query($sql); 
     var_dump($resultats); 
    } 
} 
MonthlySums::databaseLogin(); 

Wie man dort sehen kann, ist eine neue statische Methode databaseLogin und wird direkt nach der Klassendeklaration genannt. Auf diese Weise wird die statische Variable für die Datenbankverbindung festgelegt und kann in anderen Methoden verwendet werden.

jetzt Sie es so nennen kann:

MonthlySums::get(1234); 

Auch hier könnte dies nicht best practice, sondern eine Lösung für Ihr Problem.

+0

Ich denke, du hast Recht! – pollux1er

Verwandte Themen