]> 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)
ext/pdo_mysql/mysql_statement.c
ext/pdo_mysql/tests/bug53782.phpt [new file with mode: 0644]

index 375e49393086e82727c64da33291592ed87115a3..6adba96168a36e64e992a74d3c8a99acf3cfaf98 100755 (executable)
@@ -640,7 +640,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