Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
pd.ova
Člen
Avatar
pd.ova:1.6.2021 19:00

Zdar, můžete se někdo podívat na web co jsem udělal? je to http://www.agentura-idea.cz/ Na hostingu nějak změnili server asi i verzi php přesunuli databázi a začalo mi to házet nesmyslné znaky místo češtiny. V html mám kodovaní windows-1250, v databázi je utf-8-general, když tam hodím window-1250 tak to stejně nefunguje nevím co s tím..v HTML když hodím utf-8 tak se nic neděje, když otevřu databázi tak tam jsou stejné nesmysly jako na webu se zobrazují.. asi špatně přesunuli databázi že? Co s tím? Jak to vyléčit po těch exertech z banan.cz..už mám celkem roky puzu z pragramkem ale rád bych to nějak vyřešil, web funguje stále.. Děkuji mnohokrát..

 
Odpovědět
1.6.2021 19:00
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.6.2021 15:54

No, to mas uplne v haji. To treba resit databazove, zjistit, co je tam za kodovani.
Kdyz ve firefox, v prohlizeci, prepnu znakovou sadu z w1250 na utf, tak se nektere znaky zobrazi dobre, jine ne.
Takze, tipuji, ze ve stare db mas pripojeni latin1 a nekdo ti nekde rekl, ze to ma tahat jako utf8, tak to udelal chybu. Takz,e pokud jako menis SET NAMES u php, tak zkus latin1, nejdriv. Pokud menis neco jineho, kde a co, to bys musel rict.
Co treba nejakou ukazku php kodu?
A, kdyz udelas v php-adminu export s create table, co tam je a tak...

Školení (64)
Knihy a uèebnice (1)
O agentu?e
O mně
Profily lektor?
Plán akcí
Rekvalifikace
Jazykový kurz

Tou ukazkou chci rici, ze to vypada jako kod pro latin1, ktera prave chybne zobbrazuje nektere znaky.

Editováno 2.6.2021 15:55
 
Nahoru Odpovědět
2.6.2021 15:54
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.6.2021 15:57

Jakoze treba export 2-3 radku, link na soubor, by asi stacil. Dump z php-adminu by to mohl teoreticky do souboru ulozit ve spravnem kodovani, pokud to dobre nastavili borci, co delali update nebo, co provadeli :)

 
Nahoru Odpovědět
2.6.2021 15:57
Avatar
pd.ova
Člen
Avatar
pd.ova:2.6.2021 17:05

no včil jak dam export tak tam je totok

-- Adminer 4.1.0 MySQL dump

SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALU­E_ON_ZERO';

DROP TABLE IF EXISTS xxx;
CREATE TABLE xxx (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
nazev varchar(100) NOT NULL,
url text NOT NULL,
popis text NOT NULL,
obrazek varchar(255) NOT NULL,
zobrazit int(11) NOT NULL,
PRIMARY KEY (id),
KEY nazev (nazev)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

takze tam mam dat misto toho utf8 jen latin1??

 
Nahoru Odpovědět
2.6.2021 17:05
Avatar
pd.ova
Člen
Avatar
pd.ova:2.6.2021 18:42

inu tak jsem zkusil dát charset na latin1 i set names na latin1 a nic se nestalo..

Editováno 2.6.2021 18:43
 
Nahoru Odpovědět
2.6.2021 18:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.6.2021 9:02

jj, protoze to neznas, jeste jsi to nedelal :)

  • create table je super
  • a inserty nic? Podle textu poznas, jake je tam kodovani. Jenze forko ti to muze zmrsit, takze je dobre ten soubor linknout jako webovou stranku misto vkladani kodu.

1)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- tim radkem jen rikas, ze tabulka se tvari jako kodovani utf8

2)
CREATE TABLE t1
(
    col1 VARCHAR(5)
      CHARACTER SET latin1 -- pro sloupec muzes nastavit CHARACTER SET
      COLLATE latin1_german1_ci -- to je upresneni znakove sady
);

3) jenze podstatne je, co napises k sql prikazu v programu

query1 = SET NAMES utf8; -- tim rikas, ze vsechny nasledujici query budou mit kodovani utf8
query2 = SELECT * FROM tab; -- vytahnes data v utf8

4) a dale je podstatne, jake header ti odesila php, cili, tez nekde na zacatku programu mas nejspis radek
<?php
header('Content-Type: text/html; charset=utf-8');
?>

Takze... Podstatne je, co mas v programu, zda tam mas nekde po prikazu connect spusteny prikaz query se SET NAMES a co v nem je

$db = new DB;
$db->connect('server', 'jmeno', heslo)
$db->query('SET NAMES utf8')
...
$db->query('SELECT...')
$db->query('SELECT...')
...
$db->disconnect();

No, a k cemu jsou tedy dobre body 1 a 2? Kdyz potrebujes s kodovanim carovat.
1

  • rika, ze kodovani v cele tabulce, pokud nema sloupec uvedeno jinak, tak bude uf8 ) ... DEFAULT CHARSET=utf8;
  • Pokud nyni v programu pouzijes SET NAMES cp1250, tak sql vytahne data z tabulky jako utf8 a prekoduje ti je do win-1250.
  • Pokud SET NAMES nikde v programu nemas, tak se pouzije default hodnota pro celou databazi. Ta muze byt nastavena latin1. Tvuj program dostane data prekodovana na latin1

