Edit report at https://bugs.php.net/bug.php?id=44454&edit=1

 ID:               44454
 Updated by:       php-bugs@lists.php.net
 Reported by:      mfisc...@php.net
 Summary:          Unexpected exception thrown in foreach() statement
-Status:           Feedback
+Status:           No Feedback
 Type:             Bug
 Package:          PDO related
 Operating System: *
 PHP Version:      5.*, 6CVS (2009-04-25)

 New Comment:

No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Open". Thank you.


Previous Comments:
------------------------------------------------------------------------
[2011-01-04 17:22:20] rgagnon24 at gmail dot com

Problem still exists in PHP 5.3 snapshot 201101041530

Patch uploaded to account for the changes in mysql_statement.c since the last 
time I patched PHP 5.2

------------------------------------------------------------------------
[2011-01-04 13:37:07] u...@php.net

Not a MySQL specific issue thus it should not be assigned to mysql, see my 
earlier comment:

[2008-07-03 14:37 UTC] u...@php.net
No comment on the cause just some observations. Issue exists with SQLite as 
well. 
[...]

------------------------------------------------------------------------
[2010-08-18 12:51:53] johan...@php.net

Please try a 5.3 snapshot.

------------------------------------------------------------------------
[2010-06-03 20:58:10] rgagnon24 at gmail dot com

I've attached a patch "fix-mysql_statement.c-5.2.13.patch" to resolve this 
problem.

From: http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html

   "When used after mysql_store_result(), mysql_fetch_row() returns NULL when 
there are no more rows to retrieve. When used after mysql_use_result(), 
mysql_fetch_row() returns NULL when there are no more rows to retrieve or if an 
error occurred"

The patch simply does not raise an exception during a NULL result from 
mysql_fetch_row() since it only indicates the exhaustion of data.

The condition added simply matches the use of either mysql_use_result() or 
mysql_store_result() called in pdo_mysql_stmt_execute().  When not buffered, 
mysql_use_result() is called.  Therefore, the same check is performed after the 
fetch before deciding to raise an exception.

Also, when un-buffered queries are used, the test script above would be invalid 
as you cannot perform another operation on a result-set when not all of the 
results have been retrieved.

The patch was created against the released PHP 5.2.3 source code tarball.  It's 
so small, you should be able to modify it easily for any version of the 
mysql_statement.c file.

------------------------------------------------------------------------
[2010-06-03 20:36:48] rgagnon24 at gmail dot com

From: http://dev.mysql.com/doc/refman/5.0/en/mysql-errno.html

   "Note that some functions like mysql_fetch_row() don't set mysql_errno() if 
they succeed."

And: http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html

   "Note that error is not reset between calls to mysql_fetch_row()"
-----------------------------------------------------------------------------
Since all the SELECT'd rows are fetched ok, the error from the botched insert 
is still hanging around for mysql_errno() to find, and raise the exact same 
exception after the data is finished being iterated.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=44454


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=44454&edit=1

Reply via email to