1--TEST--
2mysqli_stmt_bind_param() - binding variable twice
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('skipifconnectfailure.inc');
8?>
9--FILE--
10<?php
11    require('table.inc');
12
13    function bind_twice($link, $engine, $sql_type1, $sql_type2, $bind_type1, $bind_type2, $bind_value1, $bind_value2, $offset) {
14
15        if (!mysqli_query($link, "DROP TABLE IF EXISTS test")) {
16            printf("[%03d + 1] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
17            return false;
18        }
19        mysqli_autocommit($link, true);
20
21        $sql = sprintf("CREATE TABLE test(col1 %s, col2 %s) ENGINE=%s", $sql_type1, $sql_type2, $engine);
22        if (!mysqli_query($link, $sql)) {
23            printf("[%03d + 2] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
24            return false;
25        }
26
27        if (!$stmt = mysqli_stmt_init($link)) {
28            printf("[%03d + 3] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
29            return false;
30        }
31
32        if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(col1, col2) VALUES (?, ?)")) {
33            printf("[%03d + 4] [%d] %s\n", $offset, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
34            return false;
35        }
36
37        if (!mysqli_stmt_bind_param($stmt, $bind_type1 . $bind_type2, $bind_value1, $bind_value1)) {
38            printf("[%03d + 5] [%d] %s\n", $offset, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
39            return false;
40        }
41
42        if (!mysqli_stmt_execute($stmt)) {
43            printf("[%03d + 6] [%d] %s\n", $offset, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
44            return false;
45        }
46
47        if (!mysqli_stmt_bind_param($stmt, $bind_type1 . $bind_type2, $bind_value1, $bind_value2)) {
48            printf("[%03d + 7] [%d] %s\n", $offset, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
49            return false;
50        }
51        if (!mysqli_stmt_execute($stmt)) {
52            printf("[%03d + 8] [%d] %s\n", $offset, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
53            return false;
54        }
55
56        mysqli_stmt_close($stmt);
57        if (!$res = mysqli_query($link, "SELECT col1, col2 FROM test")) {
58            printf("[%03d + 9] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
59            return false;
60        }
61
62        if (2 !== ($tmp = mysqli_num_rows($res))) {
63            printf("[%03d + 10] Expecting 2 rows, got %d rows [%d] %s\n", $offset, $tmp, mysqli_errno($link), mysqli_error($link));
64        }
65
66        $row = mysqli_fetch_assoc($res);
67        if (($row['col1'] != $bind_value1) || ($row['col2'] != $bind_value1)) {
68            printf("[%03d + 11] Expecting col1 = %s, col2 = %s got col1 = %s, col2 = %s - [%d] %s\n",
69                $offset, $bind_value1, $bind_value1,
70                $row['col1'], $row['col2'],
71                mysqli_errno($link), mysqli_error($link));
72            return false;
73        }
74
75        $row = mysqli_fetch_assoc($res);
76        if (($row['col1'] != $bind_value1) || ($row['col2'] != $bind_value2)) {
77            printf("[%03d + 12] Expecting col1 = %s, col2 = %s got col1 = %s, col2 = %s - [%d] %s\n",
78                $offset, $bind_value1, $bind_value2,
79                $row['col1'], $row['col2'],
80                mysqli_errno($link), mysqli_error($link));
81            return false;
82        }
83        mysqli_free_result($res);
84        return true;
85    }
86
87    bind_twice($link, $engine, 'CHAR(1)', 'CHAR(1)', 's', 's', 'a', 'b', 10);
88    bind_twice($link, $engine, 'INT', 'INT', 'i', 'i', 1, 2, 20);
89    bind_twice($link, $engine, 'FLOAT', 'FLOAT', 'd', 'd', 1.01, 1.02, 30);
90
91    /* type juggling - note that int->char works */
92    bind_twice($link, $engine, 'CHAR(1)', 'CHAR(1)', 's', 's', 1, 2, 40);
93    /* type juggling - note that string->integer works */
94    bind_twice($link, $engine, 'INT', 'INT', 'i', 'i', '1', '2', 50);
95    /* type juggling - note that string->float works*/
96    bind_twice($link, $engine, 'FLOAT', 'FLOAT', 'd', 'd', '1.01', '1.02', 60);
97
98    /* now, let's have two columns of different type and do type juggling */
99    /*
100    what the test will do is:
101        1) col1 INT, col2 CHAR(1)
102    2) bind_param('is', 1, 1)
103    3) execute()
104        4) bind_param('is', 1, 'a')
105        5) execute()
106
107        col1 INT, col2 INT
108    bind_param('ii', '1', '2')	--> OK  (int column, string value)
109        bind_param('ii', 1, 2) 			--> OK  (int column, int value)
110    col1 CHAR(1), col2 CHAR(2)
111    bind_param('ss', 1, 2)  		--> OK (string column, int value)
112
113        So, what about:
114        col1 INT, COL2 CHAR(1)
115        bind_param('is', 1, 1)     ---> ??
116    */
117    bind_twice($link, $engine, 'INT', 'CHAR(1)', 'i', 's', 1, 'a', 70);
118
119    mysqli_close($link);
120    print "done!";
121?>
122--CLEAN--
123<?php
124    require_once("clean_table.inc");
125?>
126--EXPECT--
127done!
128