将PDO连接作为会话变量传递

时间:2012-06-28 00:19:50

标签: php pdo

因此,为了不重复自己,我只想创建一个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存储为会话不起作用呢?谢谢你的帮助。

4 个答案:

答案 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