LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (47) - Exportujeme data

Vytáhneme data ... a co dál? MySQL, PHP a export.

17.9.2004 15:00 | Petr Zajíc | Články autora | přečteno 32766×

Komerční sdělení: Pořádáme Kurzy PHP

V předchozím díle jsme rozebírali možnosti importu dat do MySQL databáze. Dnes se podíváme na opačnou úlohu - jak data z MySQL pomocí PHP exportovat.

SELECT ... INTO OUTFILE

Minule jsme rozebírali příkaz LOAD DATA INFILE. Jeho opakem je rozšíření příkazu SELECT o klauzuli INTO OUTFILE. Jak asi tušíte, má to za následek, že data se z databáze nevrátí ve formě sady záznamů, ale jako soubor. Mohlo by se zdát, že následující kus kódu všechny problémy s exportem dat z MySQL vyřeší:

<?
  
// zde je include souboru s konstantami
  
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
  
mysql_select_db(SQL_DBNAME);
  
$soubor=$_SERVER["DOCUMENT_ROOT"]."/data.txt";
  
mysql_unbuffered_query ("SELECT * FROM psc WHERE psc=47001 INTO OUTFILE '".$soubor."'");    
?>

Bohužel to má některá vážná úskalí. Jedná se zejména o to, že:

  • SELECT ... INTO OUTFILE se nikdy nepokusí odstranit existující soubor. Museli bychom to provést ručně před započetím exportu.
  • Tento příkaz vytváří soubor na stroji, na němž běží MySQL. Pokud PHP běží jinde než MySQL, je nám to k celkem k ničemu. Málokdy totiž v takovém případě budeme mít ke vzdálenému stroji přístup.
  • Na provedení tohoto příkazu musíte mít na serveru MySQL dostatečná práva - to asi nebude vždy.
  • Konečně, vzniklý soubor je přístupný pro zápis všem uživatelským účtům na serveru, na němž MySQL běží.

"Ruční" způsob

Naštěstí je řešení výše uvedených problémů poměrně jednoduché. Nic nám nebrání vytvořit si sadu záznamů, procházet ji a cílový soubor si sestavit takový, jaký chceme (a tam, kde to chceme). Náš příklad bychom za tímto účelem mohli poupravit následovně:

<?
  
// zde je include souboru s konstantami
  
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
  
mysql_select_db(SQL_DBNAME);
  
$vysledek = mysql_query ("SELECT * FROM psc WHERE psc=47001");
  while (
$zaznam=MySQL_Fetch_Array($vysledek)):
    
$obsah .= $zaznam["obec"];
    
$obsah .= "\t";
    
$obsah .= $zaznam["psc"];
    
$obsah .= "\n";    
  endwhile;
  
$soubor=fopen("data.txt", "w");
  
fwrite($soubor,$obsah);
  
fclose($soubor);
?>

Všimněte si, že tohle už nám dává trochu větší svobodu. Můžeme si určit oddělovač polí (třeba tabelátor), oddělovač řádků a můžeme soubor zapsat na libovolné místo. Nevýhodou je, že to je citelně pomalejší než SELECT ... INTO OUTFILE.

Výstupní formáty

Nikdo samozřejmě netvrdí, že jedinou možností výstupu dat z MySQL pomocí PHP jsou textové soubory. Můžeme exportovat prakticky do libovolného otevřeného formátu, protože PHP umí data zapisovat textově i binárně. Většinou už dokonce existují připravené nástroje, které můžeme použít. Tak například na internetu existuje celá řada návodů na přímý export z MySQL do XML. Můžete si je přizpůsobit, nebo můžete napsat sami něco v tomto duchu:

<?
  
// zde je include souboru s konstantami
  
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
  
mysql_select_db(SQL_DBNAME);
  
$vysledek = mysql_query ("SELECT * FROM psc WHERE psc=47001");
  
header("Content-Type: text/xml");
  echo(
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
  echo(
"<obce>\n");
  while (
$row = mysql_fetch_assoc ($vysledek))
  {
    echo (
"\t<obec>\n");
    echo (
"\t\t<psc>\n");
    echo
"\t\t\t".$row["psc"]."\n";
    echo (
"\t\t</psc>\n");
    echo (
"\t\t<nazev>\n");
    echo
"\t\t\t".$row["obec"]."\n";
    echo (
"\t\t</nazev>\n");
    echo (
"\t</obec>\n");
  }
  echo(
"</obce>\n");
?>

Spustit skript

Pokud nevíte, co je to XML, nemusíte se děsit. Ještě o něm bude v našem seriálu řeč.

Pozn.: Pokud naopak víte co je XML, rovněž se nemusíte děsit. Takhle se v PHP s XML opravdu nepracuje, ale chtěl jsem, aby to bylo názorné.

Možnosti PHP tímto nekončí. Používám s úspěchem například třídu pro přímou tvorbu souborů xls. Rovněž je možné vytvářet dokumenty v mnoha dalších formátech. Těším se, že někdo napíše PHP program pro generování sešitu Open Office (tedy formát sxw), zatím jsem nic použitelného nenašel. Kdybyste s tím měli zkušenosti, můžete se o ně s námi podělit v diskusi.

Verze pro tisk

pridej.cz

 

DISKUZE

PHP DocWriter 18.9.2004 11:55 Ján Sokoly
L Re: PHP DocWriter 18.9.2004 12:01 Petr Zajíc
Problem s exportem 25.10.2006 11:19 Petr.S
  L Re: Problem s exportem 25.10.2006 15:50 Petr Zajíc




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

9.4.2016 9:43 / jiwopene@gmail.com
Re: problém s dpkg a nemožností instalovat

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze