1

因此,为了不重复自己,我只想创建一个 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 作为参数传递,该函数可以正常工作。那么为什么将数据库变量存储为会话不起作用呢?感谢您的任何帮助。

4

4 回答 4

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(...
   }
}
于 2012-06-28T00:25:00.467 回答
0

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

于 2012-06-28T00:24:29.157 回答
0

您可以使用持久连接。

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

您的应用程序的行为将与正在重建连接一样。因此,您无需序列化连接并传递它。

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

您对持久连接的确切需求是什么?

于 2012-06-28T00:25:06.100 回答
0

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

于 2012-06-28T00:27:56.300 回答