Řešení problémů s kódováním databáze v systému XOOPS

Datum 14. 05. 2008 v 16:30 | Rubrika: Zápisník pojídačky koláčů pro Xoops

     Jestli něco opravdu z duše nemám ráda, jsou to různá kódování. Chápu, že v dobách dávno minulých bylo potřeba nějak znaky kódovat. Paměti bylo málo a byla drahá. Proto se šetřilo, jak to jen šlo. Ale v dnešní době mi to připadá poněkud překonané.

     Jenže různá kódování tu jsou, a ještě nějakou dobu určitě budou. Takže je nutné s nimi žíti. Xoops komunikuje s databází. V drtivé většině případů je to MySQL. Do relativně nedávné doby nebylo nic složitého zálohovat a přenášet tabulky. Jenže poslední dobou to problém je. Tedy pokud se neupraví, "nehackne", část systému.

     Takže pokud máte odvahu, můžeme se ponořit do hlubin Xoopsu a něco s těmi kódováními udělat. Vzhůru dolů

     Nejprve je potřeba najít soubor mysqldatabase.php. Ten se nachází v adresáři CLASS / DATABASE. Ze všeho nejprve je potřeba udělat jeho zálohu. Ono je to vždy lepší. Soubor pak otevřeme v libovolném textovém editoru, který neukládá formátování. Ideální je Poznámkový blok z Windows, nebo ConTEXT či PsPad.

     Když je soubor otevřený, je třeba najít tuto část:

function connect($selectdb = true)
{
if ( !extension_loaded( 'mysql' ) ) {
trigger_error( 'notrace:mysql extension not loaded', E_USER_ERROR );
return false;
}
if (XOOPS_DB_PCONNECT == 1) {
$this->conn = @mysql_pconnect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS);
} else {
$this->conn = @mysql_connect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS);
}

if (!$this->conn) {
$this->logger->addQuery('', $this->error(), $this->errno());
return false;
}
if($selectdb != false){
if (!mysql_select_db(XOOPS_DB_NAME)) {
$this->logger->addQuery('', $this->error(), $this->errno());
return false;
}
}
return true;
}

a před poslední return true vložit tyto řádky

mysql_query('SET character_set_results="WINDOWS-1250"');
mysql_query("SET CHARACTER SET WINDOWS-1250");
mysql_query("SET NAMES 'WINDOWS-1250'");

nebo použít Xoopsí způsob přístupu k databázi:

$set = @mysql_query("SET character_set_results='WINDOWS-1250'", $this->conn);
$set = @mysql_query("SET CHARACTER SET WINDOWS-1250", $this->conn);
$set = @mysql_query("SET NAMES 'WINDOWS-1250'", $this->conn);

     První způsob je funkční a bez potíží. Ten druhý používá přímo prostředků Xoopsu k přístupu k databázi. Takže je vlastně správnější. Rozhodnutí o tom nebo onom způsobu je na každém správci. Oba fungují dobře.

Místo kódování WINDOWS-1250 lze pochopitelně vložit téměř cokoli. Jen je potřeba mít všude stejnou hodnotu a také toto kódování pak používat. Žirafoviny používají právě kódování Windows 1250. Proto je i v tomto příkladě.

     Tímto jednoduchým trikem se databázi řekne, jaké kódování mají data v ní uložená a všechno bude dobře fungovat. Pokud se tyto řádky nevloží, bude všechno fungovat také. Ale jen do okamžiku obnovení databáze z nějaké zálohy.

     Nebo do pokusu překopírovat databázi na jiný server za účelem pokusů. Takto to mám například já doma. Na počítači běží Apache + PHP + MySQL a dělám si s Xoopsem pokusy. Když je všechno v pořádku, udělám totéž i zde. Jenže občas po pokusech je databáze nepoužitelná a proto je nutné ji obnovit.

      A také chci mít oba servery stejné, pokud možno, takže z tohoto serveru udělám zálohu a vložím ji do mé databáze doma. Bez popsané úpravy je to zlá můra a skoro to není možné udělat. S touto úpravou to jde snadno  (někdy...)





Článek pochází z webu Žirafoviny.cz
https://www.zirafoviny.cz

URL tohoto článku je:
https://www.zirafoviny.cz/modules/news/article.php?storyid=5