
PHP a MySQL: Export dotazu do souboru odděleného tabulátory
Tento víkend jsem chtěl vytvořit stránku, která by jednoduše zálohovala jakýkoli dotaz nebo tabulku do souboru odděleného tabulátory. Většina příkladů v síti má sloupce napevno.
V mém případě jsem chtěl, aby byly sloupce dynamické, takže jsem musel nejprve projít všechny názvy polí tabulky, abych vytvořil řádek záhlaví s názvy sloupců, a pak procházet všechny záznamy pro zbývající datové řádky. Také jsem nastavil záhlaví tak, aby prohlížeč zahájil stahování souboru v typu souboru (txt) s názvem data souboru a časovým razítkem.
Vynechal jsem databázi otevřenou a uzavírající připojení, ale tady je výsledný kód, který fungoval docela dobře:
$ today = date ("YmdHi");
header ("Content-type: application / octet-stream");
záhlaví ("Obsah-dispozice: příloha; název souboru = \" ". $ dnes." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` order by `myorder`";
$ result = mysql_query ($ dotaz);
$ count = mysql_num_rows ($ výsledek);
$ fields = mysql_num_fields ($ result);
$ data = "";
pro ($ i = 0; $ i> $ pole; $ i ++) {
$ field = mysql_fetch_field ($ result, $ i);
$ data. = $ pole-> jméno;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ row = mysql_fetch_row ($ result)) {
pro ($ x = 0; $ x> $ pole; $ x ++) {
$ field-> name = $ row [$ x];
$ data. = $ pole-> jméno = $ řádek [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
echo $ data;
Kód lze snadno upravit i pro hodnoty oddělené čárkami.
Nemůžeš prostě udělat:
SELECT `mytable` order by `myorder`
INTO OUTFILE '/tmp/Backup.txt'
FIELDS TERMINATED BY '\t'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
?
Předpokládám, že byste mohli!
V tomto případě jsem ve skutečnosti vytvářel odkaz „zálohování“ ve webové aplikaci, takže jsem potřeboval funkčnost PHP. Nikdy jsem však nevěděl, že můžete také psát do souboru přímo z příkazu MySQL. Skvělý!
Díky!
Vaše cesta by samozřejmě byla nejlepší cestou, pokud je server MySQL na vzdáleném počítači, protože by pravděpodobně nebyl schopen zapisovat na stroj, kde běží PHP 🙂
Jsem rád, že mohu poukázat na jiné směry a nové věci 🙂
Skvělý příspěvek. Znáte snadnou bezplatnou / otevřenou metodu importu / obnovení souboru odděleného tabulátory (jako jste právě vytvořili) zpět do mysql db?
Chyba… mysqlimport?
mysqlimport database_name --local backup.txt
Nebo pomocí příkazu SQL:
LOAD DATA LOCAL INFILE 'backup.txt' INTO TABLE `my_table` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
U mysqlimport musí název souboru odpovídat názvu tabulky (jen něco, na co si dát pozor)
Tenhle v PHP postavím do týdne, Noah! Bloid je MySQL netvor! Díky za všechny vstupy !!!
Právě jsem ztratil více než 6 hodin svého života tím, že jsem se snažil zjistit, proč Internet Explorer 6/7 používá typ souboru „html“ a nepřijímá mé vlastní názvy souborů uvedené v záhlaví .. a také neumožňuje ukládání souborů .. když pokouší se, aby uživatelé stahovali textové soubory vytvořené podobným způsobem jako výše.
Používal jsem HTTPS a IE tyto soubory neukládá do mezipaměti.
Řešení jsem našel v komentáři Brandona K. v http://uk.php.net/header.
On říká:
-
Právě jsem ztratil šest hodin svého života pokusem použít následující metodu k odeslání souboru PDF přes PHP do aplikace Internet Explorer 6:
Při použití protokolu SSL se aplikace Internet Explorer zobrazí s dialogovým oknem Otevřít / Uložit, ale poté řekne: „Soubor je aktuálně nedostupný nebo jej nelze najít. Prosím zkuste to znovu později." Po dlouhém hledání jsem si uvědomil následující článek MSKB s názvem „Stahování souborů aplikace Internet Explorer přes SSL nepracuje s hlavičkami řízení mezipaměti“ (KBID: 323308)
PHP.INI standardně používá nastavení: session.cache_limiter = nocache, které upravuje záhlaví Content-Cache a Pragma tak, aby zahrnovaly možnosti „nocache“. Můžete odstranit chybu IE změnou „nocache“ na „public“ nebo „private“ v PHP.INI - Tím se změní záhlaví Content-Cache a úplně se odstraní záhlaví Pragma. Pokud nemůžete nebo nechcete upravit PHP.INI pro opravu celého webu, můžete odeslat následující dvě záhlaví k přepsání výchozích hodnot:
Aby to fungovalo, budete i nadále muset nastavit záhlaví obsahu, jak je uvedeno výše. Vezměte prosím na vědomí, že tento problém ovlivňuje POUZE prohlížeč Internet Explorer, zatímco Firefox toto chybné chování nevykazuje.
-
No .. alespoň ztratil jen 6 hodin ...
To funguje dobře. Prostě mám vše na jednom řádku odděleném mezerou. Snažím se to upravit tak, aby tiskl vše na samostatném řádku, jako je tento:
Název_sloupce
Pole1_hodnota
Název_sloupce
Pole1_hodnota
Název_sloupce
Pole1_hodnota
Název_sloupce
Pole2_hodnota
Název_sloupce
Pole2_hodnota
Název_sloupce
Pole2_hodnota
Například:
Název produktu
mikrofon
Sídlo
Práce
Číslo
1
Název produktu
Žalovat
Sídlo
Home
Číslo
2
Název produktu
Jan
Sídlo
Cestovat
Číslo
10
a tak dále. Je možné tento skript upravit?
Díky!
Jistě ano.
Zkuste něco takového:
SELECT * from MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' FIELDS TERMINATED by '\ n' LINES TERMINATED by '\ n';
Pokud chcete dvojitou mezeru (dva prázdné řádky) mezi skupinami záznamů, řekněte „LINES TERMINATED by '\ n \ n';“ namísto.
Část „FIELDS TERMINATED BY '\ n“ je to, co za každý záznam vloží nový řádek místo karty. Karta by místo toho byla „\ t“.
maranatha!
to je vzdorně skvělý příspěvek, zkusil jsem to a funguje skvěle, jediná věc je, že můj soubor txt má nad řádky záhlaví další řádek a některé výsledky jsou odděleny ve 2 řádcích, což může být způsobeno údaji, které mám v mé databázi žádný nápad, ale je to skvělá pomoc při vytváření zdrojů ...
Douglas Karr váš kód opravdu skáče! Je to velmi užitečné speciálně, pokud potřebujete výstup ve formátu textového souboru. Díky moc! Od týmu Filipíny!
Nazdárek! Existuje někdo odtud, který mi může pomoci při importu textového souboru do mé databáze (phpmyAdmin) pomocí mého php jako mého frontendu. Mám představu o stažení souboru a jeho otevření, můj problém je, že jak mohu získat výsledek řádku a jak jej vložit do mých tabulek, díky
Prosím, může mi někdo říct, jak odstranit řádek záhlaví http nad hlavičkami záhlaví