1--TEST--
2MySQL PDOStatement->fetch(), PDO::FETCH_SERIALIZE
3--SKIPIF--
4<?php
5require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
6require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7MySQLPDOTest::skip();
8?>
9--FILE--
10<?php
11	require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
12	$db = MySQLPDOTest::factory();
13
14	try {
15
16		class myclass implements Serializable {
17
18			public function __construct($caller = null) {
19				printf("%s(%s) - note that it must not be called when unserializing\n", __METHOD__, var_export($caller, true));
20			}
21
22			public function __set($prop, $value) {
23				printf("%s(%s, %s)\n", __METHOD__, var_export($prop, true), var_export($value, true));
24				$this->{$prop} = $value;
25			}
26
27			public function serialize() {
28				printf("%s()\n", __METHOD__);
29				return 'Value from serialize()';
30			}
31
32			public function unserialize($data) {
33				printf("%s(%s)\n", __METHOD__, var_export($data, true));
34			}
35
36		}
37
38		printf("Lets see what the Serializeable interface makes our object behave like...\n");
39		$obj = new myclass('Called by script');
40		$tmp = unserialize(serialize($obj));
41		var_dump($tmp);
42
43		printf("\nAnd now magic PDO using fetchAll(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE)...\n");
44		$db->exec('DROP TABLE IF EXISTS test');
45		$db->exec(sprintf('CREATE TABLE test(myobj BLOB) ENGINE=%s', MySQLPDOTest::getTableEngine()));
46		$db->exec("INSERT INTO test(myobj) VALUES ('Data fetched from DB to be given to unserialize()')");
47
48		$stmt = $db->prepare('SELECT myobj FROM test');
49		$stmt->execute();
50		$rows = $stmt->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE, 'myclass', array('Called by PDO'));
51		var_dump($rows[0]);
52
53		$stmt->execute();
54		$rows = $stmt->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE, 'myclass');
55		var_dump($rows[0]);
56
57		printf("\nAnd now PDO using setFetchMode(PDO::FETCH:CLASS|PDO::FETCH_SERIALIZE) + fetch()...\n");
58		$stmt = $db->prepare('SELECT myobj FROM test');
59		$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE, 'myclass', array('Called by PDO'));
60		$stmt->execute();
61		var_dump($stmt->fetch());
62
63	} catch (PDOException $e) {
64		printf("[001] %s [%s] %s\n",
65			$e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
66	}
67
68	$db->exec('DROP TABLE IF EXISTS test');
69	print "done!\n";
70?>
71--EXPECTF--
72Lets see what the Serializeable interface makes our object behave like...
73myclass::__construct('Called by script') - note that it must not be called when unserializing
74myclass::serialize()
75myclass::unserialize('Value from serialize()')
76object(myclass)#%d (0) {
77}
78
79And now magic PDO using fetchAll(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE)...
80myclass::unserialize('Data fetched from DB to be given to unserialize()')
81object(myclass)#%d (0) {
82}
83myclass::unserialize('Data fetched from DB to be given to unserialize()')
84object(myclass)#%d (0) {
85}
86
87And now PDO using setFetchMode(PDO::FETCH:CLASS|PDO::FETCH_SERIALIZE) + fetch()...
88myclass::unserialize('Data fetched from DB to be given to unserialize()')
89object(myclass)#%d (0) {
90}
91done!
92