我想以静态方式通过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 :(得分: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);
同样,这可能不是最佳做法,而是解决您的问题。