1--TEST--
2MySQL PDOStatement->fetch(), PDO::FETCH_SERIALIZE
3--SKIPIF--
4<?php
5require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
6require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7MySQLPDOTest::skip();
8if (version_compare(PHP_VERSION, '5.1.0', '<'))
9	die("skip Needs 5.1.0 and Interface Serializable");
10?>
11--FILE--
12<?php
13	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
14	$db = MySQLPDOTest::factory();
15
16	try {
17
18		class myclass implements Serializable {
19
20			private static $instance = null;
21			protected $myprotected = 'a protected propery';
22
23			// Good old magic stuff
24			private function __construct($caller = NULL) {
25				printf("%s(%s)\n", __METHOD__, $caller);
26			}
27
28
29			public function __destruct() {
30				// printf("%s()\n", __METHOD__);
31			}
32
33			public function __sleep() {
34				printf("%s()\n", __METHOD__);
35			}
36
37			public function __wakeup() {
38				printf("%s()\n", __METHOD__);
39			}
40
41			public function __call($method, $params) {
42				printf("%s(%s, %s)\n", __METHOD__, $method, var_export($params, true));
43			}
44
45			public function __set($prop, $value) {
46				printf("%s(%s, %s)\n", __METHOD__, $prop, var_export($value, true));
47				$this->{$prop} = $value;
48			}
49
50			public function __get($prop) {
51				printf("%s(%s)\n", __METHOD__, $prop);
52				return NULL;
53			}
54
55			// Singleton
56			public static function singleton($caller) {
57				printf("%s(%s)\n", __METHOD__, $caller);
58
59				if (!self::$instance) {
60					$c = __CLASS__;
61					self::$instance = new $c($caller);
62				}
63				return self::$instance;
64			}
65
66			// Serializable
67			public function serialize() {
68				printf("%s()\n", __METHOD__);
69				return 'Data from serialize';
70			}
71
72			public function unserialize($data) {
73				printf("%s(%s)\n", __METHOD__, var_export($data, true));
74			}
75
76		}
77
78		$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 0);
79		if (0 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
80			printf("[002] Unable to turn off emulated prepared statements\n");
81
82		$db->exec('DROP TABLE IF EXISTS test');
83		$db->exec(sprintf('CREATE TABLE test(id INT, myobj BLOB) ENGINE=%s',
84			MySQLPDOTest::getTableEngine()));
85
86		printf("Creating an object, serializing it and writing it to DB...\n");
87		$id = 1;
88		$obj = myclass::singleton('Creating object');
89		$myobj = serialize($obj);
90		$stmt = $db->prepare('INSERT INTO test(id, myobj) VALUES (?, ?)');
91		$stmt->bindValue(1, $id);
92		$stmt->bindValue(2, $myobj);
93		$stmt->execute();
94
95		printf("\nUnserializing the previously serialized object...\n");
96		var_dump(unserialize($myobj));
97
98		printf("\nUsing PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE to fetch the object from DB and unserialize it...\n");
99		$stmt = $db->prepare('SELECT myobj FROM test');
100		$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE, 'myclass', array('PDO shall not call __construct()'));
101		$stmt->execute();
102		var_dump($stmt->fetch());
103
104		printf("\nUsing PDO::FETCH_CLASS to fetch the object from DB and unserialize it...\n");
105		$stmt = $db->prepare('SELECT myobj FROM test');
106		$stmt->setFetchMode(PDO::FETCH_CLASS, 'myclass', array('PDO shall call __construct()'));
107		$stmt->execute();
108		var_dump($stmt->fetch());
109
110
111	} catch (PDOException $e) {
112		printf("[001] %s [%s] %s\n",
113			$e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
114	}
115
116	print "done!\n";
117?>
118--CLEAN--
119<?php
120require dirname(__FILE__) . '/mysql_pdo_test.inc';
121$db = MySQLPDOTest::factory();
122$db->exec('DROP TABLE IF EXISTS test');
123?>
124--EXPECTF--
125Creating an object, serializing it and writing it to DB...
126myclass::singleton(Creating object)
127myclass::__construct(Creating object)
128myclass::serialize()
129
130Unserializing the previously serialized object...
131myclass::unserialize('Data from serialize')
132object(myclass)#4 (1) {
133  [%u|b%"myprotected":protected]=>
134  %unicode|string%(19) "a protected propery"
135}
136
137Using PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE to fetch the object from DB and unserialize it...
138myclass::unserialize('C:7:"myclass":19:{Data from serialize}')
139object(myclass)#%d (1) {
140  [%u|b%"myprotected":protected]=>
141  %unicode|string%(19) "a protected propery"
142}
143
144Using PDO::FETCH_CLASS to fetch the object from DB and unserialize it...
145myclass::__set(myobj, 'C:7:"myclass":19:{Data from serialize}')
146myclass::__construct(PDO shall call __construct())
147object(myclass)#%d (2) {
148  [%u|b%"myprotected":protected]=>
149  %unicode|string%(19) "a protected propery"
150  [%u|b%"myobj"]=>
151  %unicode|string%(38) "C:7:"myclass":19:{Data from serialize}"
152}
153done!
154