Autor Zpráva
gully
Profil
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
Zkuste iconv, něco jako
fputcsv($file, iconv("UTF8", "CP1250//TRANSLIT//IGNORE", $line), $delimither);
gully
Profil
Tak to je zvláštní, HTTP ERROR 500. Tak tomu nerozumim ...
Kajman
Profil
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
Jestli to $line je pole, tak iconv zkuste před vkládáním zavolat na jeho textové prvky.
gully
Profil
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.

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: