MySQL > Excel export PHP - POST Adatok eltűnnek
Ü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
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:
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!
■ 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");
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;
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!
UP
session?
Rossz rossz rossz
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?
Én kérek elnézést :-)
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,:
$result=mysql_query($query);
Az $query egy echo-ra azt fogja adni, hogy
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
lesz.
Mi van, ha...
Header miatt ....
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:
// ==========================================================
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.
Naszóval
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...
OK, eredmény:
// 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.
Boncolgassunk
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)?
Már a legelején...
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?
Kiszedegetni?
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ó.