Autor | Zpráva | ||
---|---|---|---|
gully Profil |
#1 · Zasláno: 14. 7. 2018, 23:19:35
Ahoj všem,
mám tento soubor pro export do csv: <?php $filename = 'rezervace.csv'; $delimither= ';'; $export_data = unserialize($_POST['export_data']); // vytvoreni souboru $file = fopen($filename,"w"); foreach ($export_data as $line){ fputcsv($file, $line, $delimither); } fclose($file); // download header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=$filename"); header('Content-Type: text/csv; charset=Windows-1250); readfile($filename); // uklid unlink($filename); exit(); a potřeboval bych udělat export dat ve kódování Windows-1250, ale nedaří se mi to. Nevíte někdo, jak na to? |
||
Kajman Profil |
#2 · Zasláno: 15. 7. 2018, 00:06:11
Zkuste iconv, něco jako
fputcsv($file, iconv("UTF8", "CP1250//TRANSLIT//IGNORE", $line), $delimither); |
||
gully Profil |
#3 · Zasláno: 15. 7. 2018, 00:20:17
Tak to je zvláštní, HTTP ERROR 500. Tak tomu nerozumim ...
|
||
Kajman Profil |
#4 · Zasláno: 15. 7. 2018, 00:46:19
V error logu je co?
|
||
gully Profil |
Chyba 500 je už OK, moje chybka. Ale překódování bohužel nefunguje - dostávám prázdný soubor.
|
||
Kajman Profil |
#6 · Zasláno: 15. 7. 2018, 11:48:21
Jestli to $line je pole, tak iconv zkuste před vkládáním zavolat na jeho textové prvky.
|
||
gully Profil |
#7 · Zasláno: 15. 7. 2018, 14:16:46
Ano, $line je pole, proto iconv nefunguje. Muzete mi prosim ukazat, jak?
Už to mám a použil jsem řešení tady z fóra. Kompletní kó je zde: Tak už to funguje, a kdyby to třeba někdo potřeboval, tady je finální kód: <?php error_reporting(E_ALL); ini_set('display_errors', 1); $filename = 'rezervace.csv'; $delimither = ';'; $data = $_POST['export_data']; $export_data = unserialize($data); // vytvoreni souboru $file = fopen($filename,"w"); function iconv_all($z, $do, &$data) { if(is_array($data)) { # pokud je to pole foreach($data as $klic => &$hodnota) { # tak ho projdi po prvcich iconv_all($z, $do, $hodnota); # pro kazdy se zavolej rekurzivne } } else if(is_string($data)) { # pokud je to retezec $data = iconv($z, $do, $data); # tak ho roznou prekonvertuj } } iconv_all('UTF-8', 'CP1250', $export_data); foreach ($export_data as $line){ fputcsv($file, $line, $delimither); } fclose($file); // download header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=$filename"); header('Content-Type: text/csv; charset=utf-8'); readfile($filename); // uklid unlink($filename); exit(); Děkuju za pomoc a přeji hezký den. |
||
Keeehi Profil |
K aplikaci funkce na všechny prvky pole slouží funkce array_map. A než to vytváření souborů na disku a jejich následné mazání (problém s atomicitou) je lepší vytvořit dočasný soubor v paměti.
A dělat unserialize z HTTP požadavku je obrovská bezpečnostní díra. Takže data přenášej v jiném formátu (třeba json, v kódu už je to tak upraveno) nebo pokud máš ty data pro export v databázi, tak si pošli jen IDčka a zbytek si vytáhni až v samotném scriptu pro export. Navíc v takovém případě by mělo být snad možné nastavit kódování pro komunikaci s databází na windows-1250, takže by data měla dorazit v tomto kódování a nebylo by potřeba je konvertovat. <?php error_reporting(E_ALL); ini_set('display_errors', 1); $filename = 'rezervace.csv'; $delimither = ';'; $data = $_POST['export_data']; $export_data = json_decode($data); // vytvoreni souboru v pameti $file = fopen('php://temp', 'r+'); foreach ($export_data as $line){ fputcsv($file, array_map(function($v) { return iconv("UTF8", "CP1250//TRANSLIT//IGNORE", $v); }, $line), $delimither); } // download header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=$filename"); header('Content-Type: text/csv; charset=utf-8'); rewind($file); echo stream_get_contents($file); fclose($file); |
||
gully Profil |
Zkusil jsem to řešení, ale tam jsou nějaké problémy:
Warning: rewind(): supplied resource is not a valid stream resource on line 26. Warning: stream_get_contents(): supplied resource is not a valid stream resource on line 27. A dostávám prázdný soubor. |
||
Keeehi Profil |
gully:
funkci fclose jsem zapomněl v kódu moc vysoko. V příspěvku jsem to upravil. Jelikož je tam ale změněná i funkce pro dekódování, tak to hned fungovat nebude. Můžeš tam pro otestování vrátit unserialize, ale pak to hned pořádně předělej. |
||
gully Profil |
Bohužel ani teď ne:
Warning: Invalid argument supplied for foreach() on line 13 EDIT: Jasně, zkusím opravit Toto už funguje: <?php error_reporting(E_ALL); ini_set('display_errors', 1); $filename = 'rezervace.csv'; $delimither = ';'; $data = $_POST['export_data']; $export_data = unserialize($data); // vytvoreni souboru v pameti $file = fopen('php://temp', 'r+'); function iconv_all($z, $do, &$data) { if(is_array($data)) { # pokud je to pole foreach($data as $klic => &$hodnota) { # tak ho projdi po prvcich iconv_all($z, $do, $hodnota); # pro kazdy se zavolej rekurzivne } } else if(is_string($data)) { # pokud je to retezec $data = iconv($z, $do, $data); # tak ho roznou prekonvertuj } } iconv_all('UTF-8', 'CP1250', $export_data); foreach ($export_data as $line){ fputcsv($file, $line, $delimither); } // download header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=$filename"); header('Content-Type: text/csv; charset=windows-1250'); rewind($file); echo stream_get_contents($file); fclose($file); Díky. |
||
Časová prodleva: 6 let
|
0