1--TEST--
2mysqli_stmt_execute() - Stored Procedures
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifconnectfailure.inc');
7require_once('connect.inc');
8if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
9    die(sprintf('skip Cannot connect to MySQL, [%d] %s.', mysqli_connect_errno(), mysqli_connect_error()));
10}
11if (mysqli_get_server_version($link) <= 50000) {
12    die(sprintf('skip Needs MySQL 5.0+, found version %d.', mysqli_get_server_version($link)));
13}
14?>
15--FILE--
16<?php
17    require_once('connect.inc');
18    require_once('table.inc');
19
20    if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
21        printf("[009] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
22
23    if (mysqli_real_query($link, 'CREATE PROCEDURE p(OUT ver_param VARCHAR(25)) BEGIN SELECT VERSION() INTO ver_param; END;')) {
24        /* no result set, one output parameter */
25        if (!$stmt = mysqli_prepare($link, 'CALL p(@version)'))
26            printf("[011] Cannot prepare CALL, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
27
28        if (!mysqli_stmt_execute($stmt))
29            printf("[012] Cannot execute CALL, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
30
31        /* yes, I really want to call it twice! */
32        if (!mysqli_stmt_execute($stmt))
33            printf("[013] Cannot execute CALL, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
34
35        if (!mysqli_stmt_close($stmt))
36            printf("[014] Cannot close statement, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
37
38        if (!$stmt = mysqli_prepare($link, 'SELECT @version AS _version'))
39            printf("[015] Cannot prepare SELECT, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
40
41        if (!mysqli_stmt_execute($stmt))
42            printf("[016] Cannot execute SELECT, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
43
44        $version = 'unknown';
45        if (!mysqli_stmt_bind_result($stmt, $version) ||
46                !mysqli_stmt_fetch($stmt))
47            printf("[017] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
48
49        if (($version == "unknown") || ($version == ""))
50            printf("[018] Results seem wrong, got %s, [%d] %s\n",
51                $version,
52                mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
53
54        mysqli_stmt_free_result($stmt);
55        mysqli_stmt_close($stmt);
56
57    } else {
58        printf("[010] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
59    }
60
61
62    if (function_exists('mysqli_stmt_get_result')) {
63
64        if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
65            printf("[019] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
66
67        if (mysqli_real_query($link, 'CREATE PROCEDURE p(OUT ver_param VARCHAR(25)) BEGIN SELECT VERSION() INTO ver_param; END;')) {
68            // no result set, one output parameter
69            if (!$stmt = mysqli_prepare($link, 'CALL p(@version)'))
70                printf("[020] Cannot prepare CALL, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
71
72            if (!mysqli_stmt_execute($stmt))
73                printf("[021] Cannot execute CALL, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
74
75            if (!mysqli_stmt_close($stmt))
76                printf("[022] Cannot close statement, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
77
78            if (!$stmt = mysqli_prepare($link, 'SELECT @version AS _version'))
79                printf("[023] Cannot prepare SELECT, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
80
81            if (!mysqli_stmt_execute($stmt))
82                printf("[024] Cannot execute SELECT, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
83
84            if (!$res = mysqli_stmt_get_result($stmt))
85                printf("[025] Cannot get result set, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
86
87            if ((!($row = mysqli_fetch_assoc($res))) || ($row['_version'] == ""))
88                printf("[026] Results seem wrong, got %s, [%d] %s\n",
89                    $row['_version'],
90                    mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
91
92            mysqli_free_result($res);
93            mysqli_stmt_close($stmt);
94
95        } else {
96            printf("[027] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
97        }
98
99    }
100
101    if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
102        printf("[028] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
103
104    if (mysqli_real_query($link, 'CREATE PROCEDURE p(IN ver_in VARCHAR(25), OUT ver_out VARCHAR(25)) BEGIN SELECT ver_in INTO ver_out; END;')) {
105        // no result set, one input parameter, output parameter
106        // yes, I really do not want to bind input values...
107        if (!$stmt = mysqli_prepare($link, "CALL p('myversion', @version)"))
108            printf("[029] Cannot prepare CALL, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
109
110        if (!mysqli_stmt_execute($stmt))
111            printf("[030] Cannot execute CALL, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
112
113        if (!mysqli_stmt_close($stmt))
114            printf("[031] Cannot close statement, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
115
116        if (!$stmt = mysqli_prepare($link, 'SELECT @version AS _version'))
117            printf("[032] Cannot prepare SELECT, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
118
119        if (!mysqli_stmt_execute($stmt))
120            printf("[033] Cannot execute SELECT, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
121
122        $version = 'unknown';
123        if (!mysqli_stmt_bind_result($stmt, $version) ||
124                !mysqli_stmt_fetch($stmt))
125            printf("[034] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
126
127        if ($version != "myversion")
128            printf("[035] Results seem wrong, got %s, [%d] %s\n",
129                $version,
130                mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
131
132        mysqli_stmt_free_result($stmt);
133        mysqli_stmt_close($stmt);
134
135    } else {
136        printf("[036] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
137    }
138
139    if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
140        printf("[037] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
141
142    if (mysqli_real_query($link, 'CREATE PROCEDURE p(IN ver_in VARCHAR(25), OUT ver_out VARCHAR(25)) BEGIN SELECT ver_in INTO ver_out; END;')) {
143        // no result set, one input parameter, output parameter
144        // yes, I really do not want to bind input values...
145        if (!$stmt = mysqli_prepare($link, 'CALL p(?, @version)'))
146            printf("[038] Cannot prepare CALL, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
147
148        $version = 'myversion';
149        if (!mysqli_stmt_bind_param($stmt, 's', $version))
150            printf("[039] Cannot bind input parameter, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
151
152        if (!mysqli_stmt_execute($stmt))
153            printf("[040] Cannot execute CALL, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
154
155        if (!mysqli_stmt_close($stmt))
156            printf("[041] Cannot close statement, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
157
158        if (!$stmt = mysqli_prepare($link, 'SELECT @version AS _version'))
159            printf("[042] Cannot prepare SELECT, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
160
161        if (!mysqli_stmt_execute($stmt))
162            printf("[043] Cannot execute SELECT, [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
163
164        $version = 'unknown';
165        if (!mysqli_stmt_bind_result($stmt, $version) ||
166                !mysqli_stmt_fetch($stmt))
167            printf("[044] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
168
169        if ($version !== "myversion")
170            printf("[045] Results seem wrong, got %s, [%d] %s\n",
171                $version,
172                mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
173
174        mysqli_stmt_free_result($stmt);
175        mysqli_stmt_close($stmt);
176
177    } else {
178        printf("[046] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
179    }
180
181    mysqli_close($link);
182    print "done!";
183?>
184--CLEAN--
185<?php
186require_once("connect.inc");
187if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
188   printf("[c001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
189
190if (!mysqli_query($link, "DROP TABLE IF EXISTS test_bind_fetch"))
191    printf("[c002] Cannot drop table, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
192
193@mysqli_query($link, 'DROP PROCEDURE IF EXISTS p');
194
195mysqli_close($link);
196?>
197--EXPECT--
198done!
199