
PHP en MySQL: voer 'n navraag uit na 'n tabbladafgebakende lêer
Hierdie naweek wou ek 'n bladsy saamstel wat enige navraag of tabel in 'n Tab-begrensde lêer sou rugsteun. Die meeste voorbeelde op die internet het die kolomme hard gekodeer.
In my geval wou ek hê dat die kolomme dinamies moes wees, dus moes ek eers al die tabelveldname deurblaai om die kopreeks met kolomname op te bou en dan al die rekords vir die oorblywende datarye deur te loop. Ek het ook die opskrif so ingestel dat die blaaier die aflaai van die lêer in die filetype (txt) sal begin met die naam van die lêer se datum en die tydstempel.
Ek het die databasis oop- en sluitverbinding weggelaat, maar hier is die gevolglike kode wat redelik goed gewerk het:
$ vandag = datum ("YmdHi");
kop ("Content-type: application / octet-stream");
kop ("Content-Disposition: attachment; filename = \" ". $ vandag." _ Backup.txt \ "");
$ query = "SELECT * VANAF 'mytable` volgorde per' myorder '';
$ resultaat = mysql_query ($ navraag);
$ count = mysql_num_rows ($ resultaat);
$ velde = mysql_num_fields ($ resultaat);
$ data = "";
vir ($ i = 0; $ i> $ velde; $ i ++) {
$ veld = mysql_fetch_field ($ resultaat, $ i);
$ data. = $ veld-> naam;
$ data. = "\ t";
}
$ data. = "\ n";
terwyl ($ ry = mysql_fetch_row ($ resultaat)) {
vir ($ x = 0; $ x> $ velde; $ x ++) {
$ veld-> naam = $ ry [$ x];
$ data. = $ veld-> naam = $ ry [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
eggo $ data;
Die kode kan ook maklik aangepas word vir kommaskeide waardes.
Kan jy nie maar doen nie:
SELECT `mytable` order by `myorder`
INTO OUTFILE '/tmp/Backup.txt'
FIELDS TERMINATED BY '\t'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
?
Ek veronderstel jy kon!
In hierdie geval was ek eintlik besig om 'n 'rugsteun'-skakel in 'n webtoepassing te bou, so die PHP-funksionaliteit is wat ek nodig gehad het. Ek het egter nooit geweet jy kan ook direk vanaf die MySQL-stelling na 'n lêer skryf nie. Baie koel!
Dankie!
Jou manier sal natuurlik die beste manier wees as die MySQL-bediener op 'n afgeleë masjien is, aangesien dit waarskynlik nie op die masjien sal kan skryf waar PHP loop nie 🙂
Bly om egter ander rigtings en nuwe dinge uit te wys 🙂
Puik pos. Weet jy van 'n maklike, gratis/oopbron-metode om 'n tab-geskeide lêer (soos wat jy pas geskep het) terug in die mysql db in te voer/herstel?
Errr... mysqlimport?
mysqlimport database_name --local backup.txt
Of met die SQL-opdrag:
LOAD DATA LOCAL INFILE 'backup.txt' INTO TABLE `my_table` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
Met mysqlimport moet die lêernaam ooreenstem met die tabelnaam (net iets om voor op te let)
Ek sal binne die week daardie een in PHP bou, Noah! Bloid is 'n MySQL-monster! Dankie vir al die insette!!!
Ek het sopas meer as 6 ure van my lewe verloor deur te probeer uitwerk hoekom Internet Explorer 6/7 lêertipe 'html' toegepas het en nie my persoonlike lêername wat in die opskrifte gespesifiseer is, aanvaar nie.. en ook nie toelaat dat lêers gestoor word nie.. wanneer probeer om gebruikers tekslêers te laat aflaai wat op soortgelyke wyse as hierbo geskep is.
Ek het HTTPS gebruik en IE kas nie hierdie lêers nie.
Ek het die oplossing gevind op 'n opmerking deur Brandon K by http://uk.php.net/header.
Hy sê:
-
Ek het sopas ses ure van my lewe verloor deur die volgende metode te gebruik om 'n PDF-lêer via PHP na Internet Explorer 6 te stuur:
Wanneer SSL gebruik word, sal Internet Explorer vra met die Open / Stoor dialoog, maar dan sê "Die lêer is tans nie beskikbaar of kan nie gevind word nie. Probeer asseblief weer later." Na baie soektog het ek bewus geword van die volgende MSKB-artikel getiteld "Internet Explorer-lêeraflaaie oor SSL werk nie met die kasbeheeropskrifte nie" (KBID: 323308)
PHP.INI gebruik by verstek 'n instelling: session.cache_limiter = nocache wat Content-Cache en Pragma-opskrifte verander om "nocache"-opsies in te sluit. U kan die IE-fout uitskakel deur "nocache" na "publiek" of "privaat" in PHP.INI te verander - Dit sal die inhoud-kas-kopskrif verander asook die Pragma-opskrif heeltemal verwyder. As jy nie PHP.INI vir 'n werfwye regstelling kan of wil verander nie, kan jy die volgende twee kopskrifte stuur om verstekverstellings te oorskryf:
Jy sal steeds die inhoudsopskrifte moet stel soos hierbo gelys om dit te laat werk. Neem asseblief kennis dat hierdie probleem SLEGS Internet Explorer beïnvloed, terwyl Firefox nie hierdie gebrekkige gedrag toon nie.
-
Wel .. ten minste het hy net 6 ure verloor ...
Dit werk goed. Ek kry egter net alles op een lyn geskei deur 'n spasie. Ek probeer dit verander om alles op 'n aparte reël soos hierdie te druk:
Kolom1_naam
Veld1_waarde
Kolom2_naam
Veld1_waarde
Kolom3_naam
Veld1_waarde
Kolom1_naam
Veld2_waarde
Kolom2_naam
Veld2_waarde
Kolom3_naam
Veld2_waarde
Byvoorbeeld:
Naam
Mike
plek
Werk
Nommer
1
Naam
Sue
plek
Tuis
Nommer
2
Naam
John
plek
Reis
Nommer
10
en so aan. Kan hierdie skrif gewysig word om dit te doen?
Dankie!
Seker kan.
Probeer so iets:
KIES * van MyTafelnaam IN UITLEÊER 'MyTabelNaam_MySQL-TAB-DELIMITED-29JUN08.txt' VELDE GEËINDIG DEUR '\n' LYNE BEËINDIG DEUR '\n';
As jy 'n dubbelspasie (twee leë reëls) tussen rekordgroepe wil hê, sê net "LYNE BEËINDIG DEUR '\n\n';" in plaas daarvan.
Die "VELDE BEËINDIG DEUR '\n'" gedeelte is wat 'n nuwe reël na elke rekord plaas, in plaas van 'n oortjie. 'n Oortjie sal eerder '\t' wees.
maranatha!
dit is beslis 'n wonderlike plasing, ek het dit probeer en werk uitstekend, die enigste ding is dat my txt-lêer 'n ekstra ry bokant die koptitels het, en sommige resultate is in 2 rye geskei, dit kan veroorsaak word deur die data wat ek het in my databasis geen idee nie, maar dit is 'n groot hulp om feeds te bou ...
Douglas Karr jou kode skud regtig! Dit is veral baie nuttig as jy net 'n uitvoer nodig het wat in tekslêerformaat is. Baie dankie! Van span Filippyne!
haai daar! Is daar iemand van hier af wat my 'n wenk kan gee oor die invoer van 'n tekslêer na my databasis (phpmyAdmin) deur my php as my voorkant te gebruik. Ek het 'n idee om 'n lêer af te laai en dit oop te maak, my probleem is hoe ek die ryresultaat kan kry en hoe om dit in my tabelle in te voeg, dankie
Kan iemand my asseblief vertel hoe om die http-opskrif-ry bokant die koptitels te verwyder