[英]Can't create class instance in Session Class
我正在嘗試在數據庫中記錄會話。 我創建了類,並且試圖在其構造中調用數據庫類。 我收到此錯誤:
警告:SafePDO :: __ construct()缺少參數1,在...中調用
這是我的數據庫類:
Class SafePDO extends PDO {
public static function exception_handler($exception) {
// Output the exception details
die('Uncaught exception: ' . $exception->getMessage());
}
public function __construct($dsn, $username = '', $password = '', $driver_options = array()) {
// Temporarily change the PHP exception handler while we...
set_exception_handler(array(__CLASS__, 'exception_handler'));
// ... create a PDO object
parent::__construct($dsn, $username, $password, $driver_options);
// Change the exception handler back to whatever it was before
restore_exception_handler();
}
}
$db = new PDO('mysql:host=localhost;dbname=mynshost_tarrot;charset=utf8', 'mynshost_tarrot', 'PickTarrot2');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
這是我的Session課:
class Session {
private $db;
public function __construct() {
// Instantiate new Database object
$this->db = new SafePDO;
// Set handler to overide SESSION
session_set_save_handler(
array($this, "_open"), array($this, "_close"), array($this, "_read"), array($this, "_write"), array($this, "_destroy"), array($this, "_gc")
);
// Start the session
session_start();
}
/**
* Open
*/
public function _open() {
// If successful
if ($this->db) {
return true;
}
return false;
}
/**
* Close
*/
public function _close() {
// Close the database
if ($this->db->close()) {
return true;
}
return false;
}
/**
* Read
*/
public function _read($id) {
try {
$stmt = $db->prepare("SELECT data FROM sessions WHERE id = :user_id");
$stmt->bindValue(':user_id', $user_id, PDO::PARAM_INT);
$stmt->execute();
$row_sess_data = $stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $ex) {
print "<h3>An Error occured!</h3>";
print $ex->getMessage();
}
return $row_sess_data['data'];
}
/**
* Write
*/
public function _write($user_id, $data) {
// Create time stamp
$access = time();
try {
$stmt = $db->prepare("REPLACE INTO sessions VALUES (:user_id, :access, :data)");
$stmt->bindValue(':user_id', $user_id, PDO::PARAM_INT);
$stmt->bindValue(':access', $access, PDO::PARAM_STR);
$stmt->bindValue(':data', $data, PDO::PARAM_STR);
$stmt->execute();
// $row_sess_data = $stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $ex) {
print "<h3>An Error occured!</h3>";
print $ex->getMessage();
}
}
// End of __write()
/**
* Destroy
*/
public function _destroy($id) {
try {
$stmt = $db->prepare("DELETE FROM sessions WHERE id = :user_id");
$stmt->bindValue(':user_id', $user_id, PDO::PARAM_INT);
$stmt->execute();
} catch (PDOException $ex) {
print "<h3>An Error occured!</h3>";
print $ex->getMessage();
}
}
// End of __destroy()
/**
* Garbage Collection
*/
public function _gc($max) {
// Calculate what is to be deemed old
$old = time() - $max;
try {
$stmt = $db->prepare("DELETE * FROM sessions WHERE access < :old");
$stmt->bindValue(':old', $old, PDO::PARAM_STR);
$stmt->execute();
} catch (PDOException $ex) {
print "<h3>An Error occured!</h3>";
print $ex->getMessage();
}
}
// End of _gc()
}
這兩個類均來自Internet的真實示例。 SavePDO來自PHP.net,Session類來自此處: http ://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/
我整天都在嘗試。 我的錯誤在哪里? 謝謝!
您忘了在此處的Session類中添加dsn:
$this->db = new SafePDO;
由於您的構造函數沒有dsn public function __construct($dsn,
的默認值,因此會引發錯誤。這很正常。
您應該將此dsn賦予Session類,以便能夠創建SafePDO
實例。
我不知道您如何使用它們,但是應該運行第一個腳本,然后在創建Session時執行以下操作:
$session = new Session($db);
然后在您的Session類中:
class Session
{
private $db;
public function __construct($db)
{
$this->db = $db;
您沒有任何參數地構建了SafePDO
類的對象:
$this->db = new SafePDO;
但是需要$dsn
參數
您必須設置它。 並且您應該設置數據庫用戶名。
請參閱以下示例:
$this->db = new SafePDO('mysql:host=localhost;dbname=example_db;', 'example_usr');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.