1

したがって、繰り返さないために、PDO接続を1つだけ作成し、セッション変数を使用してページ間でそれを渡したいと思います。しかし、PDO接続をセットアップしてセッション変数を設定すると、次のページで変数が設定されていないものとして戻ってきますか?

これは私の最初のページのコードです:

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

永続的な接続を使用できます。

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

アプリケーションは、接続が再構築されているかのように動作します。したがって、接続をシリアル化して渡す必要はありません。

ただし、ユーザー セッションが終了したら解放できるように注意して閉じる必要があります。

永続的な接続の必要性は正確には何ですか?

于 2012-06-28T00:25:06.100 に答える
0

永続的な接続を使用できますが、それはお勧めできません。貴重なシステム リソースを拘束し、実際に共有ホストから追い出される可能性があり、実際にはそれほど有用ではありません。各ページの最後で接続を閉じ、次のページで新しい接続を開始するだけです。本当に必要な場合は、永続的な接続の設定をPDO オブジェクトPDO::ATTR_PERSISTENTに設定する必要があります。true

于 2012-06-28T00:27:56.300 に答える
0

ページの実行が終了すると、PHP はデータベース接続を閉じ、使用済みのリソースを解放します。次に、これはリソース/ハンドラーであり、実際には値ではありません。

于 2012-06-28T00:24:29.157 に答える