Vytáhneme data ... a co dál? MySQL, PHP a export.
17.9.2004 15:00 | Petr Zajíc | přečteno 38124×
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.
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:
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.
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");
?>
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.