"Vadné" kódování při ukládání do DB
6 příspěvků
Archiv diskusního fóra
Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.
-
Dobrý den, ukládám zprávy z http://grelek.wz.cz/chat/ do DB. Vše funguje jak má, už zabezpečuji apod. ale, nefunguje mi tam kódování. Ukázka kódu: <?php //adresar-insert-firma.php $hostName="mysql.webzdarma.cz" ; $databaseName = "user" ; $userName="user" ; $password="user" ; // sestavení SQL dotazu pro vložení firmy $dotaz_kodovani = 'SET NAMES utf8'; $dotaz_pridat_zpravu = 'INSERT INTO chatOdeslane(Jmeno, Zprava) VALUES("%s", "%s")'; // pripojeni k databazi if (!($link=mysql_pconnect($hostName, $userName, $password))) { echo 'error connecting to host' . $hostName . ' by user ' . $userName; exit(); }; // vyber databaze if (!mysql_select_db($databaseName, $link)) { echo 'Error in selecting ' . $databaseName . ' database'; echo 'Error: ' . mysql_errno($link) . mysql_error($link); exit(); }; // vykonani SQL dotazu dotaz_kodovani if (!mysql_query($dotaz_kodovani, $link)) { echo 'Error in executing ' . $dotaz_kodovani; echo 'Error: ' . mysql_errno($link) . mysql_error($link); exit(); }; // vykonani SQL vyrazu pridani zpravy if (!mysql_query(sprintf($dotaz_pridat_zpravu, $_POST['jmeno'], $_POST['zprava'], 'A'))) { echo 'Error in executing ' . $dotaz_pridat_zpravu; echo 'Error: ' . mysql_errno($link) . mysql_error($link); exit(); }; ?> Chtěl bych se zeptat kde je problém? A ano, vím že toto nemáte rádi ale zrovna v tomto případě nevím, jaký úryvek kódu bych sem měl vložit, protože s SQL jsem začátečník. Děkuji za odpovědi
-
Záleží na tom, kde ti to kódování "nefunguje". Jednak je třeba zkontrolovat nastavení sloupců, do kterých ukládáš (tedy Jmeno a Zprava). PhpMyAdmin na webzdarma tam defaultně strká švédštinu. Proto záleží: a) v jakém kódování tam obsah vůbec rveš (většina prohlížečů při vyplňování inputů používá stejné kódování, jako má stránka uvedené v hlavičce) b) v jakém kódování jej vypisuješ (nezapomenout použít SET NAMES i pro spojení, které provádí Select. Navíc často se objevuje, že kódování v databázi má někdo správně, ale rozbíji jej až špatné nastavení v html hlavičce :) c) případně, kde se zobrazuje divně -- jestli při zpracování Selectu nebo v phpMyAdminovi ;) Druhá věc je dotaz SET NAMES, parametru 'utf8' by měl být v uvozovkách, ale to by nemělo hrát roli. Za třetí pokud už se rozhodneš ve funkci mysql_query používat parametr $link, používej jej všude -- vyhneš se tam případným problémům, kdy nastavíš kódování pouze pro jedno z vytvořených spojení (teď teda pominu fakt, že pro takové případy je lepší použít trvalé spojení (4. parametr mysql_connect)). A poslední věc.. nevím, co si představuješ pod pojmem "už zabezpečuji", ale v samotném dotazu vidím natvrdo použité $_POST. Pokud už dříve neproháníš tyto hodnoty např. přes htmlspecialchars, tak bys měl použít mysql_real_escape_string. Aktuální stav dle mého pohledu (přestože nevidím celý kód) příliš zabezpečený není ;)
-
S heslem, ktere jsi uvedl v jinem foru jsem udelal export tabulky CREATE TABLE `chatOdeslane` ( `ID` int(2) NOT NULL auto_increment, `Jmeno` char(20) collate latin2_czech_cs NOT NULL, `Datum` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `Zprava` char(255) collate latin2_czech_cs NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=latin2 COLLATE=latin2_czech_cs AUTO_INCREMENT=32 ; Cili by bylo tez dobre prihlasit se do phpmyadmina a pomenit sloupce na porovnani = utf8_czech_ci (collate latin2_czech_cs). Podobne pro celou tabulku (CHARSET=latin2) Na sql prikazy si udelej funkci, ktere predas sql dotaz a parametry a on to zformatuje a provede. Pokud nemas zrovna obarvovas sql prikazu, tak muzes pouzit pekny online nastroj (pridat do zalozek prohlizece) http://www.dpriver.com/pp/sqlformat.htm zvolit: Mysql vlozit: SET NAMES utf8 klik na Format SQL a kdyz to zformatuje a obarvi, pak je prikaz spravne. Pripadne muzes sql prikazy testovat a tvorit primo v phpmyadminu, zalozka SQL. A pak by byl dobry odkaz na stranku, kvuli zkouknuti kodovani, ale ted ti to pise chybu na radku 98, takze toho moc nezjistime. http://grelek.wz.cz/chat/index.php Pripadne se muzes jeste s nekym domluvit, ze mu das heslo a bude ti s tim pomahat primo. Zatim to vypada, ze budes mit spoustu zacatecnickych dotazu :)
-
Tak, už v pohodě ukládám do databáze a přesunul jsem se k vybírání ale, problém nastane ve chvíli kódování při ukládání. Stránka je vytvořená ve Windows-1250, ale když zadám SET NAMES Windows-1250 (nebo cp-1250), vyskočí error že toto nezná ať s tim vyfičím .. Ale, když stránku převedu do kódování UTF-8, nezobrazuje se správně stránka, ale zase se dobře ukládají data do databáze.. zkoušel jsem i UTF-16, ale výsledek byl stejný. Viz. http://grelek.wz.cz/chat/ P.S. Vím, že tam je SQL injection, to mě nijak moc nejde, ale snažím se pochopit regulární výrazy .. :)
-
Na problém, jsem přišel. Databáze nezná kódování CP-1250 nýbrž CP1250 :).
-
Vida, kódování Windows-1250 jsem na webu nikdy nepoužíval, tak mě nenapadlo, že máš ten název špatně. Teprve teď jsem si všiml, že v tomto kódování máš prezentaci. Jde to sice různě kombinovat a překovávat, ale nejlepší je mít to všude stejně. UTF-16 se na web nehodí, UTF-8 je mnohem lepší i kvůli kompatibilitě s ASCII, ale hlavně je úspornější na prostor i přenosovou linku.