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.