ugrás a tartalomhoz

PHP XML Export problema

sunder · 2009. Feb. 25. (Sze), 04.15
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:

<?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


?>


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

?>


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!
 
1

akkor lefut az XML, nagyon

Poetro · 2009. Feb. 25. (Sze), 11.14
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


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.
header("Content-type: text/xml; charset=utf-8");
2

POST versus XML

sunder · 2009. Feb. 25. (Sze), 13.47
Szóval,az XML generálás nem dob hibát, és a generált XML is olvasható, de az előtte lefutó SQL query-ből hiányzoznak a paraméterek.

Szituáció A., kikommentelem az egész XML-es részt, és csak kiíratom a lefutó MYSQL query-t a változókkal
echo "SELECT * FROM tabla WHERE rid > 0 $a1SQL a2SQL a3SQL ";

itt látszanak a POSTon küldött paraméterek, pl.
SELECT * FROM tabla WHERE rid > 0 AND mezo1 = '6' AND mezo2 = 'valami' AND mezo3 = '25'


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:
echo "SELECT * FROM tabla WHERE rid > 0  ";


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.
3

echo

Poetro · 2009. Feb. 25. (Sze), 13.52
Namármost az sem tiszta, hogy mit írsz ki, és milyen paraméterek hova kerültek.
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.
4

Tiszta viz

sunder · 2009. Feb. 25. (Sze), 14.24
Próbálok akkor tisztább lenni.

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:

<form method=\"post\" action=\"xml_generator.php\" target=\"_blank\" style=\"display: inline;\">
<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:
<?php

$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="&amp;C&amp;&quot;Arial,Bold&quot;&amp;14&amp;UFY09 - &amp;A&amp;R&amp;&quot;Arial,Bold&quot;Date Printed: &amp;D"/>
    <Footer x:Data="&amp;L&amp;F&amp;RPage &amp;P of &amp;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.
5

UPDATE

sunder · 2009. Feb. 25. (Sze), 14.57
Megvan, hogy mi okozza a problémát, de sajnos megoldás még nincs.

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?
7

biztos ez?

gex · 2009. Feb. 25. (Sze), 17.30
Onnantól, hogy attachment, nem kapja meg a POST változókat.
egyrészt ezt nem nagyon hiszem el, de mindjárt kipróbálom. másrészt meg ha ez így is működne, te a scripted elején a $_POST tömbben lévő értékeket kimásolod globális változókba, és utána azzal dolgozol. azok is eltűnnének?
10

attachment

sunder · 2009. Már. 9. (H), 12.43
Ezt nem próbáltam, bár az eset furcsasága az, hogy így is működnie kellene.

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.
6

UPDATE II

sunder · 2009. Feb. 25. (Sze), 15.44
Tisztelettel jelentem, megvan egyféle megoldás, de nem a legszebb...
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.
8

hali

carstepPCE · 2009. Feb. 25. (Sze), 17.58
Milyen bongeszokben tesztelted az esetet?

-cs-
Sanyi
9

Bongeszok:

sunder · 2009. Már. 9. (H), 12.39
IE7-ben, FF2 es 3-ban.