1--TEST--
2mysqli_stmt_bind_param() - playing with references
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifconnectfailure.inc');
7?>
8--FILE--
9<?php
10    require('table.inc');
11
12    function findRow($offset, $link, $id, $label) {
13
14        $sql = sprintf("SELECT id, label FROM test WHERE id = '%d' AND label = '%s'",
15                $id, $label);
16        if (!$res = mysqli_query($link, $sql)) {
17            printf("[%03d + 1] %s failed, [%d] %s\n",
18                $offset, $sql, mysqli_errno($link), mysqli_error($link));
19            return false;
20        }
21        if (!$row = mysqli_fetch_assoc($res)) {
22            printf("[%03d + 2] fetch for %s failed, [%d] %s\n",
23                $offset, $sql, mysqli_errno($link), mysqli_error($link));
24            return false;
25        }
26
27        mysqli_free_result($res);
28        if ($row['id'] != $id) {
29            printf("[%03d + 3] Expecting %s/%s got %s/%s\n",
30                $offset, gettype($id), $id,
31                gettype($row['id']), $row['id']
32                );
33            return false;
34        }
35
36        if ($row['label'] != $label) {
37            printf("[%03d + 4] Expecting %s/%s got %s/%s\n",
38                $offset, gettype($label), $label,
39                gettype($row['label']), $row['label']
40                );
41            return false;
42        }
43
44        $sql = sprintf("DELETE FROM test WHERE id = '%d' AND label = '%s'",
45                $id, $label);
46        if (!mysqli_query($link, $sql)) {
47            printf("[%03d + 5] %s failed, [%d] %s\n",
48                $offset, $sql, mysqli_errno($link), mysqli_error($link));
49            return false;
50        }
51
52        return true;
53    }
54    // or we will get dups around [28]
55    mysqli_query($link, "ALTER TABLE test DROP PRIMARY KEY");
56
57    $stmt = mysqli_stmt_init($link);
58    if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (?, ?)"))
59        printf("[001] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
60
61    $id = 100;
62    $label = 'v';
63    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
64        printf("[002] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
65
66    if (true !== mysqli_stmt_execute($stmt))
67        printf("[003] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
68    // no need to check the return value, will bail and make EXPECTF fail if need be
69    findRow(4, $link, $id, $label);
70
71    $id++;
72    $label_ref = &$label;
73    $label = 'w';
74    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label_ref)))
75        printf("[005] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
76
77    if (true !== mysqli_stmt_execute($stmt))
78        printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
79    findRow(7, $link, $id, $label_ref);
80
81    $id++;
82    $label_ref_ref = &$label_ref;
83    $label = 'x';
84
85    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label_ref_ref)))
86        printf("[007] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
87
88    if (true !== mysqli_stmt_execute($stmt))
89        printf("[008] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
90    findRow(9, $link, $id, $label_ref_ref);
91
92    $id = 9;
93    $label = $id;
94    $label_num = &$label;
95
96    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label_num)))
97        printf("[010] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
98
99    if (true !== mysqli_stmt_execute($stmt))
100        printf("[011] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
101    findRow(12, $link, $id, $label_num);
102
103    $label_num = &$id;
104    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label_num)))
105        printf("[013] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
106
107    if (true !== mysqli_stmt_execute($stmt))
108        printf("[014] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
109    findRow(15, $link, $id, $label_num);
110
111    $label = 9;
112    $id = &$label;
113
114    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
115        printf("[015] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
116
117    if (true !== mysqli_stmt_execute($stmt))
118        printf("[016] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
119    findRow(17, $link, $id, $label);
120
121    $base = 9;
122    $id = &$base;
123    $label = &$id;
124
125    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
126        printf("[018] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
127
128    if (true !== mysqli_stmt_execute($stmt))
129        printf("[019] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
130    findRow(20, $link, $id, $label);
131
132    $id_ref = &$id;
133    $label_ref = &$label;
134
135    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id_ref, $label_ref)))
136        printf("[021] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
137
138    if (true !== mysqli_stmt_execute($stmt))
139        printf("[022] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
140    findRow(23, $link, $id_ref, $label_ref);
141
142    $id_ref_ref = &$GLOBALS['id_ref'];
143    $label_ref_ref = &$GLOBALS['label_ref_ref'];
144
145    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id_ref_ref, $label_ref_ref)))
146        printf("[024] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
147
148    if (true !== mysqli_stmt_execute($stmt))
149        printf("[025] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
150    findRow(26, $link, $id_ref_ref, $label_ref_ref);
151
152    unset($id);
153    unset($label);
154    $id = 102;
155    $label = new stdClass();
156    $label->label = 'y';
157    $id_ref = &$GLOBALS['id'];
158    $label_ref = &$label->label;
159    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id_ref, $label_ref)))
160        printf("[027] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
161    if (true !== @mysqli_stmt_execute($stmt))
162        printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
163    findRow(29, $link, $id_ref, $label_ref);
164
165    $id = 103;
166    $label_a = &$label_b;
167    $label_b = &$label_a;
168    $label_a = 'z';
169
170    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label_b)))
171        printf("[030] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
172
173    if (true !== mysqli_stmt_execute($stmt))
174        printf("[031] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
175    findRow(32, $link, $id, $label_b);
176
177    class foo {
178        public $foo;
179        function __construct() {
180            $this->foo = &$this->bar;
181        }
182    }
183    class bar extends foo {
184        public $bar = 'v';
185    }
186    $bar = new bar();
187    $id++;
188    $label = &$GLOBALS['bar']->foo;
189
190    if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
191        printf("[033] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
192
193    if (true !== mysqli_stmt_execute($stmt))
194        printf("[034] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
195    findRow(35, $link, $id, $label);
196
197    mysqli_stmt_close($stmt);
198    mysqli_close($link);
199    print "done!";
200?>
201--CLEAN--
202<?php
203    require_once("clean_table.inc");
204?>
205--EXPECT--
206done!
207