PHP  
 PHP_5_6
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

Test Failure Report for ext/pdo_mysql/tests/pdo_mysql_prepare_native.phpt ('MySQL PDO->prepare(), native PS')

Script

1: <?php
2:     
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR 'mysql_pdo_test.inc');
3:     
$db MySQLPDOTest::factory();
4:
5:     function 
prepex($offset, &$db$query$input_params null$error_info null$suppress_warning false) {
6:
7:         try {
8:
9:             if (
$suppress_warning || (is_array($error_info) && isset($error_info['prepare'])))
10:                 
$stmt = @$db->prepare($query);
11:             else
12:                 
$stmt $db->prepare($query);
13:
14:             if (
is_array($error_info) && isset($error_info['prepare'])) {
15:                 
$tmp $db->errorInfo();
16:
17:                 if (isset(
$error_info['prepare']['sqlstate']) &&
18:                     (
$error_info['prepare']['sqlstate'] !== $tmp[0])) {
19:                     
printf("[%03d] prepare() - expecting SQLSTATE '%s' got '%s'\n",
20:                         
$offset$error_info['prepare']['sqlstate'], $tmp[0]);
21:                     return 
false;
22:                 }
23:
24:                 if (isset(
$error_info['prepare']['mysql']) &&
25:                     (
$error_info['prepare']['mysql'] !== $tmp[1])) {
26:                     
printf("[%03d] prepare() - expecting MySQL Code '%s' got '%s'\n",
27:                         
$offset$error_info['prepare']['mysql'], $tmp[0]);
28:                     return 
false;
29:                 }
30:
31:                 return 
false;
32:             }
33:
34:             if (!
is_object($stmt))
35:                 return 
false;
36:
37:             if (
is_null($input_params))
38:                 
$input_params = array();
39:
// 5.0.18, 5.1.14 @ 15
40: // printf("[%03d]\n", $offset);
41:             
if ($suppress_warning || (is_array($error_info) && isset($error_info['execute'])))
42:                 
$ret = @$stmt->execute($input_params);
43:             else
44:                 
$ret $stmt->execute($input_params);
45:
46:             if (!
is_bool($ret))
47:                 
printf("[%03d] PDO::execute() should return a boolean value, got %s/%s\n",
48:                     
var_export($rettrue), $ret);
49:
50:             
$tmp $stmt->errorInfo();
51:             if (isset(
$tmp[1]) && ($tmp[1] == 2030)) {
52:                 
// Trying to hack around MySQL Server version dependent features
53:                 // 2030 This command is not supported in the prepared statement protocol yet
54:                 
return false;
55:             }
56:
57:             if (
is_array($error_info) && isset($error_info['execute'])) {
58:
59:                 if (isset(
$error_info['execute']['sqlstate']) &&
60:                     (
$error_info['execute']['sqlstate'] !== $tmp[0])) {
61:                     
printf("[%03d] execute() - expecting SQLSTATE '%s' got '%s'\n",
62:                         
$offset$error_info['execute']['sqlstate'], $tmp[0]);
63:                     return 
false;
64:                 }
65:
66:                 if (isset(
$error_info['execute']['mysql']) &&
67:                     (
$error_info['execute']['mysql'] !== $tmp[1])) {
68:                     
printf("[%03d] execute() - expecting MySQL Code '%s' got '%s'\n",
69:                         
$offset$error_info['execute']['mysql'], $tmp[0]);
70:                     return 
false;
71:                 }
72:
73:                 return 
false;
74:
75:             }
76:
77:         } catch (
PDOException $e) {
78:             
printf("[%03d] %s, [%s} %s\n",
79:                 
$offset$e->getMessage(),
80:                 
$db->errorCode(), implode(' '$db->errorInfo()));
81:             return 
false;
82:         }
83:
84:         return 
$stmt;
85:     }
86:
87:     try {
88:         
$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY0);
89:         if (
!= $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
90:             
printf("[002] Unable to turn off emulated prepared statements\n");
91:
92:         
// TODO - that's PDO - you can prepare empty statements!
93:         
prepex(3$db'',
94:             array(), array(
'prepare' => array('sqlstate' => '42000')));
95:
96:         
// lets be fair and do the most simple SELECT first
97:         
$stmt prepex(4$db'SELECT 1 as "one"');
98:         if (
MySQLPDOTest::isPDOMySQLnd())
99:             
// native types - int
100:             
$expected = array('one' => 1);
101:         else
102:             
// always strings, like STRINGIFY flag
103:             
$expected = array('one' => '1');
104:
105:         
$row $stmt->fetch(PDO::FETCH_ASSOC);
106:         if (
$row !== $expected) {
107:             
printf("[004a] Expecting %s got %s\n"var_export($expectedtrue), var_export($rowtrue));
108:         }
109:
110:         
prepex(5$db'DROP TABLE IF EXISTS test');
111:         
prepex(6$dbsprintf('CREATE TABLE test(id INT, label CHAR(255)) ENGINE=%s'PDO_MYSQL_TEST_ENGINE));
112:         
prepex(7$db"INSERT INTO test(id, label) VALUES(1, ':placeholder')");
113:         
$stmt prepex(8$db'SELECT label FROM test ORDER BY id ASC');
114:         
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
115:
116:         
prepex(9$db'DELETE FROM test');
117:         
prepex(10$db'INSERT INTO test(id, label) VALUES(1, :placeholder)',
118:             array(
':placeholder' => 'first row'));
119:         
prepex(11$db'INSERT INTO test(id, label) VALUES(2, :placeholder)',
120:             array(
':placeholder' => 'second row'));
121:         
$stmt prepex(12$db'SELECT label FROM test ORDER BY id ASC');
122:         
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
123:
124:         
// Is PDO fun?
125:         
$stmt prepex(13$db'SELECT label FROM test WHERE :placeholder > 1',
126:             array(
':placeholder' => 'id'));
127:         
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
128:
129:         for (
$num_params 2$num_params 100$num_params++) {
130:             
$params = array(':placeholder' => 'a');
131:             for (
$i 1$i $num_params$i++) {
132:                 
$params[str_repeat('a'$i)] = 'some data';
133:             }
134:             
prepex(16$db'SELECT id, label FROM test WHERE label > :placeholder',
135:                 
$params, array('execute' => array('sqlstate' => 'HY093')));
136:         }
137:
138:         
$stmt prepex(16$db'SELECT id, label FROM test WHERE :placeholder IS NOT NULL',
139:             array(
':placeholder' => 1));
140:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 2)
141:             
printf("[017] '1' IS NOT NULL evaluates to true, expecting two rows, got %d rows\n"$tmp);
142:
143:         
$stmt prepex(18$db'SELECT id, label FROM test WHERE :placeholder IS NULL',
144:             array(
':placeholder' => 1));
145:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 0)
146:             
printf("[019] '1' IS NOT NULL evaluates to true, expecting zero rows, got %d rows\n"$tmp);
147:
148:         
prepex(20$db'DROP TABLE IF EXISTS test');
149:         
prepex(21$db'CREATE TABLE test(id INT, label CHAR(255)) ENGINE=MyISAM');
150:         
// Not every MySQL Server version supports this
151:         
if (is_object(prepex(22$db'CREATE FULLTEXT INDEX idx1 ON test(label)'nullnulltrue))) {
152:             
prepex(23$db'INSERT INTO test(id, label) VALUES (1, :placeholder)',
153:                 array(
':placeholder' => 'MySQL is the best database in the world!'));
154:             
prepex(24$db'INSERT INTO test(id, label) VALUES (2, :placeholder)',
155:                 array(
':placeholder' => 'If I have the freedom to choose, I would always go again for the MySQL Server'));
156:             
$stmt prepex(25$db'SELECT id, label FROM test WHERE MATCH label AGAINST (:placeholder)',
157:                 array(
':placeholder' => 'mysql'), nulltrue);
158:             if (
is_object($stmt)) {
159:                 
/*
160:                 Lets ignore this
161:                 if (count(($tmp = $stmt->fetchAll(PDO::FETCH_ASSOC))) != 2)
162:                     printf("[033] Expecting two rows, got %d rows\n", $tmp);
163:                 */
164:                 
$stmt prepex(26$db'SELECT id, label FROM test ORDER BY id ASC');
165:                 if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 2)
166:                     
printf("[027] Expecting two rows, got %d rows\n"$tmp);
167:
168:                 if (
$tmp[0]['label'] !== 'MySQL is the best database in the world!') {
169:                     
printf("[028] INSERT seems to have failed, dumping data, check manually\n");
170:                     
var_dump($tmp);
171:                 }
172:             }
173:         }
174:
175:         
$db->exec('DELETE FROM test');
176:         
$db->exec("INSERT INTO test(id, label) VALUES (1, 'row1')");
177:         
$db->exec("INSERT INTO test(id, label) VALUES (2, 'row2')");
178:
179:         
$sql sprintf("SELECT id, label FROM test WHERE (label LIKE %s) AND (id = :placeholder)",
180:             
$db->quote('%ro%'));
181:         
$stmt prepex(29$db$sql,    array('placeholder' => -1));
182:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 0)
183:                 
printf("[030] Expecting zero rows, got %d rows\n"$tmp);
184:
185:         
$sql sprintf("SELECT id, label FROM test WHERE  (id = :placeholder) OR (label LIKE %s)",
186:             
$db->quote('%go%'));
187:         
$stmt prepex(31$db$sql,    array('placeholder' => 1));
188:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 1)
189:                 
printf("[032] Expecting one row, got %d rows\n"$tmp);
190:
191:         
// and now, the same with anonymous placeholders...
192:         
prepex(33$db'DROP TABLE IF EXISTS test');
193:         
prepex(34$dbsprintf('CREATE TABLE test(id INT, label CHAR(255)) ENGINE=%s'PDO_MYSQL_TEST_ENGINE));
194:         
prepex(35$db"INSERT INTO test(id, label) VALUES(1, '?')");
195:         
$stmt prepex(36$db'SELECT label FROM test');
196:         
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
197:
198:         
prepex(37$db'DELETE FROM test');
199:         
prepex(38$db'INSERT INTO test(id, label) VALUES(1, ?)',
200:             array(
'first row'));
201:         
prepex(39$db'INSERT INTO test(id, label) VALUES(2, ?)',
202:             array(
'second row'));
203:         
$stmt prepex(40$db'SELECT label FROM test');
204:         
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
205:
206:         
// Is PDO fun?
207:         
prepex(40$db'SELECT label FROM test WHERE ? > 1',
208:             array(
'id'));
209:         
prepex(41$db'SELECT ? FROM test WHERE id > 1',
210:             array(
'id'));
211:         
prepex(42$db'SELECT ? FROM test WHERE ? > ?',
212:             array(
'id''label''value'));
213:
214:         for (
$num_params 2$num_params 100$num_params++) {
215:             
$params = array('a');
216:             for (
$i 1$i $num_params$i++) {
217:                 
$params[] = 'some data';
218:             }
219:             
prepex(43$db'SELECT id, label FROM test WHERE label > ?',
220:                 
$params, array('execute' => array('sqlstate' => 'HY093')));
221:         }
222:
223:         
prepex(44$db'DELETE FROM test');
224:         
prepex(45$db'INSERT INTO test(id, label) VALUES (1, ?), (2, ?)',
225:             array(
'row''row'));
226:         
$stmt prepex(46$db'SELECT id, label FROM test');
227:         
$tmp $stmt->fetchAll(PDO::FETCH_ASSOC);
228:         
$exp = array(
229:             
=> array(
230:                 
"id"  => "1",
231:                 
"label" => "row"
232:             
),
233:             
=> array(
234:                 
"id" => "2",
235:                 
"label" => "row"
236:             
),
237:         );
238:
239:         if (
MySQLPDOTest::isPDOMySQLnd()) {
240:             
// mysqlnd returns native types
241:             
$exp[0]['id'] = 1;
242:             
$exp[1]['id'] = 2;
243:         }
244:         if (
$tmp !== $exp) {
245:             
printf("[064] Results seem wrong. Please check dumps manually.\n");
246:             
var_dump($exp);
247:             
var_dump($tmp);
248:         }
249:
250:         
$stmt prepex(47$db'SELECT id, label FROM test WHERE ? IS NOT NULL',
251:             array(
1));
252:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 2)
253:             
printf("[048] '1' IS NOT NULL evaluates to true, expecting two rows, got %d rows\n"$tmp);
254:
255:         
$stmt prepex(49$db'SELECT id, label FROM test WHERE ? IS NULL',
256:             array(
1));
257:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 0)
258:             
printf("[050] '1' IS NOT NULL evaluates to true, expecting zero rows, got %d rows\n"$tmp);
259:
260:         
prepex(51$db'DROP TABLE IF EXISTS test');
261:         
prepex(52$db'CREATE TABLE test(id INT, label CHAR(255)) ENGINE=MyISAM');
262:         if (
is_object(prepex(53$db'CREATE FULLTEXT INDEX idx1 ON test(label)'nullnulltrue))) {
263:             
prepex(54$db'INSERT INTO test(id, label) VALUES (1, ?)',
264:                 array(
'MySQL is the best database in the world!'));
265:             
prepex(55$db'INSERT INTO test(id, label) VALUES (1, ?)',
266:                 array(
'If I have the freedom to choose, I would always go again for the MySQL Server'));
267:             
$stmt prepex(56$db'SELECT id, label FROM test WHERE MATCH label AGAINST (?)',
268:                 array(
'mysql'), nulltrue);
269:             
/*
270:             Lets ignore that
271:             if (count(($tmp = $stmt->fetchAll(PDO::FETCH_ASSOC))) != 2)
272:                 printf("[074] Expecting two rows, got %d rows\n", $tmp);
273:             */
274:         
}
275:
276:         
prepex(57$db'DELETE FROM test');
277:         
prepex(58$db'INSERT INTO test(id, label) VALUES (1, ?), (2, ?)',
278:             array(
'row1''row2'));
279:
280:         
/*
281:         TODO enable after fix
282:         $stmt = prepex(37, $db, 'SELECT id, label FROM \'test WHERE MATCH label AGAINST (:placeholder)',
283:             array(':placeholder' => 'row'),
284:             array('execute' => array('sqlstate' => '42000', 'mysql' => 1064)));
285:         */
286:
287:         
$stmt prepex(59$db'SELECT id, label AS "label" FROM test WHERE label = ?',
288:             array(
'row1'));
289:         
$tmp $stmt->fetchAll(PDO::FETCH_ASSOC);
290:         
$exp = array(
291:             
=> array("id" => "1""label" => "row1")
292:         );
293:
294:         if (
MySQLPDOTest::isPDOMySQLnd()) {
295:             
// mysqlnd returns native types
296:             
$exp[0]['id'] = 1;
297:         }
298:         if (
$tmp !== $exp) {
299:             
printf("[065] Results seem wrong. Please check dumps manually.\n");
300:             
var_dump($exp);
301:             
var_dump($tmp);
302:         }
303:
304:         
$sql sprintf("SELECT id, label FROM test WHERE (label LIKE %s) AND (id = ?)",
305:             
$db->quote('%ro%'));
306:         
$stmt prepex(60$db$sql,    array(-1));
307:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 0)
308:                 
printf("[061] Expecting zero rows, got %d rows\n"$tmp);
309:
310:         
$sql sprintf("SELECT id, label FROM test WHERE  (id = ?) OR (label LIKE %s)",
311:             
$db->quote('%ro%'));
312:         
$stmt prepex(61$db$sql,    array(1));
313:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 2)
314:                 
printf("[062] Expecting two rows, got %d rows\n"$tmp);
315:
316:         
$sql "SELECT id, label FROM test WHERE id = ? AND label = (SELECT label AS 'SELECT' FROM test WHERE id = ?)";
317:         
$stmt prepex(63$db$sql,    array(11));
318:         if (
count(($tmp $stmt->fetchAll(PDO::FETCH_ASSOC))) != 1)
319:                 
printf("[064] Expecting one row, got %d rows\n"$tmp);
320:
321:     } catch (
PDOException $e) {
322:         
printf("[001] %s [%s] %s\n",
323:             
$e->getMessage(), $db->errorCode(), implode(' '$db->errorInfo()));
324:     }
325:
326:     print 
"done!";
327:
?>
328:

