1--TEST--
2mysqli_stmt_affected_rows()
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('skipifconnectfailure.inc');
8?>
9--FILE--
10<?php
11    require_once("connect.inc");
12
13    $tmp    = NULL;
14    $link   = NULL;
15
16    if (!is_null($tmp = @mysqli_stmt_affected_rows()))
17        printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
18
19    if (!is_null($tmp = @mysqli_stmt_affected_rows($link)))
20        printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
21
22    if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
23        printf("Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
24            $host, $user, $db, $port, $socket);
25    }
26    $stmt = mysqli_stmt_init($link);
27
28    if (!mysqli_stmt_prepare($stmt, 'DROP TABLE IF EXISTS test') ||
29        !mysqli_stmt_execute($stmt)) {
30        printf("[003] Failed to drop old test table: [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
31    }
32
33    if (!mysqli_stmt_prepare($stmt, 'CREATE TABLE test(id INT, label CHAR(1), PRIMARY KEY(id)) ENGINE = ' . $engine) ||
34        !mysqli_stmt_execute($stmt)) {
35        printf("[004] Failed to create test table: [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
36    }
37
38    if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
39        printf("[005] Expecting int/0, got %s/'%s'\n", gettype($tmp), $tmp);
40
41    mysqli_stmt_close($stmt);
42    $stmt = mysqli_stmt_init($link);
43
44    if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (1, 'a')") ||
45        !mysqli_stmt_execute($stmt))
46        printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
47
48    mysqli_stmt_close($stmt);
49    $stmt = mysqli_stmt_init($link);
50
51    if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (100, 'z')") ||
52        !mysqli_stmt_execute($stmt))
53        printf("[007] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
54
55    if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
56        printf("[008] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
57
58    mysqli_stmt_close($stmt);
59    $stmt = mysqli_stmt_init($link);
60
61    if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (100, 'z')") ||
62        !mysqli_stmt_execute($stmt))
63        // NOTE: the error message varies with the MySQL Server version, dump only the error code!
64        printf("[009] [%d] (error message varies with the MySQL Server version, check the error code)\n", mysqli_stmt_errno($stmt));
65
66    /* an error occurred: affected rows should return -1 */
67    if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
68        printf("[010] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
69
70    mysqli_stmt_close($stmt);
71    $stmt = mysqli_stmt_init($link);
72
73    if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (1, 'a') ON DUPLICATE KEY UPDATE id = 4") ||
74        !mysqli_stmt_execute($stmt))
75        printf("[011] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
76
77    if (2 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
78        printf("[012] Expecting int/2, got %s/%s\n", gettype($tmp), $tmp);
79
80    mysqli_stmt_close($stmt);
81    $stmt = mysqli_stmt_init($link);
82
83    if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (2, 'b'), (3, 'c')") ||
84        !mysqli_stmt_execute($stmt))
85        printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
86
87    if (2 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
88        printf("[014] Expecting int/2, got %s/%s\n", gettype($tmp), $tmp);
89
90    mysqli_stmt_close($stmt);
91    $stmt = mysqli_stmt_init($link);
92
93    if (!mysqli_stmt_prepare($stmt, "INSERT IGNORE INTO test(id, label) VALUES (1, 'a')") ||
94        !mysqli_stmt_execute($stmt))
95        printf("[015] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
96
97    if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
98        printf("[016] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
99
100    if (!($res = mysqli_query($link, "SELECT count(id) AS num FROM test")) ||
101        !($tmp = mysqli_fetch_assoc($res)))
102        printf("[017] [%d] %s\n", mysqli_error($link), mysqli_error($link));
103    $num = (int)$tmp['num'];
104    mysqli_free_result($res);
105
106    mysqli_stmt_close($stmt);
107    $stmt = mysqli_stmt_init($link);
108
109    if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) SELECT id + 10, label FROM test") ||
110        !mysqli_stmt_execute($stmt))
111        printf("[018] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
112
113    if ($num !== ($tmp = mysqli_stmt_affected_rows($stmt)))
114        printf("[019] Expecting int/%d, got %s/%s\n", $num, gettype($tmp), $tmp);
115
116    mysqli_stmt_close($stmt);
117    $stmt = mysqli_stmt_init($link);
118
119    if (!mysqli_stmt_prepare($stmt, "REPLACE INTO test(id, label) values (4, 'd')") ||
120        !mysqli_stmt_execute($stmt))
121        printf("[020] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
122
123    if (2 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
124        printf("[021] Expecting int/2, got %s/%s\n", gettype($tmp), $tmp);
125
126    mysqli_stmt_close($stmt);
127    $stmt = mysqli_stmt_init($link);
128
129    if (!mysqli_stmt_prepare($stmt, "REPLACE INTO test(id, label) values (5, 'e')") ||
130        !mysqli_stmt_execute($stmt))
131        printf("[022] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
132
133    if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
134        printf("[023] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
135
136    mysqli_stmt_close($stmt);
137    $stmt = mysqli_stmt_init($link);
138
139    if (!mysqli_stmt_prepare($stmt, "UPDATE test SET label = 'a' WHERE id = 2") ||
140        !mysqli_stmt_execute($stmt))
141        printf("[024] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
142
143    if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
144        printf("[025] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
145
146    if (!mysqli_stmt_prepare($stmt, "UPDATE test SET label = 'a' WHERE id = 2") ||
147        !mysqli_stmt_execute($stmt))
148        printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
149
150    if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
151        printf("[027] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
152
153    mysqli_stmt_close($stmt);
154    $stmt = mysqli_stmt_init($link);
155
156    if (!mysqli_stmt_prepare($stmt, "UPDATE test SET label = 'a' WHERE id = 100") ||
157        !mysqli_stmt_execute($stmt))
158        printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
159
160    if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
161        printf("[029] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
162
163    if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE id = 100') ||
164        !mysqli_stmt_execute($stmt))
165        printf("[030] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
166
167    /* use it like num_rows */
168    /* PS are unbuffered, num_rows cannot determine the row count before all rows have been fetched and/or buffered */
169    if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
170        printf("[031] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
171
172    if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
173        printf("[032] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
174
175    if (!mysqli_stmt_store_result($stmt))
176        printf("[033] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
177
178    if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
179        printf("[034] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
180
181    if (1 !== ($tmp = mysqli_stmt_num_rows($stmt)))
182        printf("[035] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
183
184    mysqli_stmt_free_result($stmt);
185    mysqli_stmt_close($stmt);
186    $stmt = mysqli_stmt_init($link);
187
188    if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE 1 = 2') ||
189        !mysqli_stmt_execute($stmt))
190        printf("[036] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
191
192    /* use it like num_rows */
193    if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
194        printf("[037] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
195
196    if (true !== ($tmp = mysqli_stmt_store_result($stmt)))
197        printf("[038] Expecting boolean/true, got %s\%s\n", gettype($tmp), $tmp);
198
199    if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
200        printf("[039] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
201
202    if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
203        printf("[040] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
204
205    /* try to use stmt_affected_rows like stmt_num_rows */
206    /* stmt_affected_rows is not really meant for SELECT! */
207    if (mysqli_stmt_prepare($stmt, 'SELECT unknown_column FROM this_table_does_not_exist') ||
208        mysqli_stmt_execute($stmt))
209        printf("[041] The invalid SELECT statement is issued on purpose\n");
210
211    if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
212        printf("[042] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
213
214    if ($IS_MYSQLND) {
215        if (false !== ($tmp = mysqli_stmt_store_result($stmt)))
216            printf("[043] Expecting boolean/false, got %s\%s\n", gettype($tmp), $tmp);
217    } else {
218        if (true !== ($tmp = mysqli_stmt_store_result($stmt)))
219            printf("[043] Libmysql does not care if the previous statement was bogus, expecting boolean/true, got %s\%s\n", gettype($tmp), $tmp);
220    }
221
222    if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
223        printf("[044] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
224
225    if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
226        printf("[045] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
227
228    mysqli_stmt_close($stmt);
229    $stmt = mysqli_stmt_init($link);
230
231    if (!mysqli_stmt_prepare($stmt, "DROP TABLE IF EXISTS test") ||
232        !mysqli_stmt_execute($stmt))
233        printf("[046] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
234
235    mysqli_stmt_close($stmt);
236
237    if (false !== ($tmp = mysqli_stmt_affected_rows($stmt)))
238        printf("[047] Expecting false, got %s/%s\n", gettype($tmp), $tmp);
239
240    mysqli_close($link);
241
242    print "done!";
243?>
244--CLEAN--
245<?php
246    require_once("clean_table.inc");
247?>
248--EXPECTF--
249[009] [%d] (error message varies with the MySQL Server version, check the error code)
250
251Warning: mysqli_stmt_affected_rows(): Couldn't fetch mysqli_stmt in %s on line %d
252done!
253