diff --git a/libraries/classes/Controllers/Database/MultiTableQuery/QueryController.php b/libraries/classes/Controllers/Database/MultiTableQuery/QueryController.php index 238a55d45b..a63f594259 100644 --- a/libraries/classes/Controllers/Database/MultiTableQuery/QueryController.php +++ b/libraries/classes/Controllers/Database/MultiTableQuery/QueryController.php @@ -12,11 +12,9 @@ final class QueryController extends AbstractController { public function __invoke(ServerRequest $request): void { - $params = [ - 'sql_query' => $request->getParsedBodyParam('sql_query'), - 'db' => $request->getParam('db'), - ]; - - $this->response->addHTML(MultiTableQuery::displayResults($params['sql_query'], $params['db'])); + $this->response->addHTML(MultiTableQuery::displayResults( + $request->getParsedBodyParam('sql_query'), + $request->getParam('db') + )); } } diff --git a/libraries/classes/Controllers/Database/MultiTableQuery/TablesController.php b/libraries/classes/Controllers/Database/MultiTableQuery/TablesController.php index 7f6c4366da..98e8289115 100644 --- a/libraries/classes/Controllers/Database/MultiTableQuery/TablesController.php +++ b/libraries/classes/Controllers/Database/MultiTableQuery/TablesController.php @@ -26,13 +26,13 @@ final class TablesController extends AbstractController public function __invoke(ServerRequest $request): void { - $params = [ - 'tables' => $request->getQueryParam('tables', []), - 'db' => $request->getQueryParam('db', ''), - ]; + /** @var string[] $tables */ + $tables = $request->getQueryParam('tables', []); + /** @var string $db */ + $db = $request->getQueryParam('db', ''); $tablesListForQuery = ''; - foreach ($params['tables'] as $table) { + foreach ($tables as $table) { $tablesListForQuery .= "'" . $this->dbi->escapeString($table) . "',"; } @@ -40,7 +40,7 @@ final class TablesController extends AbstractController $constrains = $this->dbi->fetchResult( QueryGenerator::getInformationSchemaForeignKeyConstraintsRequest( - $this->dbi->escapeString($params['db']), + $this->dbi->escapeString($db), $tablesListForQuery ) ); diff --git a/libraries/classes/Controllers/Database/SqlFormatController.php b/libraries/classes/Controllers/Database/SqlFormatController.php index 1fd48e01c9..1aadaf6cda 100644 --- a/libraries/classes/Controllers/Database/SqlFormatController.php +++ b/libraries/classes/Controllers/Database/SqlFormatController.php @@ -8,8 +8,6 @@ use PhpMyAdmin\Controllers\AbstractController; use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\SqlParser\Utils\Formatter; -use function strlen; - /** * Format SQL for SQL editors. */ @@ -17,8 +15,8 @@ class SqlFormatController extends AbstractController { public function __invoke(ServerRequest $request): void { - $params = ['sql' => $request->getParsedBodyParam('sql')]; - $query = strlen((string) $params['sql']) > 0 ? $params['sql'] : ''; + /** @var string $query */ + $query = $request->getParsedBodyParam('sql', ''); $this->response->addJSON(['sql' => Formatter::format($query)]); } } diff --git a/libraries/classes/Controllers/LintController.php b/libraries/classes/Controllers/LintController.php index 72cf1bb647..65cc34f5d3 100644 --- a/libraries/classes/Controllers/LintController.php +++ b/libraries/classes/Controllers/LintController.php @@ -12,6 +12,7 @@ use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\Linter; use function header; +use function is_array; use function json_encode; use function sprintf; @@ -22,11 +23,6 @@ class LintController extends AbstractController { public function __invoke(ServerRequest $request): void { - $params = [ - 'sql_query' => $request->getParsedBodyParam('sql_query'), - 'options' => $request->getParsedBodyParam('options'), - ]; - /** * The SQL query to be analyzed. * @@ -38,7 +34,7 @@ class LintController extends AbstractController * * @var string */ - $sqlQuery = ! empty($params['sql_query']) ? $params['sql_query'] : ''; + $sqlQuery = $request->getParsedBodyParam('sql_query', ''); $this->response->setAjax(true); @@ -49,9 +45,8 @@ class LintController extends AbstractController header(sprintf('%s: %s', $name, $value)); } - if (! empty($params['options'])) { - $options = $params['options']; - + $options = $request->getParsedBodyParam('options'); + if (is_array($options)) { if (! empty($options['routineEditor'])) { $sqlQuery = 'CREATE PROCEDURE `a`() ' . $sqlQuery; } elseif (! empty($options['triggerEditor'])) { diff --git a/libraries/classes/Controllers/Server/Databases/CreateController.php b/libraries/classes/Controllers/Server/Databases/CreateController.php index 747ce63b8a..aac182ed57 100644 --- a/libraries/classes/Controllers/Server/Databases/CreateController.php +++ b/libraries/classes/Controllers/Server/Databases/CreateController.php @@ -18,7 +18,7 @@ use PhpMyAdmin\Util; use function __; use function array_key_exists; use function explode; -use function mb_strlen; +use function is_string; use function mb_strtolower; use function str_contains; @@ -35,12 +35,10 @@ final class CreateController extends AbstractController public function __invoke(ServerRequest $request): void { - $params = [ - 'new_db' => $_POST['new_db'] ?? null, - 'db_collation' => $_POST['db_collation'] ?? null, - ]; + $newDb = $request->getParsedBodyParam('new_db'); + $dbCollation = $request->getParsedBodyParam('db_collation'); - if (! isset($params['new_db']) || mb_strlen($params['new_db']) === 0 || ! $this->response->isAjax()) { + if (! is_string($newDb) || $newDb === '' || ! $this->response->isAjax()) { $this->response->addJSON(['message' => Message::error()]); return; @@ -48,23 +46,23 @@ final class CreateController extends AbstractController // lower_case_table_names=1 `DB` becomes `db` if ($this->dbi->getLowerCaseNames() === '1') { - $params['new_db'] = mb_strtolower($params['new_db']); + $newDb = mb_strtolower($newDb); } /** * Builds and executes the db creation sql query */ - $sqlQuery = 'CREATE DATABASE ' . Util::backquote($params['new_db']); - if (! empty($params['db_collation'])) { - [$databaseCharset] = explode('_', $params['db_collation']); + $sqlQuery = 'CREATE DATABASE ' . Util::backquote($newDb); + if (is_string($dbCollation) && $dbCollation !== '') { + [$databaseCharset] = explode('_', $dbCollation); $charsets = Charsets::getCharsets($this->dbi, $GLOBALS['cfg']['Server']['DisableIS']); $collations = Charsets::getCollations($this->dbi, $GLOBALS['cfg']['Server']['DisableIS']); if ( array_key_exists($databaseCharset, $charsets) - && array_key_exists($params['db_collation'], $collations[$databaseCharset]) + && array_key_exists($dbCollation, $collations[$databaseCharset]) ) { $sqlQuery .= ' DEFAULT' - . Util::getCharsetQueryPart($params['db_collation']); + . Util::getCharsetQueryPart($dbCollation); } } @@ -81,10 +79,10 @@ final class CreateController extends AbstractController $this->response->setRequestStatus(false); } else { - $GLOBALS['db'] = $params['new_db']; + $GLOBALS['db'] = $newDb; $message = Message::success(__('Database %1$s has been created.')); - $message->addParam($params['new_db']); + $message->addParam($newDb); $scriptName = Util::getScriptNameForOption($GLOBALS['cfg']['DefaultTabDatabase'], 'database'); @@ -92,7 +90,7 @@ final class CreateController extends AbstractController 'message' => $message, 'sql_query' => Generator::getMessage('', $sqlQuery, 'success'), 'url' => $scriptName . Url::getCommon( - ['db' => $params['new_db']], + ['db' => $newDb], ! str_contains($scriptName, '?') ? '?' : '&' ), ]; diff --git a/libraries/classes/Controllers/Server/VariablesController.php b/libraries/classes/Controllers/Server/VariablesController.php index 6ab0afc5e5..049b19fbad 100644 --- a/libraries/classes/Controllers/Server/VariablesController.php +++ b/libraries/classes/Controllers/Server/VariablesController.php @@ -37,16 +37,13 @@ class VariablesController extends AbstractController public function __invoke(ServerRequest $request): void { - $GLOBALS['errorUrl'] = $GLOBALS['errorUrl'] ?? null; - - $params = ['filter' => $_GET['filter'] ?? null]; $GLOBALS['errorUrl'] = Url::getFromRoute('/'); if ($this->dbi->isSuperUser()) { $this->dbi->selectDb('mysql'); } - $filterValue = ! empty($params['filter']) ? $params['filter'] : ''; + $filterValue = $request->getQueryParam('filter', ''); $this->addScriptFiles(['server/variables.js']); diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index a6e6dfd141..51a723a928 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1045,16 +1045,6 @@ parameters: count: 1 path: libraries/classes/Controllers/Database/MultiTableQuery/QueryController.php - - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" - count: 1 - path: libraries/classes/Controllers/Database/MultiTableQuery/TablesController.php - - - - message: "#^Parameter \\#1 \\$str of method PhpMyAdmin\\\\DatabaseInterface\\:\\:escapeString\\(\\) expects string, mixed given\\.$#" - count: 2 - path: libraries/classes/Controllers/Database/MultiTableQuery/TablesController.php - - message: "#^Parameter \\#1 \\$collation of static method PhpMyAdmin\\\\Util\\:\\:getCharsetQueryPart\\(\\) expects string, mixed given\\.$#" count: 2 @@ -1090,16 +1080,6 @@ parameters: count: 1 path: libraries/classes/Controllers/Database/SqlController.php - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: libraries/classes/Controllers/Database/SqlFormatController.php - - - - message: "#^Parameter \\#1 \\$query of static method PhpMyAdmin\\\\SqlParser\\\\Utils\\\\Formatter\\:\\:format\\(\\) expects string, mixed given\\.$#" - count: 1 - path: libraries/classes/Controllers/Database/SqlFormatController.php - - message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#" count: 1 @@ -1365,21 +1345,6 @@ parameters: count: 1 path: libraries/classes/Controllers/HomeController.php - - - message: "#^Cannot access offset 'eventEditor' on mixed\\.$#" - count: 1 - path: libraries/classes/Controllers/LintController.php - - - - message: "#^Cannot access offset 'routineEditor' on mixed\\.$#" - count: 1 - path: libraries/classes/Controllers/LintController.php - - - - message: "#^Cannot access offset 'triggerEditor' on mixed\\.$#" - count: 1 - path: libraries/classes/Controllers/LintController.php - - message: "#^Parameter \\#1 \\$partialDependencies of method PhpMyAdmin\\\\Normalization\\:\\:createNewTablesFor2NF\\(\\) expects array, mixed given\\.$#" count: 1 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 8e98dca026..9782477f5d 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -1219,19 +1219,10 @@ - $params['db'] - $params['sql_query'] + $request->getParam('db') + $request->getParsedBodyParam('sql_query') - - - $params['db'] - $table - - - $table - - $dbCollation @@ -1387,14 +1378,6 @@ $delimiter - - - $query - - - $query - - $params['selected'][] @@ -2571,23 +2554,9 @@ - - ['db' => $params['new_db']] - - - $params['db_collation'] - $params['db_collation'] - $params['db_collation'] - $params['new_db'] - $params['new_db'] - $params['new_db'] - - - $params['db_collation'] - $params['db_collation'] - $params['new_db'] - $params['new_db'] - + + $dbCollation + @@ -3042,7 +3011,7 @@ $serverVarsSession[$name] - $GLOBALS['errorUrl'] + $filterValue $value diff --git a/test/classes/Controllers/LintControllerTest.php b/test/classes/Controllers/LintControllerTest.php index b85d27f031..033d0255f4 100644 --- a/test/classes/Controllers/LintControllerTest.php +++ b/test/classes/Controllers/LintControllerTest.php @@ -26,7 +26,13 @@ class LintControllerTest extends AbstractTestCase public function testWithoutParams(): void { - $this->getLintController()($this->createStub(ServerRequest::class)); + $request = $this->createStub(ServerRequest::class); + $request->method('getParsedBodyParam')->willReturnMap([ + ['sql_query', '', ''], + ['options', null, null], + ]); + + $this->getLintController()($request); $output = $this->getActualOutputForAssertion(); $this->assertJson($output); @@ -37,7 +43,7 @@ class LintControllerTest extends AbstractTestCase { $request = $this->createStub(ServerRequest::class); $request->method('getParsedBodyParam')->willReturnMap([ - ['sql_query', null, 'SELECT * FROM `actor` WHERE `actor_id` = 1;'], + ['sql_query', '', 'SELECT * FROM `actor` WHERE `actor_id` = 1;'], ['options', null, null], ]); @@ -88,7 +94,7 @@ class LintControllerTest extends AbstractTestCase $request = $this->createStub(ServerRequest::class); $request->method('getParsedBodyParam')->willReturnMap([ - ['sql_query', null, 'SELECT * FROM `actor` WHEREE `actor_id` = 1;'], + ['sql_query', '', 'SELECT * FROM `actor` WHEREE `actor_id` = 1;'], ['options', null, null], ]); diff --git a/test/classes/Controllers/Server/Databases/CreateControllerTest.php b/test/classes/Controllers/Server/Databases/CreateControllerTest.php index 98ab64d053..7a35196087 100644 --- a/test/classes/Controllers/Server/Databases/CreateControllerTest.php +++ b/test/classes/Controllers/Server/Databases/CreateControllerTest.php @@ -49,9 +49,13 @@ final class CreateControllerTest extends AbstractTestCase $template = new Template(); $controller = new CreateController($response, $template, $this->dbi); - $_POST['new_db'] = 'test_db_error'; + $request = $this->createStub(ServerRequest::class); + $request->method('getParsedBodyParam')->willReturnMap([ + ['new_db', null, 'test_db_error'], + ['db_collation', null, null], + ]); - $controller($this->createStub(ServerRequest::class)); + $controller($request); $actual = $response->getJSONResult(); $this->assertArrayHasKey('message', $actual); @@ -62,10 +66,13 @@ final class CreateControllerTest extends AbstractTestCase $controller = new CreateController($response, $template, $this->dbi); - $_POST['new_db'] = 'test_db'; - $_POST['db_collation'] = 'utf8_general_ci'; + $request = $this->createStub(ServerRequest::class); + $request->method('getParsedBodyParam')->willReturnMap([ + ['new_db', null, 'test_db'], + ['db_collation', null, 'utf8_general_ci'], + ]); - $controller($this->createStub(ServerRequest::class)); + $controller($request); $actual = $response->getJSONResult(); $this->assertArrayHasKey('message', $actual);