. */ include_once __DIR__.'/../../core.php'; function integrity_diff($expected, $current) { foreach ($expected as $key => $value) { if (array_key_exists($key, $current) && is_array($value)) { if (!is_array($current[$key])) { $difference[$key] = $value; } else { $new_diff = integrity_diff($value, $current[$key]); if (!empty($new_diff)) { $difference[$key] = $new_diff; } } } elseif (!array_key_exists($key, $current) || $current[$key] != $value) { $difference[$key] = [ 'current' => $current[$key], 'expected' => $value, ]; } } return !isset($difference) ? [] : $difference; } function settings_diff($expected, $current) { foreach ($expected as $key => $value) { if (array_key_exists($key, $current)) { if (!is_array($current[$key])) { if ($current[$key] !== $value) { $difference[$key] = [ 'current' => $current[$key], 'expected' => $value, ]; } } else { $new_diff = integrity_diff($value, $current[$key]); if (!empty($new_diff)) { $difference[$key] = $new_diff; } } } else { $difference[$key] = [ 'current' => null, 'expected' => $value, ]; } } return $difference; } $file = basename(__FILE__); $effettua_controllo = filter('effettua_controllo'); // Schermata di caricamento delle informazioni if (empty($effettua_controllo)) { echo '
'.tr('Caricamento in corso').'...
'; return; } switch ($database->getType()) { case 'MariaDB': $file_to_check_database = 'mariadb_10_x.json'; break; case 'MySQL': $mysql_min_version = '5.7.0'; $mysql_max_version = '5.7.99'; $file_to_check_database = ((version_compare($database->getMySQLVersion(), $mysql_min_version, '>=') && version_compare($database->getMySQLVersion(), $mysql_max_version, '<=')) ? 'mysql_5_7.json' : 'mysql.json'); break; default: $file_to_check_database = 'mysql.json'; break; } $contents = file_get_contents(base_dir().'/'.$file_to_check_database); $data = json_decode($contents, true); if (empty($data)) { echo '
'.tr('Impossibile effettuare controlli di integrità in assenza del file _FILE_', [ '_FILE_' => ''.$file_to_check_database.'', ]).'.
'; return; } // Controllo degli errori $info = Update::getDatabaseStructure(); $results = integrity_diff($data, $info); $results_added = integrity_diff($info, $data); $contents = file_get_contents(base_dir().'/settings.json'); $data = json_decode($contents, true); $settings = Update::getSettings(); $results_settings = settings_diff($data, $settings); $results_settings_added = settings_diff($settings, $data); // Schermata di visualizzazione degli errori if (!empty($results) || !empty($results_added) || !empty($results_settings) || !empty($results_settings_added)) { if (!empty($results)) { echo '

'.tr("Segue l'elenco delle tabelle del database che presentano una struttura diversa rispetto a quella prevista nella versione ufficiale del gestionale").'.

'.tr('Attenzione: questa funzionalità può presentare dei risultati falsamente positivi, sulla base del contenuto del file _FILE_ e la versione di _MYSQL_VERSION_ di _DBMS_TYPE_ rilevata a sistema', [ '_FILE_' => ''.$file_to_check_database.'', '_MYSQL_VERSION_' => ''.$database->getMySQLVersion().'', '_DBMS_TYPE_' => ''.$database->getType().'', ]).'.
'; foreach ($results as $table => $errors) { echo '

'.$table.'

'; if (array_key_exists('current', $errors) && $errors['current'] == null) { echo '
'.tr('Tabella assente').'
'; continue; } $foreign_keys = $errors['foreign_keys'] ?: []; unset($errors['foreign_keys']); if (!empty($errors)) { echo ' '; foreach ($errors as $name => $diff) { echo ' '; } echo '
'.tr('Colonna').' '.tr('Conflitto').'
'.$name.' '.json_encode($diff).'
'; } if (!empty($foreign_keys)) { echo ' '; foreach ($foreign_keys as $name => $diff) { echo ' '; } echo '
'.tr('Foreign keys').' '.tr('Conflitto').'
'.($name ?: $diff['expected']['title']).' QUERY DA ESEGUIRE:
ALTER TABLE '.$table.' ADD CONSTRAINT '.$name.' FOREIGN KEY ('.$diff['expected']['column'].') REFERENCES '.$diff['expected']['referenced_table'].'(`'.$diff['expected']['referenced_column'].'`) ON DELETE '.$diff['expected']['delete_rule'].' ON UPDATE '.$diff['expected']['update_rule'].';
'; } } } if (!empty($results_added)) { foreach ($results_added as $table => $errors) { echo '

'.$table.'

'; if (array_key_exists('current', $errors) && $errors['current'] == null) { echo '
'.tr('Tabella assente').'
'; continue; } $foreign_keys = $errors['foreign_keys'] ?: []; unset($errors['foreign_keys']); if (!empty($errors)) { echo ' '; foreach ($errors as $name => $diff) { echo ' '; } echo '
'.tr('Colonna').' '.tr('Conflitto').'
'.$name.' Campo non previsto
'; } if (!empty($foreign_keys)) { echo ' '; foreach ($foreign_keys as $name => $diff) { echo ' '; } echo '
'.tr('Foreign keys').' '.tr('Conflitto').'
'.$name.' Chiave esterna non prevista
'; } } } if (!empty($results_settings)) { echo '

Problemi impostazioni

'; foreach ($results_settings as $key => $setting) { if (!$setting['current']) { $class = 'danger'; } else { $class = 'warning'; } echo ' '; } echo '
'.tr('Nome').' '.tr('Valore attuale').' '.tr('Valore atteso').'
'.$key.' '.($setting['current'] ?: '⚠️ Impostazione mancante').' '.$setting['expected'].'
'; } if (!empty($results_settings_added)) { echo '

Impostazioni non previste

'; foreach ($results_settings_added as $key => $setting) { if ($setting['current'] == null) { echo ' '; } } echo '
'.tr('Nome').' '.tr('Valore attuale').'
'.$key.' '.$setting['expected'].'
'; } } else { echo '
'.tr('Il database non presenta problemi di integrità').'.
'; }