1--TEST--
2MySQL PDO->prepare(), native PS, named placeholder
3--SKIPIF--
4<?php
5require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
6require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7MySQLPDOTest::skip();
8$db = MySQLPDOTest::factory();
9?>
10--FILE--
11<?php
12	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
13	$db = MySQLPDOTest::factory();
14
15	try {
16
17		$db->exec('DROP TABLE IF EXISTS test');
18		$db->exec(sprintf('CREATE TABLE test(id INT, label CHAR(255)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE));
19
20		$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 0);
21		if (0 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
22			printf("[002] Unable to turn off emulated prepared statements\n");
23
24		// INSERT a single row
25		$stmt = $db->prepare("INSERT INTO test(id, label) VALUES (100, ':placeholder')");
26
27		// Yes, there is no placeholder to bind to and named placeholder
28		// do not work with MySQL native PS, but lets see what happens!
29		// The ':placeholder' is a string constant in the INSERT statement.
30		// I would expect to get an error message, but this is not what happens.
31		$stmt->execute(array(':placeholder' => 'row1'));
32		if ('00000' !== $stmt->errorCode())
33			printf("[003] Execute has failed, %s %s\n",
34				var_export($stmt->errorCode(), true),
35				var_export($stmt->errorInfo(), true));
36
37		// Ok, what has happened: anything inserted into the DB?
38		$stmt = $db->prepare('SELECT id, label FROM test');
39		$stmt->execute();
40		var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
41
42		// Now the same with emulated PS.
43		$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 1);
44		if (1 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
45			printf("[004] Unable to turn on emulated prepared statements\n");
46
47		// Note that the "named placeholder" is enclosed by double quotes.
48		$stmt = $db->prepare("INSERT INTO test(id, label) VALUES(101, ':placeholder')");
49		// No replacement shall be made
50		$stmt->execute(array(':placeholder' => 'row1'));
51		// Again, I'd like to see an error message
52		if ('00000' !== $stmt->errorCode())
53			printf("[005] Execute has failed, %s %s\n",
54				var_export($stmt->errorCode(), true),
55				var_export($stmt->errorInfo(), true));
56
57		// Now, what do we have in the DB?
58		$stmt = $db->prepare('SELECT id, label FROM test ORDER BY id');
59		$stmt->execute();
60		var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
61
62	} catch (PDOException $e) {
63		printf("[001] %s [%s] %s\n",
64			$e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
65	}
66
67	print "done!";
68?>
69--CLEAN--
70<?php
71require dirname(__FILE__) . '/mysql_pdo_test.inc';
72$db = MySQLPDOTest::factory();
73$db->exec('DROP TABLE IF EXISTS test');
74?>
75--EXPECTF--
76[003] Execute has failed, 'HY093' array (
77  0 => 'HY093',
78  1 => NULL,
79  2 => NULL,
80)
81array(0) {
82}
83array(1) {
84  [0]=>
85  array(2) {
86    ["id"]=>
87    string(3) "101"
88    ["label"]=>
89    string(12) ":placeholder"
90  }
91}
92done!
93