2016-04-15 183 views
0

我想通过PDO以静态方式访问连接数据库,但我仍然收到错误。这是我的代码:静态和非静态方法工作

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); 
    } 

} 

我有这样的错误:

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

这条线是:$resultats = MonthlySums::$dbh->query($sql);

如何使它工作静态的方式?

+0

更改MonthlySums :: $ dbh-> query($ sql);到self :: $ dbh-> query($ sql); –

+0

致命错误:访问未声明的静态属性:Settings :: $ dbh – pollux1er

+0

好吧,上一个错误又回来了 – pollux1er

回答

1

在类中调用静态方法时,不会像创建类的实例时那样自动调用构造函数。使用你的代码,你将不得不创建至少一个类的实例,以便数据库连接将被设置在你的静态变量中。那么你可以用你想要的静态方式来调用它。

如果仍想继续你的代码,你可以把它改成这样:

请注意:这是OP的修改后的代码,我不会到其他方面 - 只是结果到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(); 

正如你可以看到有一个新的静态方法databaseLogin和类声明之后被调用。这样,数据库连接的静态变量就可以设置,并且可以在其他方法中使用。

现在你可以这样调用它:

MonthlySums::get(1234); 

同样,这可能不是最好的做法,但你的问题的解决方案。

+0

我认为你是对的! – pollux1er