From 17329f832962d47eb4789eca28dd914fa95256a2 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 13:20:49 +0000 Subject: [PATCH 01/10] Remove dead code Signed-off-by: Kamil Tekiela --- src/Controllers/Import/ImportController.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Controllers/Import/ImportController.php b/src/Controllers/Import/ImportController.php index 5ca0b3b026..8bebcda3ce 100644 --- a/src/Controllers/Import/ImportController.php +++ b/src/Controllers/Import/ImportController.php @@ -7,7 +7,6 @@ namespace PhpMyAdmin\Controllers\Import; use PhpMyAdmin\Bookmarks\Bookmark; use PhpMyAdmin\Bookmarks\BookmarkRepository; use PhpMyAdmin\Config; -use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Controllers\InvocableController; use PhpMyAdmin\Core; use PhpMyAdmin\Current; @@ -704,8 +703,6 @@ final readonly class ImportController implements InvocableController if (Import::$result) { // Save a Bookmark with more than one queries (if Bookmark label given). if (! empty($request->getParsedBodyParam('bkm_label')) && Import::$importText !== '') { - $relation = new Relation($this->dbi); - $this->sql->storeTheQueryAsBookmark( Current::$database, $this->config->selectedServer['user'], From bffbf56dfada2712165e517beecfa27b41b8aa3a Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 13:29:01 +0000 Subject: [PATCH 02/10] Use match instead of in_array() Signed-off-by: Kamil Tekiela --- src/Plugins/Export/ExportExcel.php | 10 ++++------ src/Plugins/Export/ExportSql.php | 27 ++++++++++++--------------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/Plugins/Export/ExportExcel.php b/src/Plugins/Export/ExportExcel.php index 047e62cd66..36390aa99d 100644 --- a/src/Plugins/Export/ExportExcel.php +++ b/src/Plugins/Export/ExportExcel.php @@ -23,7 +23,6 @@ use PhpMyAdmin\Properties\Plugins\ExportPluginProperties; use function __; use function implode; -use function in_array; use function is_string; use function preg_replace; use function str_replace; @@ -261,10 +260,9 @@ class ExportExcel extends ExportPlugin /** @return 'win'|'mac_excel2003'|'mac_excel2008' */ private function setEdition(string $edition): string { - if (in_array($edition, ['mac_excel2003', 'mac_excel2008'], true)) { - return $edition; - } - - return 'win'; + return match ($edition) { + 'mac_excel2003', 'mac_excel2008' => $edition, + default => 'win', + }; } } diff --git a/src/Plugins/Export/ExportSql.php b/src/Plugins/Export/ExportSql.php index 6473a9885e..894da88b84 100644 --- a/src/Plugins/Export/ExportSql.php +++ b/src/Plugins/Export/ExportSql.php @@ -2635,21 +2635,19 @@ class ExportSql extends ExportPlugin /** @return 'NONE'|'ANSI'|'DB2'|'MAXDB'|'MYSQL323'|'MYSQL40'|'MSSQL'|'ORACLE'|'TRADITIONAL' */ private function setCompatibility(string $mode): string { - if (in_array($mode, ['ANSI', 'DB2', 'MAXDB', 'MYSQL323', 'MYSQL40', 'MSSQL', 'ORACLE', 'TRADITIONAL'], true)) { - return $mode; - } - - return 'NONE'; + return match ($mode) { + 'ANSI', 'DB2', 'MAXDB', 'MYSQL323', 'MYSQL40', 'MSSQL', 'ORACLE', 'TRADITIONAL' => $mode, + default => 'NONE', + }; } /** @return 'INSERT'|'UPDATE'|'REPLACE' */ private function setType(string $type): string { - if (in_array($type, ['UPDATE', 'REPLACE'], true)) { - return $type; - } - - return 'INSERT'; + return match ($type) { + 'UPDATE', 'REPLACE' => $type, + default => 'INSERT', + }; } public function setAutoIncrement(bool $autoIncrement): void @@ -2660,11 +2658,10 @@ class ExportSql extends ExportPlugin /** @return 'complete'|'extended'|'both'|'none' */ private function setInsertSyntax(string $syntax): string { - if (in_array($syntax, ['complete', 'extended', 'none'], true)) { - return $syntax; - } - - return 'both'; + return match ($syntax) { + 'complete', 'extended', 'none' => $syntax, + default => 'both', + }; } /** @return int<0, max> */ From 7eceed42a28aad15032872bac6b9a127650953a2 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 13:36:44 +0000 Subject: [PATCH 03/10] Use getParsedBodyParamAsString in SqlQueryGlobalSetting Signed-off-by: Kamil Tekiela --- src/Http/Middleware/SqlQueryGlobalSetting.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Http/Middleware/SqlQueryGlobalSetting.php b/src/Http/Middleware/SqlQueryGlobalSetting.php index eac03ad76c..a71f47fa83 100644 --- a/src/Http/Middleware/SqlQueryGlobalSetting.php +++ b/src/Http/Middleware/SqlQueryGlobalSetting.php @@ -12,7 +12,6 @@ use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use function assert; -use function is_string; final class SqlQueryGlobalSetting implements MiddlewareInterface { @@ -28,11 +27,7 @@ final class SqlQueryGlobalSetting implements MiddlewareInterface { $sqlQuery = ''; if ($request->isPost()) { - /** @var mixed $sqlQuery */ - $sqlQuery = $request->getParsedBodyParam('sql_query'); - if (! is_string($sqlQuery)) { - $sqlQuery = ''; - } + $sqlQuery = $request->getParsedBodyParamAsString('sql_query', ''); } Current::$sqlQuery = $sqlQuery; From 1afc49ab53c88c44845c34b2f842dc70f1ed2a3b Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 14:04:08 +0000 Subject: [PATCH 04/10] Improve type hint Signed-off-by: Kamil Tekiela --- src/Database/Designer.php | 4 ++-- src/Database/Designer/Common.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Database/Designer.php b/src/Database/Designer.php index 7ff2d52b2c..0531dd0075 100644 --- a/src/Database/Designer.php +++ b/src/Database/Designer.php @@ -191,8 +191,8 @@ class Designer } /** - * @param list[] $tableColumnsInfo table column info - * @param array $tablesAllKeys unique or primary indices + * @param array> $tableColumnsInfo table column info + * @param array $tablesAllKeys unique or primary indices * * @return array */ diff --git a/src/Database/Designer/Common.php b/src/Database/Designer/Common.php index 8522892add..905d4a58a4 100644 --- a/src/Database/Designer/Common.php +++ b/src/Database/Designer/Common.php @@ -77,7 +77,7 @@ class Common * * @param DesignerTable[] $designerTables The designer tables * - * @return list[] table column nfo + * @return array> table column nfo */ public function getColumnsInfo(array $designerTables): array { From 168af2d10c6194613f8567b10884f8092aa6ea85 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 14:05:44 +0000 Subject: [PATCH 05/10] Use max instead of ternary Signed-off-by: Kamil Tekiela --- src/Plugins/Export/Helpers/Pdf.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Export/Helpers/Pdf.php b/src/Plugins/Export/Helpers/Pdf.php index 3ae21fc440..c1081106cd 100644 --- a/src/Plugins/Export/Helpers/Pdf.php +++ b/src/Plugins/Export/Helpers/Pdf.php @@ -22,6 +22,7 @@ use function __; use function array_key_exists; use function count; use function ksort; +use function max; /** * Adapted from a LGPL script by Philip Clarke @@ -155,7 +156,7 @@ class Pdf extends PdfLib $this->setXY($l, $this->tMargin); $this->MultiCell($this->tablewidths[$col], $this->FontSizePt, $txt ?? 'NULL'); $l += $this->tablewidths[$col]; - $maxY = $maxY < $this->GetY() ? $this->GetY() : $maxY; + $maxY = max($maxY, $this->GetY()); } $this->setXY($this->lMargin, $this->tMargin); From 33b2418fc8ce9f519704f1b9790b65cafb940ad0 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 14:09:39 +0000 Subject: [PATCH 06/10] Fix removeRecursion() Signed-off-by: Kamil Tekiela --- psalm-baseline.xml | 5 ++--- src/Footer.php | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 841f013df1..8b70c63de1 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -4238,6 +4238,8 @@ + + @@ -4264,9 +4266,6 @@ - - - diff --git a/src/Footer.php b/src/Footer.php index 2834e5d2a9..61746c234c 100644 --- a/src/Footer.php +++ b/src/Footer.php @@ -48,7 +48,7 @@ class Footer * * @return mixed Reference passed object */ - private static function removeRecursion(mixed &$object, array $stack = []): mixed + private static function removeRecursion(mixed $object, array $stack = []): mixed { if ((is_object($object) || is_array($object)) && $object) { if ($object instanceof Traversable) { @@ -57,7 +57,7 @@ class Footer $stack[] = $object; // @phpstan-ignore-next-line foreach ($object as &$subObject) { - self::removeRecursion($subObject, $stack); + $subObject = self::removeRecursion($subObject, $stack); } } else { $object = '***RECURSION***'; @@ -74,8 +74,7 @@ class Footer { $retval = '\'false\''; if ($this->config->config->debug->sql && empty($_REQUEST['no_debug']) && ! empty($_SESSION['debug'])) { - // Remove recursions and iterators from $_SESSION['debug'] - self::removeRecursion($_SESSION['debug']); + $_SESSION['debug'] = self::removeRecursion($_SESSION['debug']); $retval = (string) json_encode($_SESSION['debug']); $_SESSION['debug'] = []; From 2e027c9e86d8d9c318c2e6660e2cf78461e07a29 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 14:13:19 +0000 Subject: [PATCH 07/10] Remove $context param from getContext Signed-off-by: Kamil Tekiela --- src/Command/TwigLintCommand.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Command/TwigLintCommand.php b/src/Command/TwigLintCommand.php index c413f44145..d1bd770dcf 100644 --- a/src/Command/TwigLintCommand.php +++ b/src/Command/TwigLintCommand.php @@ -252,12 +252,12 @@ class TwigLintCommand extends Command } /** @return string[] */ - private function getContext(string $template, int $line, int $context = 3): array + private function getContext(string $template, int $line): array { $lines = explode("\n", $template); - $position = max(0, $line - $context); - $max = min(count($lines), $line - 1 + $context); + $position = max(0, $line - 3); + $max = min(count($lines), $line - 1 + 3); $result = []; while ($position < $max) { From b018274d9eb9ffdb2f7fd053d80815c9cb453d36 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 14:19:22 +0000 Subject: [PATCH 08/10] Make properties local Signed-off-by: Kamil Tekiela --- .../Server/DatabasesController.php | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/Controllers/Server/DatabasesController.php b/src/Controllers/Server/DatabasesController.php index bd8cab81dd..904afe98eb 100644 --- a/src/Controllers/Server/DatabasesController.php +++ b/src/Controllers/Server/DatabasesController.php @@ -37,15 +37,6 @@ final class DatabasesController implements InvocableController /** @var mixed[] array of database details */ private array $databases = []; - /** @var int number of databases */ - private int $databaseCount = 0; - - /** @var string sort by column */ - private string $sortBy = ''; - - /** @var string sort order of databases */ - private string $sortOrder = ''; - /** @var bool whether to show database statistics */ private bool $hasStatistics = false; @@ -77,11 +68,11 @@ final class DatabasesController implements InvocableController $sortBy = $request->getParam('sort_by', ''); Assert::string($sortBy); - $this->sortBy = self::SORT_BY_ALLOWED_LIST[array_search($sortBy, self::SORT_BY_ALLOWED_LIST, true)]; + $sortBy = self::SORT_BY_ALLOWED_LIST[array_search($sortBy, self::SORT_BY_ALLOWED_LIST, true)]; $sortOrder = $request->getParam('sort_order', ''); Assert::string($sortOrder); - $this->sortOrder = strtolower($sortOrder) !== 'desc' ? 'asc' : 'desc'; + $sortOrder = strtolower($sortOrder) !== 'desc' ? 'asc' : 'desc'; $this->response->addScriptFiles(['server/databases.js']); @@ -95,6 +86,8 @@ final class DatabasesController implements InvocableController $primaryInfo = $replicationInfo->getPrimaryInfo(); $replicaInfo = $replicationInfo->getReplicaInfo(); + $databaseCount = 0; + /** * Gets the databases list */ @@ -104,8 +97,8 @@ final class DatabasesController implements InvocableController null, $this->hasStatistics, ConnectionType::User, - $this->sortBy, - $this->sortOrder, + $sortBy, + $sortOrder, $position, true, ); @@ -122,14 +115,14 @@ final class DatabasesController implements InvocableController return $this->response->response(); } - $this->databaseCount = count($this->dbi->getDatabaseList()); + $databaseCount = count($this->dbi->getDatabaseList()); } $urlParams = [ 'statistics' => $this->hasStatistics, 'pos' => $position, - 'sort_by' => $this->sortBy, - 'sort_order' => $this->sortOrder, + 'sort_by' => $sortBy, + 'sort_order' => $sortOrder, ]; $databases = $this->getDatabases($primaryInfo, $replicaInfo); @@ -168,7 +161,7 @@ final class DatabasesController implements InvocableController 'total_statistics' => $databases['total_statistics'], 'header_statistics' => $headerStatistics, 'charsets' => $charsetsList, - 'database_count' => $this->databaseCount, + 'database_count' => $databaseCount, 'pos' => $position, 'url_params' => $urlParams, 'max_db_list' => $this->config->config->MaxDbList, From 4348436bde65ff3f95324089da4329761f08077b Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 14:23:15 +0000 Subject: [PATCH 09/10] break 1 -> break Signed-off-by: Kamil Tekiela --- src/Util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Util.php b/src/Util.php index 948ad77b7e..f82318a2f1 100644 --- a/src/Util.php +++ b/src/Util.php @@ -332,7 +332,7 @@ class Util // use 1024.0 to avoid integer overflow on 64-bit machines $value = round($value / (1024 ** $d / $dh)) / $dh; $unit = $byteUnits[$d]; - break 1; + break; } } From a81c8d2c575ec40c2e3cb6a6ddf16b8023a1bb2e Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 8 Mar 2026 14:26:33 +0000 Subject: [PATCH 10/10] Use hasBodyParam for checkbox Signed-off-by: Kamil Tekiela --- src/Controllers/Export/ExportController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controllers/Export/ExportController.php b/src/Controllers/Export/ExportController.php index 6aef528183..3f1452a270 100644 --- a/src/Controllers/Export/ExportController.php +++ b/src/Controllers/Export/ExportController.php @@ -66,7 +66,7 @@ final readonly class ExportController implements InvocableController /** @var array|null $aliasesParam */ $aliasesParam = $request->getParsedBodyParam('aliases'); $structureOrDataForced = (bool) $request->getParsedBodyParamAsStringOrNull('structure_or_data_forced'); - $rememberTemplate = $request->getParsedBodyParamAsString('remember_template', ''); + $rememberTemplate = $request->hasBodyParam('remember_template'); $dbSelect = $request->getParsedBodyParam('db_select'); $tableStructure = $request->getParsedBodyParam('table_structure'); $lockTables = $request->hasBodyParam('lock_tables'); @@ -231,7 +231,7 @@ final readonly class ExportController implements InvocableController if (OutputHandler::$asFile) { $filenameTemplate = $request->getParsedBodyParamAsString('filename_template', ''); - if ((bool) $rememberTemplate) { + if ($rememberTemplate) { $this->export->rememberFilename($this->userPreferencesHandler, $exportType, $filenameTemplate); }