Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kodowanie znaków
adminik
post 9.07.2008, 22:32:55
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.01.2008
Skąd: Tarnobrzeg

Ostrzeżenie: (0%)
-----


Sprawa jest taka że.

CMS MemHT Portal oraz MemHT PolishPack 1 mają kodowanie znaków ustawione na ISO natomiast wersja MemHT PolishPack 2 na utf i tu powstaje problem.

Przy czystej instalacji pp2 niema problemów z kodowaniem natomiast gdy ktoś zaaktualizuje z innej wersji do PolishPack 2 pojawiają się krzaczki.

Ja widzę tutaj 2 rozwiązania lecz niemam na nie już pomysłu.
1. Zrobić skrypt do konwersji bazy który będzie się uruchamiał podczas aktualizacji.
2. Zrobić skrypt który będzie podczepiony do metody query w klasie database.

Co do 1 niemam pomysłu całkowicie jak zrobić skrypt aby nie wykraczył się z większą bazą.
Co do 2 to:
Zrobiłem funkcję do konwersji znaków i nic pokazywało komunikat o tym że nie może znaleść tabeli w bazie...
Użyłęm funkcji iconv() =>
Kod
<b>Warning</b>:  iconv() expects parameter 3 to be string, resource given in <b>...</b>

Używałem także unicode_decode() oraz utf8_encode() i wszystko na co napotkałem się w manualu ale z tym naprawdę niemogę sobie poradzić.

Nie oczekuje gotowego skryptu oczekuje natomiast pewnych wskazówek które pomogły by mi w rozwiązaniu problemu.
Wstyd mi pisać bo jeśli zajmuje się stroną kodową MemHT PolishPack powiniennem sobie z tym bez problemu poradzić a jednak nigdy nie spodkałem się z tym problemem i stoję w miejscu...
Go to the top of the page
+Quote Post
scanner
post 9.07.2008, 23:42:24
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Ja bym zrobił dump bazy na dysk, skonwertował go np. Gżegżółką i wrzucił z powrotem na serwer.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
adminik
post 9.07.2008, 23:47:51
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.01.2008
Skąd: Tarnobrzeg

Ostrzeżenie: (0%)
-----


