diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php index 9c4c5aa3d1ff..531d04bf407a 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php @@ -51,9 +51,10 @@ public function __construct(\PDO $pdo, array $dbOptions = array()) $this->pdo = $pdo; $this->dbOptions = array_merge(array( - 'db_id_col' => 'sess_id', - 'db_data_col' => 'sess_data', - 'db_time_col' => 'sess_time', + 'db_id_col' => 'sess_id', + 'db_data_col' => 'sess_data', + 'db_time_col' => 'sess_time', + 'base64_encode' => true, ), $dbOptions); } @@ -141,7 +142,11 @@ public function read($id) $sessionRows = $stmt->fetchAll(\PDO::FETCH_NUM); if (count($sessionRows) == 1) { - return base64_decode($sessionRows[0][0]); + if ($this->dbOptions['base64_encode']) { + return base64_decode($sessionRows[0][0]); + } + + return $sessionRows[0][0]; } // session does not exist, create it @@ -164,8 +169,12 @@ public function write($id, $data) $dbIdCol = $this->dbOptions['db_id_col']; $dbTimeCol = $this->dbOptions['db_time_col']; - //session data can contain non binary safe characters so we need to encode it - $encoded = base64_encode($data); + if ($this->dbOptions['base64_encode']) { + //session data can contain non binary safe characters so we need to encode it + $encoded = base64_encode($data); + } else { + $encoded = $data; + } try { if ('mysql' === $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME)) { @@ -218,8 +227,13 @@ private function createNewSession($id, $data = '') $sql = "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time)"; - //session data can contain non binary safe characters so we need to encode it - $encoded = base64_encode($data); + if ($this->dbOptions['base64_encode']) { + //session data can contain non binary safe characters so we need to encode it + $encoded = base64_encode($data); + } else { + $encoded = $data; + } + $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $id, \PDO::PARAM_STR); $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); diff --git a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php index ff1565a183a9..7305766ba783 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php @@ -60,4 +60,19 @@ public function testSessionGC() $storage->gc(-1); $this->assertEquals(0, count($this->pdo->query('SELECT * FROM sessions')->fetchAll())); } + + public function testEncoding() + { + $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); + + $storage->write('foo', 'bar'); + $result = $this->pdo->query('SELECT * FROM sessions')->fetchAll(); + $this->assertEquals(base64_encode('bar'), $result[0]['sess_data']); + + $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions', 'base64_encode' => false), array()); + + $storage->write('foo', 'bar'); + $result = $this->pdo->query('SELECT * FROM sessions')->fetchAll(); + $this->assertEquals('bar', $result[0]['sess_data']); + } }