xref: /PHP-8.0/ext/pdo_mysql/tests/bug_44454.phpt (revision f8d79582)
1--TEST--
2Bug #44454 (Unexpected exception thrown in foreach() statement)
3--SKIPIF--
4<?php
5if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
6require __DIR__ . '/config.inc';
7require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
8PDOTest::skip();
9?>
10--FILE--
11<?php
12require __DIR__ . '/config.inc';
13require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
14$db = PDOTest::test_factory(__DIR__ . '/common.phpt');
15
16function bug_44454($db) {
17
18    try {
19
20        $db->exec('DROP TABLE IF EXISTS test');
21        $db->exec('CREATE TABLE test(a INT, b INT, UNIQUE KEY idx_ab (a, b))');
22        $db->exec('INSERT INTO test(a, b) VALUES (1, 1)');
23
24        $stmt = $db->query('SELECT a, b FROM test');
25        printf("... SELECT has returned %d row...\n", $stmt->rowCount());
26        while ($row = $stmt->fetch()) {
27            try {
28                printf("... INSERT should fail...\n");
29                $db->exec('INSERT INTO test(a, b) VALUES (1, 1)');
30            } catch (Exception $e) {
31                printf("... STMT - %s\n", var_export($stmt->errorCode(), true));
32                printf("... PDO  - %s\n", var_export($db->errorInfo(), true));
33            }
34        }
35
36        $db->exec('DROP TABLE IF EXISTS test');
37        $db->exec('CREATE TABLE test(a INT, b INT, UNIQUE KEY idx_ab (a, b))');
38        $db->exec('INSERT INTO test(a, b) VALUES (1, 1)');
39
40    } catch (Exception $e) {
41        printf("... While error %s\n", $e->getMessage()); ;
42    }
43
44    $stmt = $db->query('SELECT a, b FROM test');
45    printf("... SELECT has returned %d row...\n", $stmt->rowCount());
46    foreach ($stmt as $row) {
47        try {
48            printf("... INSERT should fail...\n");
49            $db->exec('INSERT INTO test(a, b) VALUES (1, 1)');
50        } catch (Exception $e) {
51            printf("... STMT - %s\n", var_export($stmt->errorCode(), true));
52            printf("... PDO  - %s\n", var_export($db->errorInfo(), true));
53        }
54    }
55
56}
57
58$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
59
60print "Native Prepared Statements\n";
61$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
62bug_44454($db);
63
64print "\nEmulated Prepared Statements\n";
65$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
66bug_44454($db);
67
68print "done!";
69?>
70--CLEAN--
71<?php
72require __DIR__ . '/mysql_pdo_test.inc';
73$db = MySQLPDOTest::factory();
74$db->exec('DROP TABLE IF EXISTS test');
75?>
76--EXPECTF--
77Native Prepared Statements
78... SELECT has returned 1 row...
79... INSERT should fail...
80... STMT - '00000'
81... PDO  - array (
82  0 => '23000',
83  1 => 1062,
84  2 => 'Duplicate entry \'1-1\' for key %s',
85)
86... SELECT has returned 1 row...
87... INSERT should fail...
88... STMT - '00000'
89... PDO  - array (
90  0 => '23000',
91  1 => 1062,
92  2 => 'Duplicate entry \'1-1\' for key %s',
93)
94
95Emulated Prepared Statements
96... SELECT has returned 1 row...
97... INSERT should fail...
98... STMT - '00000'
99... PDO  - array (
100  0 => '23000',
101  1 => 1062,
102  2 => 'Duplicate entry \'1-1\' for key %s',
103)
104... SELECT has returned 1 row...
105... INSERT should fail...
106... STMT - '00000'
107... PDO  - array (
108  0 => '23000',
109  1 => 1062,
110  2 => 'Duplicate entry \'1-1\' for key %s',
111)
112done!
113