Diskuze: znaková sada stránek a databáze
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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
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_VALUE_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??
jj, protoze to neznas, jeste jsi to nedelal
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
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
<?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.
Zobrazeno 7 zpráv z 7.