Tak ale jak pisałem już wyżej musi być to automatyczne aby można było to wklepać w cms.
Nie każdy będzie umiał przy updacie zrobić dump`a podmienić i wrzucić.

Tu jest największy problem właśnie.


--------------------
 
Go to the top of the page
+Quote Post
scanner
post 9.07.2008, 23:50:15
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




No tak, nie doczytałem, sorki.

Zainteresował mnie fragment, w którym używasz iconv" title="Zobacz w manualu PHP" target="_manual - wyraźnie jest napisany komunikat błędu. Jeśli jeszcze masz gdzieś na dysku, pokaż kawałek kodu, który wygenerował ten błąd - idę o zakład, że jedna drobna poprawka wystarczy.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
adminik
post 10.07.2008, 12:05:57
Post #5





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.01.2008
Skąd: Tarnobrzeg

Ostrzeżenie: (0%)
-----


Nie używałem nigdy tego typu funkcji lecz myślę że implementuje ją poprawnie.

Plik: inc/inc_database.php
Linie: 82-86
Medota: query
Kod bez zmian
Kod
    function query($query) {
        $result = mysql_query($query,$this->dblink);
        
        return $result;
    }

Z iconv
Kod
    function query($query) {
        $result = mysql_query($query,$this->dblink);
        
        $result = iconv("ISO-8859-2","UTF-8", $result);
        
        return $result;
    }



Co prawda z tym iconv będzie jeszcze trzeba zrobić instrukcję warunkową która włącza tą funkcję tylko jeżeli wynik zapytania jest kodowany w ISO smile.gif Ale to nie problem.

Ten post edytował adminik 10.07.2008, 12:13:37


--------------------
 
Go to the top of the page
+Quote Post
scanner
post 10.07.2008, 23:47:56
Post #6





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Pierwsze primo - mysql_query" title="Zobacz w manualu PHP" target="_manual zwraca identyfikator zasobu,
Drugie primo - po tym zasobie musisz się przeiterowac np. używając mysql_fetch_assoc" title="Zobacz w manualu PHP" target="_manual
Trzecie primo - dopiero wynik powyższego traktujesz iconv" title="Zobacz w manualu PHP" target="_manualem


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
adminik
post 11.07.2008, 13:45:36
Post #7





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.01.2008
Skąd: Tarnobrzeg

Ostrzeżenie: (0%)
-----


A no tak. Jednak przydało by się jeszcze użyć funkcji serialize" title="Zobacz w manualu PHP" target="_manual i unserialize" title="Zobacz w manualu PHP" target="_manual
Aby przekonwerterować array na sting i potem string na array.

Przy takim użyciu jak napisałeś też pokazuje błąd związany z tym ze do funkcji iconv przekazywana jest tablica a nie ciąg.
Nawet przy użyciu serialize" title="Zobacz w manualu PHP" target="_manual nie osiągam odpowiedniego rezultatu.
Będę musiał pisać funkcję konwersji znaków ręcznie z tego co widzę.

Kod
class database {
    var $dblink;
    var $host = "localhost";
    var $user = "root";
    var $pass;
    var $name;
    
    //PHP5 Constructor
    function __construct() {
        global $db_host,$db_user,$db_pass,$db_name;
            
        $this->host = $db_host;
        $this->user = $db_user;
        $this->pass = $db_pass;
        $this->name = $db_name;
    }
    //PHP4 Constructor
    function database() {
        global $db_host,$db_user,$db_pass,$db_name;
        
        $this->host = $db_host;
        $this->user = $db_user;
        $this->pass = $db_pass;
        $this->name = $db_name;
    }
    
    function iso2utf ( $array ) {
    
    $string = serialize ( $array );
    
    $result_string = iconv ( "ISO-8859-2" , "UTF-8" , $string );
    
    $array = unserialize ( $result_string );
    
    return $array;
    }

    function connect() {
        $this->dblink = @mysql_connect($this->host,$this->user,$this->pass) or die("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"pl\" lang=\"pl\">
                <head><meta http-equiv=\"Content-type\" content=\"text/html; charset=UTF-8\" />
                <title>Komunikat</title></head>
                <body><div style=\" padding: 2px; border: 1px solid #999; background-color: #EEE; font-family: Verdana; font-size: 10px; margin:0 auto;\">
                <b>Błą</b> Nie można połaczyć się z serwerem MySQL !
                </div></body></html>");
        @mysql_select_db($this->name,$this->dblink) or         die("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"pl\" lang=\"pl\">
                <head><meta http-equiv=\"Content-type\" content=\"text/html; charset=UTF-8\" />
                <title>Komunikat</title></head>
                <body><div style=\" padding: 2px; border: 1px solid #999; background-color: #EEE; font-family: Verdana; font-size: 10px; margin:0 auto;\">
                <b>Błąd:</b> Nie można wybrać bazy !
                </div></body></html>");
    }
    
    function disconnect() {
        @mysql_close($this->dblink);
    }
    
    function ping() {
        if (!mysql_ping($this->dblink)) {
            $this->disconnect();
            $this->connect();
        }
    }
    
    function query($query) {
        $result = mysql_query($query,$this->dblink);
        
        return $result;
    }
    
    function get_row($query) {
        $result = $this->query($query);
        $returned = @mysql_fetch_assoc($result);
        //$returned = $this->iso2utf($returned);
        @mysql_free_result($result);
        return $returned;
    }
    
    function get_list($query) {
        $returned = array();
        
        $result = $this->query($query);
        
        while ($row = mysql_fetch_assoc($result)) {
         //$row = $this->iso2utf($row);
            $returned[] = $row;
        }
        
        @mysql_free_result($result);
        return $returned;
    }
    
    function get_num($query) {
        $result = $this->query($query);
        $num = mysql_num_rows($result);
        @mysql_free_result($result);
        return $num;
    }
    
    //Do not print errors
    function get_num_noerr($query) {
        $result = @$this->query($query);
        $num = @mysql_num_rows($result);
        @mysql_free_result($result);
        return $num;
    }
    
    function optimize($gfx=false) {
        global $db_name;
        
        if ($gfx) { echo "<b>"._OPTIMIZINGDATABASE_."</b><br /><br />"; }
        $result = mysql_list_tables($db_name);
        $i = 0;
        $toopt = array();
        while ($i < mysql_num_rows($result)) {
            $name_table = mysql_table_name($result, $i);
            if ($gfx) { echo "<img src='images/check-green.gif' title='"._TABLE_." $name_table "._OPTIMIZED_."' border='0' alt='Ok' /> $name_table<br />"; }
            $toopt[] = $name_table;
            $i++;
        }
        $sql = "OPTIMIZE TABLE ".implode(",",$toopt);
        if ($result_set = @mysql_query($sql)) {
            if ($gfx) { echo "<br /><b>"._OPTIMIZINGDATABASEFINISHED_."</b>"; }
            return true;
        } else {
            return false;
        }
        mysql_free_result($result_set);
    }
    
    function affected_rows(){
        return mysql_affected_rows();
    }
}


Nic pomyślę może sobie poradzę... muszę sobie poradzić ;p
Go to the top of the page
+Quote Post
scanner
post 11.07.2008, 17:45:20
Post #8





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Chłopie, jaka serializacja? Co ty za herezje piszesz.. słyszałeś o array_walk" title="Zobacz w manualu PHP" target="_manual?


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
adminik
post 12.07.2008, 13:07:42
Post #9





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.01.2008
Skąd: Tarnobrzeg

Ostrzeżenie: (0%)
-----


wstydnis.gif Ups. prawie dzięki wielkie nie spotkałem się z tą funkcją nigdy.


--------------------
 
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 06:25