]> granicus.if.org Git - php/commitdiff
- Fix Bug #53782 (foreach throws irrelevant exception)
authorJohannes Schlüter <johannes@php.net>
Mon, 16 May 2011 15:37:39 +0000 (15:37 +0000)
committerJohannes Schlüter <johannes@php.net>
Mon, 16 May 2011 15:37:39 +0000 (15:37 +0000)
NEWS
ext/pdo_mysql/mysql_statement.c
ext/pdo_mysql/tests/bug53782.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index b78ee657ea43eea2393031b48a5b209e030d2e8c..491c176986b9c2298e6512909f0bcb336e50154a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -85,6 +85,7 @@ PHP                                                                        NEWS
 
 - PDO MySQL driver:
   . Fixed bug #54644 (wrong pathes in php_pdo_mysql_int.h). (Tony, Johannes)
+  . Fixed bug #53782 (foreach throws irrelevant exception). (Johannes, Andrey)
   . Implemented FR #48587 (MySQL PDO driver doesn't support SSL connections).
     (Rob)
 
index 79694b368a2fb837bb15a66c99c23b68b3ba5373..470cd0898e28ab89496f99b77b10160cdf710aae 100755 (executable)
@@ -656,7 +656,11 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt,
 #endif /* PDO_USE_MYSQLND */
 
        if ((S->current_data = mysql_fetch_row(S->result)) == NULL) {
-               if (mysql_errno(S->H->server)) {
+#if PDO_USE_MYSQLND
+               if (S->result->unbuf && !S->result->unbuf->eof_reached && mysql_errno(S->H->server)) {
+#else
+               if (!S->result->eof && mysql_errno(S->H->server)) {
+#endif
                        pdo_mysql_error_stmt(stmt);
                }
                PDO_DBG_RETURN(0);
diff --git a/ext/pdo_mysql/tests/bug53782.phpt b/ext/pdo_mysql/tests/bug53782.phpt
new file mode 100644 (file)
index 0000000..4f81cce
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+PDO MySQL Bug #53782 (foreach throws irrelevant exception)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+$conn = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$res = $conn->query('SELECT 0');
+
+try {
+    $conn->query('ERROR');
+} catch (PDOException $e) {
+    echo "Caught: ".$e->getMessage()."\n";
+}
+
+foreach ($res as $k => $v) {
+    echo "Value: $v[0]\n";
+}
+
+echo "DONE";
+?>
+--CLEAN--
+<?php
+require dirname(__FILE__) . '/mysql_pdo_test.inc';
+MySQLPDOTest::dropTestTable();
+?>
+--EXPECTF--
+Caught: SQLSTATE[42000]: %s
+Value: 0
+DONE