diff --git a/libraries/classes/UserPreferences.php b/libraries/classes/UserPreferences.php
index 4e7ddfe4ca..b7113a457a 100644
--- a/libraries/classes/UserPreferences.php
+++ b/libraries/classes/UserPreferences.php
@@ -9,6 +9,7 @@ use PhpMyAdmin\Config\Forms\User\UserFormList;
use function array_flip;
use function array_merge;
use function basename;
+use function htmlspecialchars;
use function http_build_query;
use function is_array;
use function json_decode;
@@ -166,12 +167,17 @@ class UserPreferences
}
if (! $dbi->tryQuery($query, DatabaseInterface::CONNECT_CONTROL)) {
$message = Message::error(__('Could not save configuration'));
- $message->addMessage(
- Message::rawError(
- $dbi->getError(DatabaseInterface::CONNECT_CONTROL)
- ),
- '
'
- );
+ $message->addMessage(Message::error($dbi->getError(DatabaseInterface::CONNECT_CONTROL)), '
');
+ if (! $this->hasAccessToDatabase($cfgRelation['db'])) {
+ /**
+ * When phpMyAdmin cached the configuration storage parameters, it checked if the database can be
+ * accessed, so if it could not be accessed anymore, then the cache must be cleared as it's out of date.
+ */
+ $_SESSION['relation'][$GLOBALS['server']] = [];
+ $message->addMessage(Message::error(htmlspecialchars(
+ __('The phpMyAdmin configuration storage database could not be accessed.')
+ )), '
');
+ }
return $message;
}
@@ -179,6 +185,17 @@ class UserPreferences
return true;
}
+ private function hasAccessToDatabase(string $database): bool
+ {
+ $escapedDb = $GLOBALS['dbi']->escapeString($database);
+ $query = 'SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = \'' . $escapedDb . '\';';
+ if ($GLOBALS['cfg']['Server']['DisableIS']) {
+ $query = 'SHOW DATABASES LIKE \'' . Util::escapeMysqlWildcards($escapedDb) . '\';';
+ }
+
+ return (bool) $GLOBALS['dbi']->fetchSingleRow($query, 'ASSOC', DatabaseInterface::CONNECT_CONTROL);
+ }
+
/**
* Returns a user preferences array filtered by $cfg['UserprefsDisallow']
* (exclude list) and keys from user preferences form (allow list)
diff --git a/test/classes/UserPreferencesTest.php b/test/classes/UserPreferencesTest.php
index 13a5d47f9f..3020e4ddaf 100644
--- a/test/classes/UserPreferencesTest.php
+++ b/test/classes/UserPreferencesTest.php
@@ -140,6 +140,7 @@ class UserPreferencesTest extends AbstractNetworkTestCase
*/
public function testSave(): void
{
+ $GLOBALS['cfg']['Server']['DisableIS'] = true;
$GLOBALS['server'] = 2;
$_SESSION['relation'][2]['PMA_VERSION'] = PMA_VERSION;
$_SESSION['relation'][2]['userconfigwork'] = null;
@@ -251,7 +252,8 @@ class UserPreferencesTest extends AbstractNetworkTestCase
$this->assertInstanceOf(Message::class, $result);
$this->assertEquals(
- 'Could not save configuration
err1',
+ 'Could not save configuration
err1'
+ . '
The phpMyAdmin configuration storage database could not be accessed.',
$result->getMessage()
);
}