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