diff options
Diffstat (limited to 'ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt')
-rw-r--r-- | ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt new file mode 100644 index 0000000..18ef17b --- /dev/null +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt @@ -0,0 +1,153 @@ +--TEST-- +MySQL PDOStatement->fetch(), PDO::FETCH_SERIALIZE +--SKIPIF-- +<?php +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); +MySQLPDOTest::skip(); +if (version_compare(PHP_VERSION, '5.1.0', '<')) + die("skip Needs 5.1.0 and Interface Serializable"); +?> +--FILE-- +<?php + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); + $db = MySQLPDOTest::factory(); + + try { + + class myclass implements Serializable { + + private static $instance = null; + protected $myprotected = 'a protected propery'; + + // Good old magic stuff + private function __construct($caller = NULL) { + printf("%s(%s)\n", __METHOD__, $caller); + } + + + public function __destruct() { + // printf("%s()\n", __METHOD__); + } + + public function __sleep() { + printf("%s()\n", __METHOD__); + } + + public function __wakeup() { + printf("%s()\n", __METHOD__); + } + + public function __call($method, $params) { + printf("%s(%s, %s)\n", __METHOD__, $method, var_export($params, true)); + } + + public function __set($prop, $value) { + printf("%s(%s, %s)\n", __METHOD__, $prop, var_export($value, true)); + $this->{$prop} = $value; + } + + public function __get($prop) { + printf("%s(%s)\n", __METHOD__, $prop); + return NULL; + } + + // Singleton + public static function singleton($caller) { + printf("%s(%s)\n", __METHOD__, $caller); + + if (!self::$instance) { + $c = __CLASS__; + self::$instance = new $c($caller); + } + return self::$instance; + } + + // Serializable + public function serialize() { + printf("%s()\n", __METHOD__); + return 'Data from serialize'; + } + + public function unserialize($data) { + printf("%s(%s)\n", __METHOD__, var_export($data, true)); + } + + } + + $db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 0); + if (0 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY)) + printf("[002] Unable to turn off emulated prepared statements\n"); + + $db->exec('DROP TABLE IF EXISTS test'); + $db->exec(sprintf('CREATE TABLE test(id INT, myobj BLOB) ENGINE=%s', + MySQLPDOTest::getTableEngine())); + + printf("Creating an object, serializing it and writing it to DB...\n"); + $id = 1; + $obj = myclass::singleton('Creating object'); + $myobj = serialize($obj); + $stmt = $db->prepare('INSERT INTO test(id, myobj) VALUES (?, ?)'); + $stmt->bindValue(1, $id); + $stmt->bindValue(2, $myobj); + $stmt->execute(); + + printf("\nUnserializing the previously serialized object...\n"); + var_dump(unserialize($myobj)); + + printf("\nUsing PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE to fetch the object from DB and unserialize it...\n"); + $stmt = $db->prepare('SELECT myobj FROM test'); + $stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE, 'myclass', array('PDO shall not call __construct()')); + $stmt->execute(); + var_dump($stmt->fetch()); + + printf("\nUsing PDO::FETCH_CLASS to fetch the object from DB and unserialize it...\n"); + $stmt = $db->prepare('SELECT myobj FROM test'); + $stmt->setFetchMode(PDO::FETCH_CLASS, 'myclass', array('PDO shall call __construct()')); + $stmt->execute(); + var_dump($stmt->fetch()); + + + } catch (PDOException $e) { + printf("[001] %s [%s] %s\n", + $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); + } + + print "done!\n"; +?> +--CLEAN-- +<?php +require dirname(__FILE__) . '/mysql_pdo_test.inc'; +$db = MySQLPDOTest::factory(); +$db->exec('DROP TABLE IF EXISTS test'); +?> +--EXPECTF-- +Creating an object, serializing it and writing it to DB... +myclass::singleton(Creating object) +myclass::__construct(Creating object) +myclass::serialize() + +Unserializing the previously serialized object... +myclass::unserialize('Data from serialize') +object(myclass)#4 (1) { + [%u|b%"myprotected":protected]=> + %unicode|string%(19) "a protected propery" +} + +Using PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE to fetch the object from DB and unserialize it... +myclass::unserialize('C:7:"myclass":19:{Data from serialize}') +object(myclass)#%d (1) { + [%u|b%"myprotected":protected]=> + %unicode|string%(19) "a protected propery" +} + +Using PDO::FETCH_CLASS to fetch the object from DB and unserialize it... +myclass::__set(myobj, 'C:7:"myclass":19:{Data from serialize}') +myclass::__construct(PDO shall call __construct()) +object(myclass)#%d (2) { + [%u|b%"myprotected":protected]=> + %unicode|string%(19) "a protected propery" + [%u|b%"myobj"]=> + %unicode|string%(38) "C:7:"myclass":19:{Data from serialize}" +} +done! |