Prodej projektu Duchod.cz - SLEVA
Zobrazují se odpovědi 1 až 12 z 12

Stažení CSV v php

  1. Zdravím, po kliknutí na odkaz chci stáhnout csv soubor. Problém je však v tom, že ve staženém souboru nemám údaje které jsou v proměnné filename. Namísto toho stažený soubor obsahuje html kód aktuální stránky. Mohl by mi někdo poradit.Děkuji
    Kód:
      
    <?
    $filename = "../tmp_export/".$role."-".Friendly_url(ZjistiStudenta(SQLinjetion($role)))."-".$idTestu.".csv";
    	header('Content-type: application/ms-excel');
      header('Content-Transfer-Encoding: binary');
      header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
      header("Content-Description: File Transfer");
      header("Content-Type: application/force-download");
      header("Content-Type: application/octet-stream");
      header("Content-Type: application/download");
      header('Content-Disposition: attachment; filename="'.basename($filename).'"');
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma: public');
      header('Content-Length: ' . filesize($filename));
    
      echo readfile($filename);
      
      exit;
    ?>

  2. Co se právě děje na Webtrhu?
    Gab poptává: Napojení eshopu na printful
    MADOLO IT poptává: PHP Programátor i externě
    Eddie_cz nabízí: Levné VPS - cena od 40- Kč
  3. Žeby
    Kód:
    file_get_content("csv.csv");
    ? :D

  4. můžeš ten kód stránky ukázat, chyba bude pravděpodobně v tvorbě odkazu, nikoliv tady.

    pár typů:
    - Content-Type tam máš 4x, stačí ale pouze jednou, nechal bych tam pouze ten octet-stream, to zajistí dialog pro uložení souboru na disk
    - Cache-Control tam máš také 2x
    - $role a $idTestu dáváš do cesty, ale neošetřuješ, může obsahovat řadu nevhodných věcí, jako třeba další .., či null byte string atd.
    - začínej php kód pomocí <?php, nikoliv pouze <?, což je stará a již nedoporučovaná zkrácenina
    - před <? máš prázdný řádek, může to dělat problém ve výsledném csv, zkontroluj, jestli to máš v pořádu u sebe (mohl jsi to jen špatně nakopírovat sem)

    ---------- Příspěvek doplněn 06.05.2016 v 11:58 ----------

    jbezdicek: v tom chyba není, mrkni do dokumentace, readfile je standardní funkce a to má správně. Jen drobnost, u file_get_content() je nutné také zapsat echo, tvůj typ může pro nezkušeného vypadat zmatečně.

  5. Tady to je. To vygenerování CSV proběhne v pořádku a CSV soubor obsahuje požadovaná data. Problém nastává při tom stažení toho souboru. Proměnné do file name vstupují z databáze a navíc se jedná o ID, které mají v databázi hodnotu auto_increment.
    Kód:
    <?
    function TiskCSV($obsah,$role,$idTestu){
      include "../assets/simplehtmldom/simple_html_dom.php";
      $filename = "../tmp_export/".$role."-".Friendly_url(ZjistiStudenta(SQLinjetion($role)))."-".$idTestu.".csv";
      $html = str_get_html($obsah);
    	$fp = fopen($filename, "w");
    	$th = array();
    	$th[0] = iconv("utf-8","windows-1250","Název");
    	$th[1] = iconv("utf-8","windows-1250",trim("Překlad"));
    	
    	fputcsv($fp,$th,';');
    	fseek($fp, 13);
    	foreach($html->find('tr') as $element)
    	{
    		$td = array();
    		foreach($element->find('td') as $row)  
    		{
    			$td[]=iconv("utf-8", "windows-1250",(trim($row->plaintext)));
    		}
    		fputcsv($fp,$td,';');
    	}
      fclose($fp);
      StazeniCSV($filename);
    }
    
    function StazeniCSV($filename){
      header('Content-type: application/ms-excel');
      header('Content-Transfer-Encoding: binary');
      header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
      header("Content-Description: File Transfer");
      header("Content-Type: application/octet-stream");
      header('Content-Disposition: attachment; filename="'.basename($filename).'"');
      header('Expires: 0');
      header('Pragma: public');
      header('Content-Length: ' . filesize($filename));
    
      echo readfile($filename);
      exit;  
    }
    ?>

  6. a můžeš ukázat jak vypadá ta stránka, kterou zobrazí prohlížeč, jak vypadá ten odkaz pro stažení csv a případně kód v té stránce? Sám píšeš, že to csv generuje v pořádku, v tom totiž nejspíš chyba nebude a ani se tenhle kód nenačte a prohlížeč z nějakého důvodu zobrazí něco jiného, rád bych viděl co, bez toho se dá složitě radit :).

    Také by bylo vhodné ukázat celý kód, dáváš sem fragmenty, v kterých pravděpodobně chyba není. V tom druhé příkladu třeba chybí volání funkce TiskCSV()...

  7. tady je ta stránka http://codepad.org/ZbNuWDKb do toho CSV by se měla dostat jen proměnná $obsah

  8. jasně, teď začátek je špatně, ten řádek s meta totiž způsobí, že se odešlou hlavičky a prohlížeč dostane informaci, že má zobrazit html obsah.

    Kód je hodně nepřehledný a špatný, ale to asi víš :). Nechce se mi ho celý luštit a číst. Proč tam ten $obsah vykresluješ při tisku?

    Osobně bych asi nejprve zkusil upravit ten začátek a CSV/PDF dal před vše ostatní:

    Kód:
    <?
    $Tisk = ($_GET['print'] == 1) ? TRUE : FALSE;
    if(!isset($_GET['page']) && $Tisk){
    	session_start();	
    	include '../nastaveni/Databaze.php';
    	include '../nastaveni/SpolecneFunkce.php';
    	require '../nastaveni/KontrolaPristupu.php';
    }
    
    if($Tisk && isset($_GET['typ'])){
    	$jazyk = ZjistiPreklad($_SESSION['Uzivatel']['JazykID']);
    	if($_GET['typ']=='PDF'){
    		TiskPDF($obsah, $_SESSION['Uzivatel']['ID'], 'vlastni-slovicka-'.$jazyk[0]);
    	}
    	elseif($_GET['typ']=='CSV'){
    		TiskCSV($obsah, $_SESSION['Uzivatel']['ID'], 'vlastni-slovicka-'.$jazyk[0]);
    	}
    }
    ?>
    <meta charset="UTF-8">
    Tohle by mělo zajistit, že když stránka dostane parametr print=1 a typ=csv|pdf, spustí tvůj kód na export, který zároveň volá exit a ukončí zpracování dalších příkazů, takže to meta se již nepošle. Hlavně to musí být na začátku kvůli odeslaným hlavičkám, kdybys měl zapnuté php warningy, napsalo by ti to, že headers already sent...

  9. Diky moc vyzkousim, ten kod pracuje tak ze nejdrive vybere cizi slovicko a nasledne se pak k tomu slovicku vyberou ceske preklady a tuto kombinaci pak vypisuji..zatim me nenapadla nejaka myslenka jak ten php balast zefektivnit..mas nejaky tip? Rad se priucim

  10. kup si knížku o programování a nauč se programovat, to je nejlepší tip :). Obecně je potřeba co nejvíce oddělit html od kódu, tj. neprve si dopředu připravit data do nějakých proměnných a poté je pouze dosadit do html kódu, klidně v jedném souboru, jak to máš.

    Zapni si error_reporting a oprav všechny warningy, které ti to vypíše, ověř dopředu vstupní data než je použiješ, tím se vyhneš budoucím problémům a chybám či neočekávanému chování.

    Kombinace českých a anglických slov je hodně nepřehledná, je dobré se držet jednoho jazyku a v programování to bývá v drtivé většině angličtina.

    Snaž se kód rozdělovat do funkcí tak, aby ti stačilo na šířku cca 120 znaků, ty dlouhé nudle do boku akorát zhoršují přehlednost a snáž uděláš chyby.

  11. Diky , vim ze idealni je pouzivat mvc, to je podle me cesta spravnym smerem, snad k tomu casem prejdu

  12. mvc není vždy ideální a jediná možná cesta, třeba v tomhle případě by mi to připadalo zbytečně složité, máš jednu stránku v jednom soubor, stačí jen lépe oddělit logiku a může to být ok.

  13. Pardon, dal jsem sem omylem příspěvek, prosím o smazání, jeli-to možné.
    Naposledy upravil gully : 15.07.2018 v 14:14

Hostujeme u Server powered by TELE3