0

我有以下代码,基本上来自http://www.spiration.co.uk/post/1333/PHP-5-sessions-in-mysql-database-with-PDO-db-objects

让我感到有点奇怪的是,那里没有任何东西可以关闭数据库连接(即设置 $this->db = null)。我应该担心这个(或这里的其他任何事情)吗?具体来说,我应该把 $this->db = null 放在 close() 函数中还是 close() 这里有别的意思?:)

public $db;
public $maxlifetime = 1800; /* 30 mins */
public $expiry;

public function __destruct(){
session_write_close();
}

public function open( $path, $name ) {
$this->db = new PDO('mysql:host=' . MySQLConfigClass::MySql_SERVERNAME . ';dbname=' . MySQLConfigClass::MySql_DBNAME, MySQLConfigClass::MySql_LOGINNAME, MySQLConfigClass::MySql_PASS);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return true;
}

public function close() {
return true;
}

public function read($se_id){
$qry = "select se_value from sessions where se_id = '$se_id' and se_expires > " . time();
$sth = $this->db->prepare($qry);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_ASSOC);
return $result['se_value'];
}

public function write($se_id, $se_val){
$this->expiry = time() + $this->maxlifetime;
try {
$qry= "insert into sessions (se_id, se_value, se_expires) values('$se_id', '$se_val', $this->expiry)";
$sth = $this->db->prepare($qry);
$sth->execute();
} catch (PDOException $e) {
$qry= "update sessions set se_value='$se_val', se_expires=$this->expiry where se_id='$se_id'";
$sth = $this->db->prepare($qry);

$sth->execute();
}
}

public function destroy($se_id){
$qry = "delete from sessions where se_id ='$se_id'";
$sth = $this->db->prepare($qry);
$tot= $sth->execute();
return ($tot);
}

public function gc($maxlifetime){
$qry = "delete from sessions where se_expires < ".time();
$sth = $this->db->prepare($qry);
$tot= $sth->execute();
return ($tot);
}
}

$session = new Session;
session_set_save_handler(
array(&$session, "open"),
array(&$session, "close"),
array(&$session, "read"),
array(&$session, "write"),
array(&$session, "destroy"),
array(&$session, "gc")
);

session_start();
4

2 回答 2

2

在 PDO 中,一旦数据库对象(由 创建new PDO())被销毁,数据库连接就会自动关闭。请参阅PHP PDO 文档中的连接和连接管理

但是,如果您PDO::ATTR_PERSISTENT => true在创建 PDO 对象时进行设置,则连接将被缓存并在后续页面加载时重用,前提是它们对数据库使用相同的凭据。

于 2013-06-02T07:09:02.940 回答
1

当您删除对 PDO 对象的所有引用时(例如通过将引用它的变量设置为null),连接将关闭。当 PHP 退出时也会发生同样的事情。您无需做任何事情。

此外,您可能存在一些糟糕的 SQL 注入漏洞!您已经在使用准备好的查询......请务必为任何可变数据使用参数。

于 2013-06-02T07:09:00.330 回答