From: Ilia Alshanetsky Date: Thu, 11 Oct 2007 20:56:22 +0000 (+0000) Subject: MFB: Fixed bug #42917 (PDO::FETCH_KEY_PAIR doesn't work with setFetchMode) X-Git-Tag: php-5.2.5RC1~16 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=accfde57cae9789fc6ae9d29645aff2e11dc8006;p=php MFB: Fixed bug #42917 (PDO::FETCH_KEY_PAIR doesn't work with setFetchMode) --- diff --git a/NEWS b/NEWS index eae07f36de..d4cd25cd1a 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ PHP NEWS - Fixed htmlentities/htmlspecialchars not to accept partial multibyte sequences. (Stas) +- Fixed bug #42917 (PDO::FETCH_KEY_PAIR doesn't work with setFetchMode). + (Ilia) - Fixed bug #42890 (Constant "LIST" defined by mysqlclient and c-client). (Andrey) - Fixed bug #42869 (automatic session id insertion adds sessions id to diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index ef86c7e1ac..7b94820986 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -1260,7 +1260,7 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, } /* }}} */ -static int pdo_stmt_verify_mode(pdo_stmt_t *stmt, int mode, int fetch_all TSRMLS_DC) /* {{{ */ +static int pdo_stmt_verify_mode(pdo_stmt_t *stmt, long mode, int fetch_all TSRMLS_DC) /* {{{ */ { int flags = mode & PDO_FETCH_FLAGS; @@ -1549,7 +1549,9 @@ static PHP_METHOD(PDOStatement, fetchAll) if (!error) { PDO_STMT_CLEAR_ERR(); MAKE_STD_ZVAL(data); - if ((how & PDO_FETCH_GROUP) || how == PDO_FETCH_KEY_PAIR) { + if ( (how & PDO_FETCH_GROUP) || how == PDO_FETCH_KEY_PAIR || + (how == PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR) + ) { array_init(return_value); return_all = return_value; } else { @@ -1565,7 +1567,7 @@ static PHP_METHOD(PDOStatement, fetchAll) do { MAKE_STD_ZVAL(data); } while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC)); - } else if (how == PDO_FETCH_KEY_PAIR) { + } else if (how == PDO_FETCH_KEY_PAIR || (how == PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR)) { while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC)); } else { array_init(return_value); @@ -1916,6 +1918,7 @@ fail_out: case PDO_FETCH_OBJ: case PDO_FETCH_BOUND: case PDO_FETCH_NAMED: + case PDO_FETCH_KEY_PAIR: break; case PDO_FETCH_COLUMN: diff --git a/ext/pdo/tests/bug_42917.phpt b/ext/pdo/tests/bug_42917.phpt new file mode 100644 index 0000000000..d4b71f57da --- /dev/null +++ b/ext/pdo/tests/bug_42917.phpt @@ -0,0 +1,40 @@ +--TEST-- +PDO Common: Bug #42917 (PDO::FETCH_KEY_PAIR doesn't work with setFetchMode) +--SKIPIF-- + +--FILE-- +exec("CREATE TABLE test (a varchar(100), b varchar(100), c varchar(100))"); + +for ($i = 0; $i < 5; $i++) { + $db->exec("INSERT INTO test (a,b,c) VALUES('test".$i."','".$i."','".$i."')"); +} + +$res = $db->query("SELECT a,b FROM test"); +$res->setFetchMode(PDO::FETCH_KEY_PAIR); +var_dump($res->fetchAll()); + +?> +--EXPECT-- +array(5) { + ["test0"]=> + string(1) "0" + ["test1"]=> + string(1) "1" + ["test2"]=> + string(1) "2" + ["test3"]=> + string(1) "3" + ["test4"]=> + string(1) "4" +}