* Copyright (C) 2004-2014 Laurent Destailleur * Copyright (C) 2004 Sebastien Di Cintio * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2024 MDW * Copyright (C) 2024-2025 Frédéric France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/admin/system/database.php * \brief Page with system information of database */ // Load Dolibarr environment require '../../main.inc.php'; /** * @var Conf $conf * @var DoliDB $db * @var HookManager $hookmanager * @var Translate $langs * @var User $user * * @var string $dolibarr_main_db_pass * @var string $dolibarr_main_db_collation * @var string $dolibarr_main_db_character_set */ $langs->load("admin"); $action = GETPOST('action', 'aZ09'); if (!$user->admin) { accessforbidden(); } /* * Actions */ $logsql = ''; $resultsql = null; if ($action == 'convertutf8unicode') { // Test on permission already done. $sql = "ALTER DATABASE ".$db->sanitize($db->database_name)." CHARACTER SET utf8 COLLATE utf8_unicode_ci"; $logsql .= $sql.'
'; $resultsql = $db->query($sql); } if ($action == 'convertutf8mb4unicode') { // Test on permission already done. $sql = "ALTER DATABASE ".$db->sanitize($db->database_name)." CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"; $logsql .= $sql.'
'; $resultsql = $db->query($sql); } if ($action == 'convertutf8general') { // Test on permission already done. $sql = "ALTER DATABASE ".$db->sanitize($db->database_name)." CHARACTER SET utf8 COLLATE utf8_general_ci"; $logsql .= $sql.'
'; $resultsql = $db->query($sql); } if ($action == 'convertutf8mb4general') { // Test on permission already done. $sql = "ALTER DATABASE ".$db->sanitize($db->database_name)." CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"; $logsql .= $sql.'
'; $resultsql = $db->query($sql); } /* * View */ $form = new Form($db); llxHeader('', '', '', '', 0, 0, '', '', '', 'mod-admin page-system_database'); print load_fiche_titre($langs->trans("InfoDatabase"), '', 'title_setup'); if ($logsql) { print info_admin($logsql.' '.(empty($resultsql) ? ' => KO '.$db->lasterror() : ' => OK')); } // Database print '
'; print ''; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; // @phan-suppress-next-line PhanTypeSuspiciousStringExpression (user is defined in the stdClass) print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print '
'.$langs->trans("Database").'
'.$langs->trans("Version").''.$db::LABEL.' '.$db->getVersion().'
'.$langs->trans("DatabaseServer").''.$conf->db->host.'
'.$langs->trans("DatabasePort").''.(empty($conf->db->port) ? $langs->trans("Default") : $conf->db->port).'
'.$langs->trans("DatabaseName").''.$conf->db->name.'
'.$langs->trans("DriverType").''.$conf->db->type.($db->getDriverInfo() ? ' ('.$db->getDriverInfo().')' : '').'
'.$langs->trans("User").''.$conf->db->user.'
'.$langs->trans("Password").''.preg_replace('/./i', '*', $dolibarr_main_db_pass).'
'.$langs->trans("DBStoringCharset").''.$db->getDefaultCharacterSetDatabase(); if ($db->type == 'mysqli') { $tooltipexample = "
SHOW VARIABLES LIKE 'character_set_database' (cached)
You can avoid cache effect with:
SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '".$db->escape($conf->db->name)."'"; print ' '.$form->textwithpicto('', $langs->transnoentitiesnoconv("HelpMariaDBToGetValue", $tooltipexample.'
'.$langs->transnoentitiesnoconv("HelpMariaDBToGetPossibleValues", "
SHOW CHARSET")."

Example to change value: ALTER DATABASE ".$conf->db->name." CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"), 1, 'help', 'valignmiddle', 0, 3, 'tooltipcharset'); // We can use $db->getDefaultCharacterSetDatabase(), $db->getListOfCharacterSet(), } print '
'.$langs->trans("DBSortingCharset").''; $defaultcollation = $db->getDefaultCollationDatabase(); print dolPrintHTML($defaultcollation); global $dolibarr_main_db_collation; if ($db->type == 'mysqli') { if ($defaultcollation != $conf->db->dolibarr_main_db_collation) { print img_warning('The database default value of collation '.$defaultcollation.' differs from conf setup '.$conf->db->dolibarr_main_db_collation); } $tooltipexample = "
SHOW VARIABLES LIKE 'collation_database' (cached)
You can avoid cache effect with:
SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '".$db->escape($conf->db->name)."'"; print ' '.$form->textwithpicto('', $langs->transnoentitiesnoconv("HelpMariaDBToGetValue", $tooltipexample.'
'.$langs->transnoentitiesnoconv("HelpMariaDBToGetPossibleValues", "
SHOW COLLATION")."

Example to change value: ALTER DATABASE ".$conf->db->name." CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"), 1, 'help', 'valignmiddle', 0, 3, 'tooltipcollation'); // We can use $db->getDefaultCollationDatabase(), $db->getListOfCollation(); print '       '.$langs->trans("ConvertInto"); if (!in_array($defaultcollation, array("utf8_unicode_ci"))) { print '   utf8 unicode'; } if (!in_array($defaultcollation, array("utf8_general_ci"))) { print '   utf8 general'; } if (!in_array($defaultcollation, array("utf8mb4_unicode_ci"))) { print '   utf8mb4 unicode'; } if (!in_array($defaultcollation, array("utf8mb4_general_ci"))) { print '   utf8mb4 general'; } } print '
'; print '
'; // Tables print '
'; print '
'; print ''; print ''."\n"; print ''."\n"; print '
'.$langs->trans("Tables").'
'.img_picto('', 'list', 'class="pictofixedwidth"').$langs->trans("List").'
'; print '
'; $listofvars = $db->getServerParametersValues(); $listofstatus = $db->getServerStatusValues(); $arraylist = array('listofvars', 'listofstatus'); if (!count($listofvars) && !count($listofstatus)) { print $langs->trans("FeatureNotAvailableWithThisDatabaseDriver"); } else { foreach ($arraylist as $listname) { print '
'; print '
'; print ''; print ''; print ''; print ''; print ''."\n"; // arraytest is an array of test to do $arraytest = array(); if (preg_match('/mysql/i', $db->type)) { $arraytest = array( 'character_set_database' => array('var' => 'dolibarr_main_db_character_set', 'valifempty' => 'utf8'), 'collation_database' => array('var' => 'dolibarr_main_db_collation', 'valifempty' => 'utf8_unicode_ci') ); } $listtouse = array(); if ($listname == 'listofvars') { $listtouse = $listofvars; } if ($listname == 'listofstatus') { $listtouse = $listofstatus; } foreach ($listtouse as $param => $paramval) { print ''; print ''; print ''; print ''."\n"; } print '
'.$langs->trans("Parameters").'
'; print $param; print ''; $show = 0; $text = ''; foreach ($arraytest as $key => $val) { if ($key != $param) { continue; } $tmpvar = $val['var']; $val2 = ${$tmpvar}; $text = 'Should be in line with value of param '.$val['var'].' thas is '.($val2 ? $val2 : "'' (=".$val['valifempty'].")").''; $show = 1; } if ($show == 0) { print $paramval; } if ($show == 1) { // @phan-suppress-next-line PhanPluginSuspiciousParamPosition print $form->textwithpicto($paramval, $text); } if ($show == 2) { // @phan-suppress-next-line PhanPluginSuspiciousParamPosition print $form->textwithpicto($paramval, $text, 1, 'warning'); } print '
'."\n"; print '
'; } } // End of page llxFooter(); $db->close();