因此,为了不重复自己,我只想创建一个PDO连接,并使用session var在页面之间传递它。但是当我设置我的PDO连接并设置会话var时,var会在我的下一页上没有设置回来吗?
这是我第一页上的代码:
session_start();
try
{
$db = new PDO("mysql:host=".$dbHostname.";dbname=".$dbDatabase, $dbUsername, $dbPassword);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
echo "It seems there was an error. Please refresh your browser and try again. ".$e->getMessage();
}
$_SESSION['db'] = $db;
然后我的下一页上的测试代码又回来了。
session_start();
$db = $_SESSION['db'];
if(isset($db))echo "set";
else echo "not set";
任何想法??
连接正常,因为如果我从第一页调用一个函数并传递$ db作为参数,该函数可以正常工作。那么为什么将数据库var存储为会话不起作用呢?谢谢你的帮助。
答案 0 :(得分:4)
PDO
不允许会话序列化。实际上,您根本无法在会话中序列化数据库连接。如果真的有必要这样做,你可以这样做:
class DB {
private $db;
private $creds;
public function __construct($host, $dbname, $user, $pass) {
$this->creds = compact('host', 'dbname', 'user', 'pass');
$this->db = self::createLink($host, $dbname, $user, $pass);
}
public function __sleep() {
return array('creds');
}
public function __wakeup() {
$this->db = self::createLink($this->creds['host'] ...
}
public static function createLink($host ...
return new PDO(...
}
}
答案 1 :(得分:0)
PHP关闭数据库连接并在页面完成执行后释放已用资源。 其次,它是资源/处理程序,而不是真正的价值。
答案 2 :(得分:0)
您可以使用持久连接。
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
您的应用程序的行为就像重建连接一样。因此,您无需序列化连接并传递它。
但是当用户会话结束时你需要小心并关闭它,以便它可以被释放。
您对持久连接的需求究竟是什么?
答案 3 :(得分:0)
您可以使用持久连接,但这不是一个好主意。它占用了宝贵的系统资源,实际上可能会让你从共享主机中被踢出来,实际上并不是那么有用。只需关闭每页末尾的连接,然后在下一页开始新的连接即可。如果真的,真的想要它那么持久连接的设置是PDO::ATTR_PERSISTENT
,必须在PDO对象上设置为true
。