Pripad, ktery nastal nejspis u tebe... v programu nemas SET NAMES. Server ma nastaveno SET NAMES na utf8. tabulka ma nastaveno utf8. Ale data v tabulce jsou ulozene v latin1, cili, sloupce by meli mit nastavene CHARACTER SET latin1 a COLLATE latin1_general_ci. Pokud nemaji, tak server veme text, ktery je latin1. Tvrdi o nem, ale, ze je utf8 a uzivateli jej posle jako utf8. Nebo neco podobneho.


Problem je, ze, kdyz to mas ted v db, tak ty nesmis menit nastaveni, protoze sql ti to samo prekoduje a v databazi uz budes mit data, ktera se nedaji zobrazit v zadnem kodovani. To nastaveni muzes menit jen pri importu do sql databaze sql prikazy, tim create table a set names, jak jsi poslal ukazku.
Ale, muzes zkusit data ziskat ve spravnem tvaru. Muzes se zkusit k db pripojovat s ruznym kodovanim a zobrazovat data a pak je prekodovat do jineho kodovani.

$db = new DB;
$db->connect('server', 'jmeno', heslo)

$db->query('SET NAMES utf8') // A
$result = $db->query('SELECT...')
... $text = $result->fetch();

header('Content-Type: text/html; charset=utf-8'); // B
$text = iconv('ISO-8859-1', 'UTF-8//IGNORE', $text ); // C - https://phpfashion.com/prevody-mezi-kodovanim
// ze zacatku muzes zkusit radek iconv uplne vynechat
echo $text;

A = utf8, latin1, cp1250
B = utf-8, ISO-8859-1, windows-1250
C = UTF-8, ISO-8859-1, WINDOWS-1250
A pri trose stesti najdes tu spravnou kombinace. Ale, samozrejme, mnohem jednodussi by mit ulozeny export db v souboru. Zjistit, jake je tam kodovani. zmenit sql prikazy SET NAMES a u CREATE table a nasoukat to do db spravne. Doporucuji ale delat si to v testovaci databazi!!! Nebo si puvodni tabulky v db zklonovat.
Mozna bych ti dokazal poradit, co zadat na mista ABC, ale nevim, jak vypadaji data v db :)

Editováno 3.6.2021 9:04
 
Nahoru Odpovědět
3.6.2021 9:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.6.2021 15:43
<?php
class classDb
{
private $conn;
public function connect($config=array())
        {
        try     {
                $dsn  = 'mysql:host='.$config['host'].';port='.$config['port'].';dbname='.$config['db'];
                $conn = new PDO($dsn, $config['user'], $config['psw']);
                }
        catch (PDOException $e)
                {
                echo $e->getMessage();
                return false;
                }
        $this->conn = $conn;
        }
public function query($query)
        {
        $empty = array();
        if (!$this->conn) {return $empty;}
        $stmt = $this->conn->prepare($query);
        $bool = $stmt->execute();
        if (!$bool)  {return $empty;}
        return $stmt->fetch(PDO::FETCH_ASSOC);
        }
public function disconnect()
        {
        $this->conn = null;
        }
}



$cfg = array(
        'host' => 'localhost',
        'port' => 3306,
        'user' => 'root',
        'psw'  => '',
        'db'   => 'ev3_ev_projektu',
        );
$db = new classDb;
$db->connect($cfg);
$list = array(
        array('utf8', 'utf-8', 'UTF-8'),
        array('latin1', 'ISO-8859-1', 'ISO-8859-1'),
        array('cp1250','windows-1250' , 'WINDOWS-1250')
        );
$out = array();
foreach ($list as $aa) foreach ($list as $bb) foreach ($list as $cc) foreach ($list as $dd)
        {
        list($a, $b, $c, $d) = array($aa[0], $bb[1], $cc[2], $dd[2]);
        $db->query("SET NAMES $a");
        $row = $db->query('SELECT `nazev` FROM `s_pracoviste` WHERE `idpracoviste`=7');
        $text = $row['nazev'];
        //header("Content-Type: text/html; charset=$b");
        $out[] = "--- $a / $b / $c / $d ---";
        $out[] = $text;
        $out[] = iconv($c, "$d//IGNORE", $text);
        }
header("Content-Type: text/html; charset=utf-8"); // $b
echo implode("<br>", $out);
?>

Muzes si udelat jednoduchy program.

Vyberes si nejaky string, kde je co nejvic ceskych znaku pro SELECT.

Bohuzel nejde pouzit header. Podobnou funkci plni ten iconv. Jenze... Ty muzes mit data ve win-1250, ulozena pod kodovanim SET NAMES latin1 v db. Je vytahnes. A ted je potrebujes zobrazit do stranky s kodovanim utf-8. Cili, pouzijes iconv, prekodujes 1250 na utf-8. Ok, ted by melo byt vse ok. Jenze server ma default kodovani nastavene na win-1250. To prave musis zmenit pres php header.
Jenze, do toho prikladu nemuzu pouzit header v cyklu a menit si ho, protoze ten je platny pro celou stranku :) Proste, bude fungovat jen prvni nebo posledni hodnota.
Takze, mozna ti to nepomuze :) Mozna bude treba zkusit vsechny moznosti po jedne. Resp, dal jsem tam 3 kodovani, tak je prostridat na tom radku s header, udelat si treba 3 ruzne programy.

Editováno 4.6.2021 15:44
 
Nahoru Odpovědět
4.6.2021 15:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.