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


Passing a PDO connection as a session var

所以为了不重复自己,我只想创建一个PDO连接,并使用会话变量在页面之间传递它。 但是当我设置 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 存储为会话不起作用呢? 感谢您的任何帮助。

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(...
   }
}

PHP 在页面完成执行后关闭数据库连接并释放使用的资源。其次,它是一个资源/处理程序,而不是一个真正的值。

您可以使用持久连接。

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));

应用程序的行为与重建连接的行为完全相同。因此,您无需序列化连接并将其传递。

但是您确实需要小心并在用户会话结束时关闭它,以便可以释放它。

您对持久连接的需求究竟是什么?

您可以使用持久连接,但这是一个坏主意。它占用了宝贵的系统资源,实际上可能会让您从共享主机中踢出,实际上并不是那么有用。只需关闭每个页面末尾的连接,然后在下一页开始一个新连接。如果您真的想要它,那么持久连接的设置是PDO::ATTR_PERSISTENT必须在您的 PDO 对象上设置为true