Bug: `getVar()` behaves inconsistently with GET parameters
Maintainer antworten meist innerhalb von 1 Tag
@rahul05ranjan arbeitet bereits daran.
Seit 09.10.2026.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
Rechercherichtung
Beginnen Sie mit dem referenzierten Test in tests/system/HTTP/SiteURIFactoryDetectRoutePathTest.php und den Aktualisierungen der Superglobals in system/HTTP/SiteURIFactory.php. Lesen Sie system/Validation/Validation.php und system/HTTP/IncomingRequest.php, um nachzuverfolgen, wie withRequest() getVar() verwendet. Als erledigt gilt, wenn die $_REQUEST-Assertion des Tests erfolgreich ist und validator->withRequest() korrekt funktioniert, ohne die beabsichtigte PHP-Request-Semantik zu verletzen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
PHP Version
8.4
CodeIgniter4 Version
4.6.4
CodeIgniter4 Installation Method
Composer (using codeigniter4/appstarter)
Which operating systems have you tested for this bug?
macOS
Which server did you use?
cli-server (PHP built-in webserver)
Environment
development
Database
What happened?
In some cases, using $validator->withRequest() will not work correctly. Let's consider this test:
As you may notice in the above test, SiteURIFactory updates some superglobals, here:
The problem is that while $_SERVER['QUERY_STRING'] and $_GET are being updated, the $_REQUEST isn't. And $_REQUEST is needed to make getVar() work correctly.
Steps to Reproduce
public function testQueryStringWithQueryStringAndRequest(): void
{
// /index.php?/ci/woot?code=good#pos
$_SERVER['REQUEST_URI'] = '/index.php?/ci/woot?code=good';
$_SERVER['QUERY_STRING'] = '/ci/woot?code=good';
$_SERVER['SCRIPT_NAME'] = '/index.php';
// these are always the same at the beginning
$_GET['/ci/woot?code'] = 'good';
$_REQUEST['/ci/woot?code'] = 'good';
$factory = $this->createSiteURIFactory($_SERVER);
$expected = 'ci/woot';
$this->assertSame($expected, $factory->detectRoutePath('QUERY_STRING'));
$this->assertSame('code=good', $_SERVER['QUERY_STRING']);
$this->assertSame(['code' => 'good'], $_GET);
// this will fail
$this->assertSame(['code' => 'good'], $_REQUEST);
}
Expected Output
Validation method $validator->withRequest() should work correctly.
The most tempting solution is to add syncRequestAfterGetChange() to Superglobals and call it from SiteURIFactory whenever $_GET is modified. This would keep $_REQUEST synchronized with current values.
The downside is it introduces "magic" behavior that violates standard PHP semantics where $_REQUEST is populated once and never auto-updated. However, since we update $_GET as a "standard", behavior, then updating $_REQUEST may be acceptable?
I was thinking about something like this:
public function syncRequestAfterGetChange(): void
{
$requestOrder = ini_get('request_order') ?: ini_get('variables_order');
$this->request = [];
foreach (str_split($requestOrder) as $type) {
match ($type) {
'G' => $this->request = array_merge($this->request, $this->get),
'P' => $this->request = array_merge($this->request, $this->post),
'C' => $this->request = array_merge($this->request, $this->cookie),
default => null,
};
}
$_REQUEST = $this->request;
}
But I'm unsure if this is the right direction.
Anything else?
- Vorherrschende Sprache
- PHP
- Sterne
- 6k
- Forks
- 2k
- Ø Merge
- 1 T. 22 Std.
- Gemergte PRs (30 T.)
- 59
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus codeigniter4/CodeIgniter4
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
codeigniter4/CodeIgniter4#10616 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
codeigniter4/CodeIgniter4#10618 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 62/100
codeigniter4/CodeIgniter4#10617 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 25/100
codeigniter4/CodeIgniter4#10615 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
codeigniter4/CodeIgniter4#10589 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in codeigniter4/CodeIgniter4
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
TYPO3BestPractices/tea#2409 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
api-platform/core#8690 ·
Maintainer antworten meist innerhalb von 1 Tag
-
No Code Attached Yet
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
joomla/joomla-cms#48626 ·
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement good first issue
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
DorsetDigital/silverstripe-schema-manager#26 ·
Maintainer antworten meist innerhalb von 1 Tag
-
sync-en
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Maintainer antworten meist innerhalb von 4 Tagen