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--EXPECTF--
127done!