我想通过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);
如何使其以静态方式工作?
当您在类中调用静态方法时,构造函数不会像创建类的实例那样自动调用。使用代码时,您必须至少创建一个类的实例,以便在静态变量中设置数据库连接。然后你就可以用你想要的静态方式来调用它了。
如果你仍然想继续使用你的代码,你可以将其更改为:
(请注意:这是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);
同样,这可能不是最佳实践,但可以解决您的问题。