Autor Zpráva
kuba123
Profil *
Chtěl bych rozjet jeden svůj script, kterej jsem psal před časem a zapomněl jsem jak se pracuje s češtinou na databázi.

Mám v tabulkách nastaveno:
utf8_czech_ci
a v php my admin mám nastaveno "Porovnávání pro toto připojení k MySQL:" utf8_unicode_ci
když dám příkaz na vytisknutí podporovaných sad tak mezi nimi mám
cp1250 Windows Central European - cp1250_general_ci

Skript se kterým pracuji je v utf-8, kódování na stránce je:
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-language" content="cs">
A phpmyadmin taky používá na zobrazení stránky utf-8. Php admin mi data z databáze načítá a zobrazuje správně, ale můj script zobrazuje otazníky místo znaky s diakritiky.

Tak nevím co mám špatně, poradíte?


A ještě mám jinou databázi k jiným stránkám a tam je nastaveno u tabulek utf8_general_ci a to mi zase nejde zobrazit správně v phpmyadminu, ale na stránkách RS se to zobrazuje správně...
Joker
Profil
kuba123:
Pravidlo je takové, že jsou tři věci:
• Kódování, v jakém je uložený soubor (kódování nastavené v editoru při ukládání souboru se stránkou),
• kódování, v jakém stránka říká že je (meta charset, meta content-type anebo HTTP hlavička content-type),
• komunikační kódování s databází (SQL dotaz SET NAMES)

Tyhle tři musejí být nastavené na to samé kódování.
kuba123
Profil *
Joker:
Už jsem na to přišel.

Mám ve třídě mysql tuhle metodu:

  public function setMysqlCharset($charset){
    $charset = strtolower($charset);
    $charset = strtr ( $charset, array('-'=>'',' '=>'') );
    $r = mysql_query ("SET NAMES '$charset'");
    // tento příkaz by změnil to co nastavilo COLLATE při ALTER DATABASE ...
    $r = mysql_query("SET CHARACTER SET $charset"); // musí se nastavit až po výběru databáze
    if (!$r) $this->m->errors->init_errors[] = "Mysql warnning: charset not set. Check Mysql_class::setMysqlCharset(). ".mysql_error($r);
    $r = mysql_query("SET COLLATION_CONNECTION='utf8_czech_ci';"); 
    if (!$r) $this->m->errors->init_errors[] = "Mysql warnning: charset not set. Check Mysql_class::setMysqlCharset(). ".mysql_error($r);
  }

Ale nikde jsem ji nevolal. A pak jsem našel že tento řádek byl z nějakého důvodu zakomentovaný:
$this->setMysqlCharset("utf8");

Takže nejdříve se musím připojit na mysql, pak vybrat db a pak provést ten požadavek SET NAMES.

Dík
Joker
Profil
kuba123:
Mám ve třídě mysql tuhle metodu
Ta je víceméně zbytečná.
Jediná podstatná část je: mysql_query ("SET NAMES '$charset'");, ten zbytek není potřeba.

Jinak mysql rozšíření je od PHP 5.5 zastaralé (deprecated), takže by bylo dobré aktualizovat.
kuba123
Profil *
Co tím myslíš?


"Jinak mysql rozšíření je od PHP 5.5 zastaralé"

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: