ugrás a tartalomhoz

MySQL > Excel export PHP - POST Adatok eltűnnek

sunder · 2008. Feb. 25. (H), 10.38
Üdvözlet!

Elsőre talán furcsának tűnhet a probléma, de én már lerágtam mind a harminchat körmömet.

Egy eszközökre kereső script resultjait kellene lementenem Excel táblába.
Adott erre egy form (POST), ami tárolja és elküldi a kereséssel megegyező adatokat az Excel export script-nek.

No most, szépen $_POST-al megérkeznek az adatok.
Lefut ugyanaz a search mint az eredeti oldalon, példa

$limit2 = $_POST["limit2"];  $limit2INFO = $limit2;
        if ($limit2 == "") { $limit2 = "50"; }
        if (($limit2 != "10") AND ($limit2 != "25") AND ($limit2 != "50") AND ($limit2 != "100") AND ($limit2 != "200")) { $limit2 = "50"; }

$dispfrom = $_POST["dispfrom"];   $dispfromINFO = $dispfrom;
          if ($dispfrom == "") { $dispfrom = 0; }


$result=mysql_query("SELECT valami1, valami2, valami3, valami4 FROM xzy WHERE valami1 = xy1 AND valami2 = xy2 LIMIT $dispfrom,$limit2");


Ha itt és most leállítom a futást (Excel header leküldése előtt), akkor szépen megjelenik minden adat, ahogyan az kell (echo-val kiíratva).

Ellenben ha folytatom a dolgot (akkor ugye echo lefújva a header information miatt), akkor:

$count = mysql_num_fields($result);

for ($i = 0; $i < $count; $i++){
    $header .= mysql_field_name($result, $i)."\t";
}

while($row = mysql_fetch_row($result)){
  $line = '';
  foreach($row as $value){
    if(!isset($value) || $value == ""){
      $value = "\t";
    }else{
      $value = str_replace('"', '""', $value);

      $value = '"' . $value . '"' . "\t";
    }
    $line .= $value;
  }
  $data .= trim($line)."\n";
}
  $data = str_replace("\r", "", $data);

if ($data == "") {
  $data = "\n no matching records found \n";
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=excelfile_$timernow.xls");
header("Pragma: no-cache");
header("Expires: 0");

echo $header."\n".$data;


Ha az $data -ba beleiratom a lefutott mysql queryt, akkor hajtépésemre az jön ki, hogy eldobott minden olyan értéket, ami POSTolva volt, és visszaállt alapra.
Ez azért baj, mert így mindig LIMIT 0,50 lesz bárhol is tartott a user a keresésben.

szóval a nap kérdése, hova tűnnek a POST értékek?
A neten utánanyálaztam, megpróbáltam háromféle excel kiírató résszel, mindegyik ezt csinálta.

Ötletek?

Előre is köszönöm!
 
1

UP

sunder · 2008. Feb. 26. (K), 12.17
UP : ezek szerint nincs otlet?
2

session?

zila · 2008. Feb. 26. (K), 12.43
Nem teljesen értem a megoldásodat... Lefut egy keresés, ami 50 rekordot ad vissza, ezt szeretnéd excelbe lementeni. Ezzel a megoldással ugye az aktuális oldal 50 rekordja fog lementődni, és laponként lesz egy csv-d. Ezt szeretnéd? A POST eltűnésére több megoldás is van, használj GET-et, és mindig add tovább a paramétereket, tedd el sessionbe a formon beállított paramétereket és a sessionben tartsd nyilván, hogy hol jár a keresésben a user...
3

Rossz rossz rossz

vbence · 2008. Feb. 26. (K), 12.45
Egyszerűen inzultus, hogy egy ilyen levest felteszel, és azt várod, hogy bárki ezt értelmezze ;) Lényegesen le kéne egyszerűsítened ezt a cuccot, esetleg konzisztensen tabulálni, esetleg kommentelni, esetleg helyesen használni a kolrert. Meg érthetően fogalmazni...

Magyarul: azt mondod, hogy a $result... sor előtt az echo ($dispfrom); a megfelelő értéket tartalmazza, és utána egy sorral már a defaultot?
4

Én kérek elnézést :-)

sunder · 2008. Feb. 26. (K), 13.24
Igen, így utólag tényleg zagyva lett egy kicsit.

De az értelmezésed közel helyes lett, Bence. :-)

A különbség annyi, hogy ha mondjuk azt kapja az oldal, hogy
a dispfrom = 50 és a limit2 is = 50,
akkor ha az $result UTÁN kiíratom azt, ami az $resultban kellene legyen, még ott is stimmel.

Tehát feltételezve, hogy a POST information alapján dispfrom = 50 és limit2 is = 50,:
$query = "SELECT valami1, valami2, valami3, valami4 FROM xzy WHERE valami1 = xy1 AND valami2 = xy2 LIMIT $dispfrom,$limit2";

$result=mysql_query($query);


Az $query egy echo-ra azt fogja adni, hogy
SELECT valami1, valami2, valami3, valami4 FROM xzy WHERE valami1 = xy1 AND valami2 = xy2 LIMIT 50,50


Ellenben ha kikommentezem az echo-t, és folytatom a header information-nel, aztán kiíratom az $query-t a legenerált Excel tábla első sorában, akkor az

SELECT valami1, valami2, valami3, valami4 FROM xzy WHERE valami1 = xy1 AND valami2 = xy2 LIMIT 0,50


lesz.
5

Mi van, ha...

vbence · 2008. Feb. 26. (K), 15.22
előtte is és utána is nyomsz egy echo-t? Mi van, ha a $dispfrom beállítása után echozol, és a queryket nem?
6

Header miatt ....

sunder · 2008. Feb. 26. (K), 16.06
Ha a disprom után közvetlenül echo-zom, akkor is a bePOSTolt értéket adja, ahogy a Query is.

Gyakorlatilag egyetlen eseményen múlik, hogy megmarad-e a POSTolt érték (akár az oldal végén is, mindegy, hogy hol), mégpedig hogy küldöm-e a header információt, hogy Excel lesz vagy sem.

Ugye ha a headert elküldöm, akkor echo kilőve, különben ez lesz belőle:
// Az alábbi query nem a script része, ezt adja az ECHO!!!!!!
// ==========================================================
mysql_query("SELECT assetregion, assetcountry, assetcity, location, cat1, cat2, cat3, cat4 FROM assetdb WHERE dbid > 0 AND assetregion = 'EMEA' ORDER BY assetname ASC LIMIT 50,50") or die(mysql_error());

Warning: Cannot modify header information - headers already sent by (output started at /var/www/labaim/tools/assetsearch_export.php:168) in /var/www/labaim/tools/assetsearch_export.php on line 204


Tehát amint bekerül az eredeti POST-ban leírt header information küldés, elfelejti a bekért változókat és beáll az eredetire.
Olyan, mintha újraolvasná az egész kódot egy refresh-el, ugyebár immár a változók nélkül, de azt ugye nem szabadna neki szimplán a header info elküldése miatt.
7

Naszóval

vbence · 2008. Feb. 26. (K), 19.31
Van egy ciklusod. Beírod elé az echo ($dispfrom); -ot, és utána IS, tehát kettő lesz. Nem vagy-vagy. IS. Az első még jó, a második, már nem?

A "Cannot modify" ebbena pillanatban egyáltalán nem érdekel minket. A hibát keressük.

Más: feltételezve, hogy valóban van hiba ;) nem használsz valami "acceleratort" vagy "optimizert" a phphez? Azok tudnak furcsa dolgokat művelni...
8

OK, eredmény:

sunder · 2008. Feb. 26. (K), 20.02
Noszóval, egyszerűsítettem a scriptet egy kicsit, és a következő a helyzet:

<?php
// Adatok bekerese
$limit2 = @$_POST['limit2']; if ($limit2 == "") { $limit2 = "50"; }
$dispfrom = @$_POST['dispfrom']; if ($dispfrom == "") { $dispfrom = 0; }