Expected

array(1) {
  [0]=>
  array(1) {
    ["label"]=>
    string(12) ":placeholder"
  }
}
array(2) {
  [0]=>
  array(1) {
    ["label"]=>
    string(9) "first row"
  }
  [1]=>
  array(1) {
    ["label"]=>
    string(10) "second row"
  }
}
array(0) {
}
array(1) {
  [0]=>
  array(1) {
    ["label"]=>
    string(1) "?"
  }
}
array(2) {
  [0]=>
  array(1) {
    ["label"]=>
    string(9) "first row"
  }
  [1]=>
  array(1) {
    ["label"]=>
    string(10) "second row"
  }
}
done!

Output

array(1) {
  [0]=>
  array(1) {
    ["label"]=>
    string(12) ":placeholder"
  }
}
array(2) {
  [0]=>
  array(1) {
    ["label"]=>
    string(9) "first row"
  }
  [1]=>
  array(1) {
    ["label"]=>
    string(10) "second row"
  }
}
Out of memory

Diff

020+ Out of memory
020- array(0) {
021- }
022- array(1) {
023-   [0]=>
024-   array(1) {
025-     ["label"]=>
026-     string(1) "?"
027-   }
028- }
029- array(2) {
030-   [0]=>
031-   array(1) {
032-     ["label"]=>
033-     string(9) "first row"
034-   }
035-   [1]=>
036-   array(1) {
037-     ["label"]=>
038-     string(10) "second row"
039-   }
040- }
041- done!

 

Generated at Mon, 27 Nov 2017 05:04:32 +0000 (15 days ago)

Copyright © 2005-2017 The PHP Group
All rights reserved.