Commit:    d4afbd487abbe9e5f3e4fc6c44974639e123406a
Author:    andrey <and...@php.net>         Wed, 16 May 2012 14:28:55 +0200
Parents:   93c91c733cf2259263e4d8c0f3ccc254246d404d
Branches:  PHP-5.3 PHP-5.4 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=d4afbd487abbe9e5f3e4fc6c44974639e123406a

Log:
Fix for bug#62046

Bug#62046 mysqli@mysqlnd can't iterate over stored sets after call to
mysqli_stmt_reset().

Stmt's state was changed to STMT_PREPARED and leads the driver to think
that the stmt was just prepared. Because result set exist also for only
prepared but not executed sets, the check for stmt->result isn't any good.
There is a result set, because as response for COM_PREPARE the server sends
metadata and metadata is part of a result set. After COM_EXECUTE the server
sends metadata again, which could be different and in this case more correct.

Bugs:
https://bugs.php.net/62046

Changed paths:
  A  ext/mysqli/tests/bug62046.phpt
  M  ext/mysqlnd/mysqlnd_ps.c


Diff:
diff --git a/ext/mysqli/tests/bug62046.phpt b/ext/mysqli/tests/bug62046.phpt
new file mode 100644
index 0000000..31a7328
--- /dev/null
+++ b/ext/mysqli/tests/bug62046.phpt
@@ -0,0 +1,40 @@
+--TEST--
+Bug #62046     mysqli@mysqlnd can't iterate over stored sets after call to 
mysqli_stmt_reset()
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifconnectfailure.inc');
+?>
+--FILE--
+<?php
+       require_once("connect.inc");
+
+       if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, 
$socket)) {
+               printf("[001] Connect failed, [%d] %s\n", 
mysqli_connect_errno(), mysqli_connect_error());
+       }
+       if (FALSE === ($stmt = $link->prepare('SELECT 42'))) {
+               printf("[002] Prepare failed, [%d] %s\n", mysqli_errno($link), 
mysqli_error($link));
+       }
+       if (FALSE === $stmt->execute()) {
+               printf("[003] Execute failed, [%d] %s\n", $stmt->errorno, 
$stmt->error);        
+       }
+       if (FALSE === $stmt->store_result()) {
+               printf("[004] store_result failed, [%d] %s\n", $stmt->errorno, 
$stmt->error);   
+       }
+       $one = NULL;
+       if (FALSE === $stmt->bind_result($one)) {
+               printf("[005] bind_result failed, [%d] %s\n", $stmt->errorno, 
$stmt->error);    
+       }
+       if (FALSE === $stmt->reset()) {
+               printf("[006] bind_result failed, [%d] %s\n", $stmt->errorno, 
$stmt->error);
+       }
+       while ($stmt->fetch()) {
+               var_dump($one);
+       }
+       $stmt->close();
+       $link->close();
+       echo "done!";
+?>
+--EXPECT--
+int(42)
+done!
\ No newline at end of file
diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c
index 2044390..d762689 100644
--- a/ext/mysqlnd/mysqlnd_ps.c
+++ b/ext/mysqlnd/mysqlnd_ps.c
@@ -1265,8 +1265,6 @@ MYSQLND_METHOD(mysqlnd_stmt, reset)(MYSQLND_STMT * const 
s TSRMLS_DC)
                        stmt->error_info = conn->error_info;
                }
                stmt->upsert_status = conn->upsert_status;
-
-               stmt->state = MYSQLND_STMT_PREPARED;
        }
        DBG_INF(ret == PASS? "PASS":"FAIL");
        DBG_RETURN(ret);


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to