// Adatok kiiratasa header nelkul:
echo "<br/><br/>LIMIT $dispfrom,$limit2<br/><br/>";

// MySQL query futtatasa es csatlakozas:
 include("../0sqlc.php");
$result = mysql_query("SELECT assetregion, assetcountry, assetcity, location, cat1, cat2, cat3, cat4, labid FROM assetdb WHERE dbid > 0 AND assetregion = 'EMEA' LIMIT $dispfrom,$limit2") or die(mysql_error());

$count = mysql_num_fields($result);

// fejlec cellak valtozoba irasa
for ($i = 0; $i < $count; $i++){
    $header .= mysql_field_name($result, $i)."\t";
}

// adatok valtozoba irasa
while($row = mysql_fetch_row($result)){
  $line = '';
  foreach($row as $value){
    if(!isset($value) || $value == ""){
      $value = "\t";
    }else{
       $value = str_replace('"', '""', $value);
       $value = '"' . $value . '"' . "\t";
    }
    $line .= $value;
  }
  $data .= trim($line)."\n";
}
// Ha nincs adat ez jelenjen meg ................
if ($data == "") {
  $data = "\nno matching records found \n";
}

// Headert nem kuldunk most
// header("Content-type: application/octet-stream");
// header("Content-Disposition: attachment; filename=excelfile.xls");
// header("Pragma: no-cache");
// header("Expires: 0");

// ismet adatok kiiratasa:
echo "<br /><br/>LIMIT $dispfrom,$limit2<br/><br/>";


Ez ezt adta vissza:
LIMIT 50,50



LIMIT 50,50


No most ha visszateszem a headert, de otthagyom az echo-kat, akkor megkapom a hibaüzenetet miszerint a header info már el lett küldve, de változatlan 50,50 mindkét echo.

Ha kikommentezem az echo-kat, de beleiratom az Excel fileba, hogy mi lett az $dispfrom és az $limit2 sorsa, akkor az adott mezőben ezt kapom:

0
50
assetregion assetcountry assetcity location cat1 cat2 cat3 cat4 labid


Tehat visszaváltott defaultra amint elkezdte az excel konverziót. Meg is jelenik szépen az első 50 bejegyzés az adatbázisból de ugye nekem az ötvenediktől kellene ebben a példában.
9

Boncolgassunk

vbence · 2008. Feb. 26. (K), 20.20
A headert küldd a fájl lején... ezért is header a neve ;)

ezután echo-zd sokszor sok helyen, és nézd meg, hogy meddig jó, honnantól nem.

Mi van, ha include helyett itt deklarálod a konstansokat (vagy amik benne vannak)?
10

Már a legelején...

sunder · 2008. Feb. 26. (K), 23.23
Kiprobaltam meg egyszerubben:

<?php

header("Content-type: application/octet-stream");

header("Content-Disposition: attachment; filename=excelfile.xls");
header("Pragma: no-cache");
header("Expires: 0");

$limit2 = $_POST["limit2"];
        if ($limit2 == "") { $limit2 = 50; }

$dispfrom = $_POST["dispfrom"];            
        if ($dispfrom == "") { $dispfrom = 0; }

echo $dispfrom."\n".$limit2."\n";

?>



Igy is 0 es 50, de ha kiszedem /kikommentelem/ a header-t, akkor ugyanaz az echo 50,50.
Kiprobaltam ugy is, hogy a header elott kerje be a POST a cuccot.
Lehet a header kuldesenek barmilyen köze az adatok elvesztéséhez, vagy az kizárt?
11

Kiszedegetni?

vbence · 2008. Feb. 27. (Sze), 09.16
Próáltad megkurtítani a headert, mindig egy soral kevesebbre? Derytsd ki, melyik sor okozza (esetleg bármelyik?)

Az output bufferinget is kipróbálhatod áthidaló megoldásként (olyankor a végén is lehet a herader).


Más: engem az zavart össze, hogy $header-nek hívod a táblában látható első sort is, nem volt egyértelmű, miről van szó.