diff --git a/system/HTTP/RequestTrait.php b/system/HTTP/RequestTrait.php index 43a4f23a0e87..51de3ea5c0fc 100644 --- a/system/HTTP/RequestTrait.php +++ b/system/HTTP/RequestTrait.php @@ -249,7 +249,7 @@ public function setGlobal(string $name, $value) * * @param string $name Supergrlobal name (lowercase) * @phpstan-param 'get'|'post'|'request'|'cookie'|'server' $name - * @param array|string|null $index + * @param array|int|string|null $index * @param int|null $filter Filter constant * @param array|int|null $flags Options * @@ -290,7 +290,7 @@ public function fetchGlobal(string $name, $index = null, ?int $filter = null, $f } // Does the index contain array notation? - if (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) { + if (is_string($index) && ($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) { $value = $this->globals[$name]; for ($i = 0; $i < $count; $i++) { diff --git a/tests/system/HTTP/RequestTest.php b/tests/system/HTTP/RequestTest.php index e2073268d794..6659c6966861 100644 --- a/tests/system/HTTP/RequestTest.php +++ b/tests/system/HTTP/RequestTest.php @@ -196,6 +196,21 @@ public function testFetchGlobalReturnsArrayValues(): void $this->assertCount(2, $result['ANNOUNCEMENTS']); } + public function testFetchGlobalReturnsWithListValues(): void + { + $post = [ + 0 => ['foo' => 0], + 1 => ['bar' => 1], + 2 => ['baz' => 2], + ]; + + $this->request->setGlobal('post', $post); + $result = $this->request->fetchGlobal('post'); + + $this->assertIsList($result); + $this->assertSame($post, $result); + } + public function testFetchGlobalWithArrayTop(): void { $post = [ diff --git a/tests/system/Test/FeatureTestTraitTest.php b/tests/system/Test/FeatureTestTraitTest.php index 360cee2d437f..47aaea07d1d6 100644 --- a/tests/system/Test/FeatureTestTraitTest.php +++ b/tests/system/Test/FeatureTestTraitTest.php @@ -580,6 +580,26 @@ public function testCallWithJsonRequest(): void $response->assertJSONExact($data); } + public function testCallWithListJsonRequest(): void + { + $this->withRoutes([ + [ + 'POST', + 'home', + '\Tests\Support\Controllers\Popcorn::echoJson', + ], + ]); + $data = [ + ['one' => 1, 'two' => 2], + ['one' => 3, 'two' => 4], + ]; + $response = $this->withBodyFormat('json') + ->call(Method::POST, 'home', $data); + + $response->assertOK(); + $response->assertJSONExact($data); + } + public function testSetupRequestBodyWithParams(): void { $request = $this->setupRequest('post', 'home'); diff --git a/user_guide_src/source/changelogs/v4.5.6.rst b/user_guide_src/source/changelogs/v4.5.6.rst index 2ea1f1ce46b7..8a486ae9de3f 100644 --- a/user_guide_src/source/changelogs/v4.5.6.rst +++ b/user_guide_src/source/changelogs/v4.5.6.rst @@ -29,9 +29,12 @@ Deprecations ********** Bugs Fixed ********** +- **RequestTrait:** Fixed a bug where the ``fetchGlobal()`` method did not allow handling data by numeric key when stored as a list. + - **Session Library:** The session initialization debug message now uses the correct log type "debug" instead of "info". - **Validation:** Fixed the `getValidated()` method that did not return valid data when validation rules used multiple asterisks. + - **Database:** Fixed the case insensitivity option in the ``like()`` method when dealing with accented characters. - **Parser:** Fixed bug that caused equal key names to be replaced by the key name defined first.