andrey Thu Mar 20 15:34:09 2008 UTC
Modified files:
/php-src/ext/mysqli mysqli_api.c
/php-src/ext/mysqli/tests
mysqli_stmt_bind_param_check_param_no_change.phpt
/php-src/ext/mysqlnd mysqlnd_ps_codec.c
Log:
Small fix and a test case to prove it
http://cvs.php.net/viewvc.cgi/php-src/ext/mysqli/mysqli_api.c?r1=1.162&r2=1.163&diff_format=u
Index: php-src/ext/mysqli/mysqli_api.c
diff -u php-src/ext/mysqli/mysqli_api.c:1.162
php-src/ext/mysqli/mysqli_api.c:1.163
--- php-src/ext/mysqli/mysqli_api.c:1.162 Thu Mar 20 13:58:46 2008
+++ php-src/ext/mysqli/mysqli_api.c Thu Mar 20 15:34:09 2008
@@ -17,7 +17,7 @@
| Ulf Wendel <[EMAIL PROTECTED]>
|
+----------------------------------------------------------------------+
- $Id: mysqli_api.c,v 1.162 2008/03/20 13:58:46 andrey Exp $
+ $Id: mysqli_api.c,v 1.163 2008/03/20 15:34:09 andrey Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -749,8 +749,10 @@
switch (stmt->stmt->params[i].buffer_type) {
case MYSQL_TYPE_VAR_STRING:
if (UG(unicode) &&
Z_TYPE_P(the_var) == IS_UNICODE) {
-
php_mysqli_stmt_copy_it(&copies, stmt->param.vars[i], stmt->param.var_cnt, i);
- the_var = copies[i];
+ if (the_var ==
stmt->param.vars[i]) {
+
php_mysqli_stmt_copy_it(&copies, stmt->param.vars[i], stmt->param.var_cnt, i);
+ the_var =
copies[i];
+ }
zval_unicode_to_string_ex(the_var, UG(utf8_conv) TSRMLS_CC);
} else {
if (the_var ==
stmt->param.vars[i] && Z_TYPE_P(stmt->param.vars[i]) != IS_STRING) {
http://cvs.php.net/viewvc.cgi/php-src/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt?r1=1.1&r2=1.2&diff_format=u
Index:
php-src/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt
diff -u /dev/null
php-src/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt:1.2
--- /dev/null Thu Mar 20 15:34:09 2008
+++ php-src/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt
Thu Mar 20 15:34:09 2008
@@ -0,0 +1,148 @@
+--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
+ include "connect.inc";
+ require('table.inc');
+
+ 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!\n";
+?>
+--EXPECTF--
+Test 1:
+object(foo)#3 (1) {
+ ["bar"]=>
+ string(10) "ÑÑбаÑ"
+}
+object(foo)#3 (1) {
+ ["bar"]=>
+ &string(10) "ÑÑбаÑ"
+}
+ÑÑбаÑ
+
+Test 2:
+object(foo)#3 (1) {
+ ["bar"]=>
+ string(10) "ÑÑбаÑ"
+}
+---
+object(foo)#3 (1) {
+ ["bar"]=>
+ &string(10) "ÑÑбаÑ"
+}
+---
+object(foo)#3 (1) {
+ ["bar"]=>
+ &string(10) "ÑÑбаÑ"
+}
+---
+ÑÑÐ±Ð°Ñ - 0
+
+Test 3:
+object(foo)#3 (1) {
+ ["bar"]=>
+ string(10) "ÑÑбаÑ"
+}
+object(foo)#3 (1) {
+ ["bar"]=>
+ &string(10) "ÑÑбаÑ"
+}
+0 - ÑÑбаÑ
+
+done!
+--UEXPECTF--
+Test 1:
+object(foo)#3 (1) {
+ [u"bar"]=>
+ unicode(5) "ÑÑбаÑ"
+}
+object(foo)#3 (1) {
+ [u"bar"]=>
+ &unicode(5) "ÑÑбаÑ"
+}
+ÑÑбаÑ
+
+Test 2:
+object(foo)#3 (1) {
+ [u"bar"]=>
+ unicode(5) "ÑÑбаÑ"
+}
+---
+object(foo)#3 (1) {
+ [u"bar"]=>
+ &unicode(5) "ÑÑбаÑ"
+}
+---
+object(foo)#3 (1) {
+ [u"bar"]=>
+ &unicode(5) "ÑÑбаÑ"
+}
+---
+ÑÑÐ±Ð°Ñ - 0
+
+Test 3:
+object(foo)#3 (1) {
+ [u"bar"]=>
+ unicode(5) "ÑÑбаÑ"
+}
+object(foo)#3 (1) {
+ [u"bar"]=>
+ &unicode(5) "ÑÑбаÑ"
+}
+0 - ÑÑбаÑ
+
+done!
http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_ps_codec.c?r1=1.7&r2=1.8&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_ps_codec.c
diff -u php-src/ext/mysqlnd/mysqlnd_ps_codec.c:1.7
php-src/ext/mysqlnd/mysqlnd_ps_codec.c:1.8
--- php-src/ext/mysqlnd/mysqlnd_ps_codec.c:1.7 Thu Mar 20 13:25:49 2008
+++ php-src/ext/mysqlnd/mysqlnd_ps_codec.c Thu Mar 20 15:34:09 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mysqlnd_ps_codec.c,v 1.7 2008/03/20 13:25:49 andrey Exp $ */
+/* $Id: mysqlnd_ps_codec.c,v 1.8 2008/03/20 15:34:09 andrey Exp $ */
#include "php.h"
#include "mysqlnd.h"
#include "mysqlnd_wireprotocol.h"
@@ -828,14 +828,7 @@
*p =
php_mysqlnd_net_store_length(*p, 0);
}
break;
- case MYSQL_TYPE_VAR_STRING:
- /*
- If the user uses refs, it could be
that the type has
- has changed and we need to convert,
again. Which is noop,
- if the type hasn't changed.
- */
-
convert_to_string_ex(&stmt->param_bind[i].zv);
- {
+ case MYSQL_TYPE_VAR_STRING:{
unsigned int len =
Z_STRLEN_P(data);
/* to is after p. The latter
hasn't been moved */
*p =
php_mysqlnd_net_store_length(*p, len);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php