PHP XML Export problema
Sziasztok!
Egy kis problémám támadt MySQLből lekért dinamikus adatok XML exportjával, remélem valaki tud tanácsot adni a dologgal kapcsolatban.
Adott egy egyszerű ajaxos felület, ahol egy form segítségével megadott paraméterek alapján lehet kiíratni adatokat egy MySQL adatbázisból.
Az AJAX ezt szépen ki is írja, ez a rész működik.
Az AJAX motor generál egy POST metódusú formot is, amely áll egy darab submit gombból, illetve pár hidden inputból, amit a keresőformból kap.
Tehát ez a rész nagyjából így néz ki:
Az XML generátor szkript is hasonló, és itt jön a probléma.
Gyanítom, hogy a header information kavar be valamit.
Na most amennyiben bent hagyom a kommentelt részt es csak kiiratom az SQL query-t az XML headerek leküldése nélkül, akkor rendesen megvan mind a három paraméter, látszik is ($a1SQL, $a2SQL, $a3SQL).
Ha kiszedem a kommentet, akkor lefut az XML, nagyon szépen ki is teszi Excel táblázatba, DE, az első 200 értékét a MySQL táblának, mert ott már nem is látszanak a POST-on átküldött paraméterek, tehát minden Filter változó *üres*...
Ha jól tudom a header feltétele annyi, hogy kiírás ne legyen előtte, változókat állíthatok be, illetve a mysql query is lefuthatna.
Mégis, mintha a headerek semmissé tennék a POST-olt adatokat, noha sorrendben elvileg a MySQL query fut le először, és az XML tartalma már ott meghatározásra kerül.
Van valakinek bármilyen ötlete ezzel kapcsolatban?
Ha esetleg konkrét kódrészlet kell valamiből, szívesen bemásolom, egyelőre a releváns információt írtam csak be az áttekinthetőség kedvéért. :)
Köszönöm!
■ Egy kis problémám támadt MySQLből lekért dinamikus adatok XML exportjával, remélem valaki tud tanácsot adni a dologgal kapcsolatban.
Adott egy egyszerű ajaxos felület, ahol egy form segítségével megadott paraméterek alapján lehet kiíratni adatokat egy MySQL adatbázisból.
Az AJAX ezt szépen ki is írja, ez a rész működik.
Az AJAX motor generál egy POST metódusú formot is, amely áll egy darab submit gombból, illetve pár hidden inputból, amit a keresőformból kap.
Tehát ez a rész nagyjából így néz ki:
<?php
$a1 = $_POST["a1"];
$a2 = $_POST["a2"];
$a3 = $_POST["a3"];
echo "
<form method=\"post\" action=\"xmlgenerator.php\"target=\"_blank\" style=\"display: inline;\">
<input type=\"hidden\" name=\"va1\" id=\"va1\" value=\"$a1\" />
<input type=\"hidden\" name=\"va2\" id=\"va2\" value=\"$a2\" />
<input type=\"hidden\" name=\"va3\" id=\"va3\" value=\"$a3\" />
<input type=\"submit\" value=\"Export\" />
</form>
";
// Itt jon az SQL es a tablazat generalas
?>
$a1 = $_POST["a1"];
$a2 = $_POST["a2"];
$a3 = $_POST["a3"];
echo "
<form method=\"post\" action=\"xmlgenerator.php\"target=\"_blank\" style=\"display: inline;\">
<input type=\"hidden\" name=\"va1\" id=\"va1\" value=\"$a1\" />
<input type=\"hidden\" name=\"va2\" id=\"va2\" value=\"$a2\" />
<input type=\"hidden\" name=\"va3\" id=\"va3\" value=\"$a3\" />
<input type=\"submit\" value=\"Export\" />
</form>
";
// Itt jon az SQL es a tablazat generalas
?>
Az XML generátor szkript is hasonló, és itt jön a probléma.
Gyanítom, hogy a header information kavar be valamit.
<?php
$a1 = $_POST["va1"];
$a2 = $_POST["va2"];
$a3 = $_POST["va3"];
$DATAsend = "";
$a12 = time();
$datearray=getdate($a12);
$year = $datearray["year"];
$month = $datearray["mon"]; if ($month <= 9) { $month = "0$month"; }
$monthNAME = $datearray["month"];
$day = $datearray["mday"]; if ($day <= 9) { $day = "0$day"; }
$hour = $datearray["hours"]; if ($hour <= 9) { $hour = "0$hour"; }
$min = $datearray["minutes"]; if ($min <= 9) { $min = "0$min"; }
$sec = $datearray["seconds"]; if ($sec <= 9) { $sec = "0$sec"; }
if ($a1 == "") { $a1SQL = ""; } else { $a1SQL = " AND field1 = '$a1' "; }
if ($a2 == "") { $a2SQL = ""; } else { $a2SQL = " AND field2 = '$a2' "; }
if ($a3 == "") { $a3SQL = ""; } else { $a3SQL = " AND field3 = '$a3' "; }
$sqlqry = mysql_query("SELECT * FROM valamitabla WHERE id > 0 $a1SQL $a2SQL $a3SQL LIMIT 200 ");
// COMMENTED: echo "az SQL parameterek"; exit;
$FormXMLcreateDate = "$year-$month-$day"; $FormXMLcreateDate .="T"; $FormXMLcreateDate .= "$hour:$min:$sec"; $FormXMLcreateDate .= "Z";
$FormFILENAMEcreateDate = "$year-$monthNAME-$day";
$FormXMLfilename = "report_abc.xml";
header( "content-type: text/xml" );
header( "Content-Disposition: inline; filename=$FormXMLfilename" );
header( "Content-Disposition: attachment; filename=$FormXMLfilename" );
// ITT JON AZ XML STILUSOK, TABLE, STB LEGENERALASA
?>
$a1 = $_POST["va1"];
$a2 = $_POST["va2"];
$a3 = $_POST["va3"];
$DATAsend = "";
$a12 = time();
$datearray=getdate($a12);
$year = $datearray["year"];
$month = $datearray["mon"]; if ($month <= 9) { $month = "0$month"; }
$monthNAME = $datearray["month"];
$day = $datearray["mday"]; if ($day <= 9) { $day = "0$day"; }
$hour = $datearray["hours"]; if ($hour <= 9) { $hour = "0$hour"; }
$min = $datearray["minutes"]; if ($min <= 9) { $min = "0$min"; }
$sec = $datearray["seconds"]; if ($sec <= 9) { $sec = "0$sec"; }
if ($a1 == "") { $a1SQL = ""; } else { $a1SQL = " AND field1 = '$a1' "; }
if ($a2 == "") { $a2SQL = ""; } else { $a2SQL = " AND field2 = '$a2' "; }
if ($a3 == "") { $a3SQL = ""; } else { $a3SQL = " AND field3 = '$a3' "; }
$sqlqry = mysql_query("SELECT * FROM valamitabla WHERE id > 0 $a1SQL $a2SQL $a3SQL LIMIT 200 ");
// COMMENTED: echo "az SQL parameterek"; exit;
$FormXMLcreateDate = "$year-$month-$day"; $FormXMLcreateDate .="T"; $FormXMLcreateDate .= "$hour:$min:$sec"; $FormXMLcreateDate .= "Z";
$FormFILENAMEcreateDate = "$year-$monthNAME-$day";
$FormXMLfilename = "report_abc.xml";
header( "content-type: text/xml" );
header( "Content-Disposition: inline; filename=$FormXMLfilename" );
header( "Content-Disposition: attachment; filename=$FormXMLfilename" );
// ITT JON AZ XML STILUSOK, TABLE, STB LEGENERALASA
?>
Na most amennyiben bent hagyom a kommentelt részt es csak kiiratom az SQL query-t az XML headerek leküldése nélkül, akkor rendesen megvan mind a három paraméter, látszik is ($a1SQL, $a2SQL, $a3SQL).
Ha kiszedem a kommentet, akkor lefut az XML, nagyon szépen ki is teszi Excel táblázatba, DE, az első 200 értékét a MySQL táblának, mert ott már nem is látszanak a POST-on átküldött paraméterek, tehát minden Filter változó *üres*...
Ha jól tudom a header feltétele annyi, hogy kiírás ne legyen előtte, változókat állíthatok be, illetve a mysql query is lefuthatna.
Mégis, mintha a headerek semmissé tennék a POST-olt adatokat, noha sorrendben elvileg a MySQL query fut le először, és az XML tartalma már ott meghatározásra kerül.
Van valakinek bármilyen ötlete ezzel kapcsolatban?
Ha esetleg konkrét kódrészlet kell valamiből, szívesen bemásolom, egyelőre a releváns információt írtam csak be az áttekinthetőség kedvéért. :)
Köszönöm!
akkor lefut az XML, nagyon
Ebből kerekítenél egy mondatot, mert így nem túlságosan értelmes.
Amit még fontos lehet megtenni, hogy megfelelő karakterkódolással kiküldeni az XMLt, lehet, hogy az kavar be.
POST versus XML
Szituáció A., kikommentelem az egész XML-es részt, és csak kiíratom a lefutó MYSQL query-t a változókkal
itt látszanak a POSTon küldött paraméterek, pl.
Szituáció B., nem kommentelem ki az XML részt, amúgy minden marad ugyanaz, ebben az esetnem az XML dokumentum utolsó sorába írattam ki a lefutott mysql queryt, hogy lássam, mi is történik:
Ez történt. Tehát nem kapott az $a1, $a2, $a3 változó semmilyen értéket, holott ugyanúgy megküldte a form a fenti értékeket (6,valami,25).
Erre mondtam, hogy valami a header-ek meg a POST között nem megy.
Kipróbáltam a karakterkódolásos dolgot, sajnos azzal nem működik.
echo
Valamint itt mezo1, mezo2-t latok, holott az eredeti kiírásban field1, field2 szerepelt.
Ezek után igazán nehéz megmondani, hogy hol lehet a hiba, mert még azt se tudom, hogy hol kell keresni, annyira kusza itt minden.
Tiszta viz
Leegyszerűsítettem egy kicsit a dolgot.
Még az eredeti keresőmotor beteszi egy változóba az adatokat, és azt küldi el az XML export scriptnek.
Tehát a FORM így néz ki:
<input type=\"hidden\" name=\"numberrowsinv\" id=\"numberrowsinv\" value=\"$sorokszama\" />
<textarea name=\"datainv\" id=\"datainv\" rows=\"1\" cols=\"50\">$adatokazXMLbe</textarea> <br />
<input type=\"submit\" value=\"Export\" />
</form>
Itt minden rendben.
Az XML generátor szkriptet lebutítottam, most ennyit kellene csinálnia:
$datainv = @$_POST["datainv"]; // az XML tartalma
$numberrowsinv = @$_POST["numberrowsinv"]; // a sorok szama
$targetedrowNo = $numberrowsinv + 1; // a sorok szama + a fejlec
$a12 = time();
$datearray=getdate($a12);
$year = $datearray["year"];
$month = $datearray["mon"]; if ($month <= 9) { $month = "0$month"; }
$monthNAME = $datearray["month"];
$day = $datearray["mday"]; if ($day <= 9) { $day = "0$day"; }
$hour = $datearray["hours"]; if ($hour <= 9) { $hour = "0$hour"; }
$min = $datearray["minutes"]; if ($min <= 9) { $min = "0$min"; }
$sec = $datearray["seconds"]; if ($sec <= 9) { $sec = "0$sec"; }
$FormXMLcreateDate = "$year-$month-$day"; $FormXMLcreateDate .="T"; $FormXMLcreateDate .= "$hour:$min:$sec"; $FormXMLcreateDate .= "Z";
$FormXMLfilename = "exoirteddata.xml";
header( "content-type: text/xml; charset=utf-8" );
header( "Content-Disposition: inline; filename=$FormXMLfilename" );
header( "Content-Disposition: attachment; filename=$FormXMLfilename" );
print "<?xml version=\"1.0\"?>\n";
print "<?mso-application progid=\"Excel.Sheet\"?>\n";
?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties
xmlns="urn:schemas-microsoft-com:office:office">
<Author>ABC</Author>
<LastAuthor>ABC</LastAuthor>
<Created><?php echo "$FormXMLcreateDate"; ?></Created>
<LastSaved><?php echo "$FormXMLcreateDate"; ?></LastSaved>
<Company>XYZ</Company>
<Version>11.6360</Version>
</DocumentProperties>
<ExcelWorkbook
xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>8535</WindowHeight>
<WindowWidth>12345</WindowWidth>
<WindowTopX>480</WindowTopX>
<WindowTopY>90</WindowTopY>
<TabRatio>860</TabRatio>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s22" ss:Name="Hyperlink">
<Font ss:Color="#0000FF" ss:Underline="Single"/>
</Style>
<Style ss:ID="s21">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
</Borders>
<Font ss:Size="8" ss:Color="#000000"/>
</Style>
<Style ss:ID="s28head">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
</Borders>
<Font ss:Size="10" ss:Color="#FFFFFF" ss:Bold="1"/>
<Interior ss:Color="#000080" ss:Pattern="Solid"/>
</Style>
</Styles>
<Worksheet ss:Name="resultsheet">
<Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="<?php echo "$targetedrowNo"; ?>" x:FullColumns="1"
x:FullRows="1">
<Column ss:AutoFitWidth="0" ss:Width="40"/>
<Column ss:AutoFitWidth="0" ss:Width="80"/>
<Column ss:AutoFitWidth="0" ss:Width="150"/>
<Row>
<Cell ss:StyleID="s28head"><Data ss:Type="String">Mezo1</Data></Cell>
<Cell ss:StyleID="s28head"><Data ss:Type="String">Mezo2</Data></Cell>
<Cell ss:StyleID="s28head"><Data ss:Type="String">Mezo3</Data></Cell>
</Row>
<?php echo "$datainv"; ?>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Layout x:Orientation="Landscape"/>
<Header x:Data="&C&"Arial,Bold"&14&UFY09 - &A&R&"Arial,Bold"Date Printed: &D"/>
<Footer x:Data="&L&F&RPage &P of &N"/>
</PageSetup>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
A probléma ugyanaz. Ha ott vannak a header, etc. információk, akkor a POST data üres, nem kap semmilyen értéket.
Ha kikommentelem a header részt, akkor a datainv és numberrowsinv változók megkapják a küldött értéket.
Tehát nem is SQL gondról van szó, hanem arról, hogy ha XML headereket küldök, akkor a POST-olt adat egyszerűen nem jelenik meg a változókban.
UPDATE
Ez a sor a ludas:
header( "Content-Disposition: attachment; filename=xml_exp.xml" );
Onnantól, hogy attachment, nem kapja meg a POST változókat.
Ha ezt kiszedem, akkor nem ajánlja fel letöltésre az XMLt, csak kiíratja a böngészőbe, viszont akkor benne van minden adat.
ha ezt beleteszem, akkor felkínálja az XML letöltést, de a POSTolt adatokat nem kapja meg a script.
Így ötletek esetleg?
biztos ez?
attachment
Pontosan ez a problémám. Tehát ha kiszedem az attachment content-type-ot, akkor nem ajánl fel letöltést, hanem csak bedobja az adatokat a bögészőablakba. Ebben az esetben rendesen megkapja a MySQL query a változóit (a POST-olt adatokat).
Ha bent van az attachment content-t, akkor felajnálja a letöltést, tesz is az XML file-ba adatokat, de az első X sorát a MySQL táblának, tehát POSTon nem kap paramétert.
Plusz, ellenőrzésként az XML file végére beraktam egy cellát ahol kiprintelte a script a lefutott mySQL queryt, és sajnos ott is ez volt a helyzet: attachmentként alap lekérdezés paraméterek nélkül, ezért csak az első X sor, nem attachmentként pedig rendesen ott van az összes POSTolt paraméter.
UPDATE II
Szóval továbbra is várnék tanácsokat, hogy hogyan lehet a szkriptnek egyszerre POST adatokat adni ÉS kényszeríteni a browsert letöltésre megjelenítés helyett.
A mostani - csúnya - megoldás az, hogy a kereső AJAX nem Form-ba rakja be az adatokat, hanem PHP SESSION változóba.
A SESSION változó értékét felismeri az attachment header után is, így most már működik, de elég nagy junk-ot hagy feleslegesen.
Továbbra is várnám a lehetséges megoldásokat sima POST metódusra ezzel az attachment Content-Disposition-nel.
hali
-cs-
Sanyi
Bongeszok: