@@ -708,37 +708,28 @@ private function switchDbCharsetAction(): void
708708 return ;
709709 }
710710
711- $ configCharset = Tools::config ('mysql_charset ' );
712- $ configCollate = Tools::config ('mysql_collate ' );
713- if (empty ($ configCharset ) || empty ($ configCollate )) {
714- Tools::log ()->error ('config-mysql-charset-error ' , [
715- '%config-charset% ' => $ configCharset ,
716- '%config-collate% ' => $ configCollate
717- ]);
718- return ;
719- }
720-
721711 $ selectedCharset = $ this ->request ->query ('charset ' );
722712 switch ($ selectedCharset ) {
723713 case 'utf8 ' :
724- $ configFile = str_replace ("' " . $ configCharset . "' " , "'utf8' " , $ configFile );
725- $ configFile = str_replace ("' " . $ configCollate . "' " , "'utf8_bin' " , $ configFile );
714+ $ selectedCollate = 'utf8_bin ' ;
726715 break ;
727716
728717 case 'utf8mb4 ' :
729- $ configFile = str_replace ("' " . $ configCharset . "' " , "'utf8mb4' " , $ configFile );
730- $ configFile = str_replace ("' " . $ configCollate . "' " , "'utf8mb4_unicode_520_ci' " , $ configFile );
718+ $ selectedCollate = 'utf8mb4_unicode_520_ci ' ;
731719 break ;
732720
733721 default :
734722 Tools::log ()->error ('config-mysql-charset-error ' , [
735- '%config-charset% ' => $ configCharset ,
736- '%config-collate% ' => $ configCollate ,
723+ '%config-charset% ' => Tools:: config ( ' mysql_charset ' ) ,
724+ '%config-collate% ' => Tools:: config ( ' mysql_collate ' ) ,
737725 '%selected-charset% ' => $ selectedCharset
738726 ]);
739727 return ;
740728 }
741729
730+ $ configFile = $ this ->setConfigConstant ($ configFile , 'FS_MYSQL_CHARSET ' , $ selectedCharset );
731+ $ configFile = $ this ->setConfigConstant ($ configFile , 'FS_MYSQL_COLLATE ' , $ selectedCollate );
732+
742733 // guardamos el archivo
743734 if (false === file_put_contents (Tools::folder ('config.php ' ), $ configFile )) {
744735 Tools::log ()->error ('record-save-error ' );
@@ -749,6 +740,28 @@ private function switchDbCharsetAction(): void
749740 Tools::log ()->notice ('record-updated-correctly ' );
750741 }
751742
743+ private function setConfigConstant (string $ configFile , string $ name , string $ value ): string
744+ {
745+ $ definition = "define(' " . $ name . "', ' " . $ value . "'); " ;
746+ $ pattern = "/define \\s* \\( \\s*([' \"]) " . preg_quote ($ name , '/ ' )
747+ . "\\1 \\s*, \\s*([' \"])[^' \"]* \\2 \\s* \\) \\s*;/ " ;
748+
749+ if (preg_match ($ pattern , $ configFile )) {
750+ return preg_replace ($ pattern , $ definition , $ configFile , 1 );
751+ }
752+
753+ $ closingTagPosition = strrpos ($ configFile , '?> ' );
754+ if ($ closingTagPosition === false ) {
755+ $ separator = str_ends_with ($ configFile , "\n" ) ? '' : PHP_EOL ;
756+ return $ configFile . $ separator . $ definition . PHP_EOL ;
757+ }
758+
759+ $ beforeClosingTag = substr ($ configFile , 0 , $ closingTagPosition );
760+ $ separator = str_ends_with ($ beforeClosingTag , "\n" ) ? '' : PHP_EOL ;
761+ return $ beforeClosingTag . $ separator . $ definition . PHP_EOL
762+ . substr ($ configFile , $ closingTagPosition );
763+ }
764+
752765 private function unzipDatabase (string $ gzFilePath ): string
753766 {
754767 // abrimos el archivo .sql.gz
0 commit comments