1--TEST--
2mysqli_stmt_bind_param() - checking whether the parameters are modified (bug#44390)
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	$link->set_charset('latin1');
13
14	class foo {
15	  // @var $bar string
16	  public $bar;
17	}
18
19	$foo = new foo;
20	$foo->bar = "фубар";
21
22	echo "Test 1:\n";
23	$stmt = $link->prepare("SELECT ? FOO");
24	var_dump($foo); // here you can see the bar member var beeing a string
25	$stmt->bind_param("s", $foo->bar);
26	var_dump($foo); // this will show $foo->bar beeing a reference string
27	$stmt->bind_result($one);
28	$stmt->execute();
29	$stmt->fetch();
30	$stmt->free_result();
31	echo("$one\n\n");
32
33	// it is getting worse. Binding the same var twice with different
34	// types you can get unexpected results (e.g. binary trash for the
35	// string and misc data for the integer. See next 2 tests.
36
37	echo "Test 2:\n";
38	$stmt = $link->prepare("SELECT ? FOO, ? BAR");
39	var_dump($foo);
40	$stmt->bind_param("si", $foo->bar, $foo->bar);
41	echo "---\n";
42	var_dump($foo);
43	echo "---\n";
44	$stmt->execute();
45	var_dump($foo);
46	echo "---\n";
47	$stmt->bind_result($one, $two);
48	$stmt->fetch();
49	$stmt->free_result();
50	echo("$one - $two\n\n");
51
52
53	echo "Test 3:\n";
54	$stmt = $link->prepare("SELECT ? FOO, ? BAR");
55	var_dump($foo);
56	$stmt->bind_param("is", $foo->bar, $foo->bar);
57	var_dump($foo);
58	$stmt->bind_result($one, $two);
59	$stmt->execute();
60	$stmt->fetch();
61	$stmt->free_result();
62	echo("$one - $two\n\n");
63	echo "done!";
64?>
65--CLEAN--
66<?php
67	require_once("clean_table.inc");
68?>
69--EXPECTF--
70Test 1:
71object(foo)#%d (1) {
72  [%u|b%"bar"]=>
73  %unicode|string%(%d) "фубар"
74}
75object(foo)#%d (1) {
76  [%u|b%"bar"]=>
77  &%unicode|string%(%d) "фубар"
78}
79фубар
80
81Test 2:
82object(foo)#%d (1) {
83  [%u|b%"bar"]=>
84  %unicode|string%(%d) "фубар"
85}
86---
87object(foo)#%d (1) {
88  [%u|b%"bar"]=>
89  &%unicode|string%(%d) "фубар"
90}
91---
92object(foo)#%d (1) {
93  [%u|b%"bar"]=>
94  &%unicode|string%(%d) "фубар"
95}
96---
97фубар - 0
98
99Test 3:
100object(foo)#%d (1) {
101  [%u|b%"bar"]=>
102  %unicode|string%(%d) "фубар"
103}
104object(foo)#%d (1) {
105  [%u|b%"bar"]=>
106  &%unicode|string%(%d) "фубар"
107}
1080 - фубар
109
110done!