mysqli_stmt_bind_param_check_param_no_change.phpt   [plain text]


--TEST--
mysqli_stmt_bind_param() - checking whether the parameters are modified (bug#44390)
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifemb.inc');
require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
	require('table.inc');
	$link->set_charset('latin1');

	class foo {
	  // @var $bar string
	  public $bar;
	}

	$foo = new foo;
	$foo->bar = "фубар";

	echo "Test 1:\n";
	$stmt = $link->prepare("SELECT ? FOO");
	var_dump($foo); // here you can see the bar member var beeing a string
	$stmt->bind_param("s", $foo->bar);
	var_dump($foo); // this will show $foo->bar beeing a reference string
	$stmt->bind_result($one);
	$stmt->execute();
	$stmt->fetch();
	$stmt->free_result();
	echo("$one\n\n");

	// it is getting worse. Binding the same var twice with different
	// types you can get unexpected results (e.g. binary trash for the
	// string and misc data for the integer. See next 2 tests.

	echo "Test 2:\n";
	$stmt = $link->prepare("SELECT ? FOO, ? BAR");
	var_dump($foo);
	$stmt->bind_param("si", $foo->bar, $foo->bar);
	echo "---\n";
	var_dump($foo);
	echo "---\n";
	$stmt->execute();
	var_dump($foo);
	echo "---\n";
	$stmt->bind_result($one, $two);
	$stmt->fetch();
	$stmt->free_result();
	echo("$one - $two\n\n");


	echo "Test 3:\n";
	$stmt = $link->prepare("SELECT ? FOO, ? BAR");
	var_dump($foo);
	$stmt->bind_param("is", $foo->bar, $foo->bar);
	var_dump($foo);
	$stmt->bind_result($one, $two);
	$stmt->execute();
	$stmt->fetch();
	$stmt->free_result();
	echo("$one - $two\n\n");
	echo "done!";
?>
--CLEAN--
<?php
	require_once("clean_table.inc");
?>
--EXPECTF--
Test 1:
object(foo)#%d (1) {
  [%u|b%"bar"]=>
  %unicode|string%(%d) "фубар"
}
object(foo)#%d (1) {
  [%u|b%"bar"]=>
  &%unicode|string%(%d) "фубар"
}
фубар

Test 2:
object(foo)#%d (1) {
  [%u|b%"bar"]=>
  %unicode|string%(%d) "фубар"
}
---
object(foo)#%d (1) {
  [%u|b%"bar"]=>
  &%unicode|string%(%d) "фубар"
}
---
object(foo)#%d (1) {
  [%u|b%"bar"]=>
  &%unicode|string%(%d) "фубар"
}
---
фубар - 0

Test 3:
object(foo)#%d (1) {
  [%u|b%"bar"]=>
  %unicode|string%(%d) "фубар"
}
object(foo)#%d (1) {
  [%u|b%"bar"]=>
  &%unicode|string%(%d) "фубар"
}
0 - фубар

done!