for Schleife - Ergebnis in txt Datei ausgeben

  • Hallo,
    vielleicht kann mir einer helfen


    so funktioniert alles:


    möchte ich das Ganze jetzt in eine txt Datei ausgeben:



    schreib ich zum Beispiel ind Variable $haus='test'; dann wird mir das ohne Probleme in der txt Datei ausgegeben.

  • genau ja


    In der Praxis ist es dann so das der User verschiedene Codes anwählen kann und später bekommt er eine txt Datei mit allen Codes die er ausgewählt hat. $test sind die also die ausgewählten Codes


    Also Variante einfaches echo funktioniert - Variante zwei Variable in txt schreiben funktioniert nicht das txt file ist einfach leer

  • also var_dump($haus); gibts das aus:
    string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" string(0) "" 6Q05H-EUNY1-9N0VH-07830-EKB4G string(30) "6Q05H-EUNY1-9N0VH-07830-EKB4G " string(0) "" string(0) "" string(0) "" VTCN4-LD71O-HROG5-OFH30-XOV4G string(30) "VTCN4-LD71O-HROG5-OFH30-XOV4G " string(0) "" string(0) ""


    und var_dump($row);
    gibt mir die Daten der ganzen DB aus - das passt hier nicht alles rein ;)


    aber was ich nicht versteh warum passt das echo Ergebnis - und wenn ich das ganze in die txt schreiben möchte funktioniert es nicht mehr?

  • Zitat

    aber was ich nicht versteh warum passt das echo Ergebnis - und wenn ich das ganze in die txt schreiben möchte funktioniert es nicht mehr?


    Genau das wollte ich sehen mit den Dumps.. Bei mir schreibt der nämlich ganz normal, wenn ich dem als $text ein Array übergebe und die $row mit Testinhalten fülle.


    Wobei das $row bei Dir dann ja eh immer der gleiche Wert ist, nämlich Code oder Uid. Der wird ja in der Schleife nicht "mitgeschliffen".


    Der Dump vom $haus ist aber auch seltsam. Das müsste ein String sein, an den immer wieder weitere Werte angehängt werden per ".="


    Wo hast Du das var_dump($haus); denn eingefügt? Direkt vor dem ersten header oder in die Schleife ??


    Der Dump von $test fehlt komplett.


    Mein test liefert z.b.
    array(4) { [0]=> string(4) "test" [1]=> string(5) "test2" [2]=> string(5) "test3" [3]=> string(5) "test4" }
    und mein haus:
    string(13) "testcode
    "J


    Jetzt dämmert mir was..... Dein Dump von $haus sind mehrere Einzelwerte... Kann es sein, dass Dein Code nur ein kleiner Teil ist und darum nochmals eine andere Schleife läuft? Würde die vielen Einzelwerte erklären - normalerweise ist es nur einer. Würde auch erklären, dass die $row verschiedene Werte wären, nämlich bei jedem Durchlauf ein anderer.


    Wenn dem so ist, dann poste mal ein wenig mehr von dem Code, zumindest alle beteiligten Schleifen. Header senden in Schleifen ist nicht möglich, zumal Du die Daten danach mit echo ja ausgibst. Nach der Datenausgabe kann aber kein neuer Header folgen.


    Würde auch erklären, warum das mit einfach "echo" funktioniert, denn da echot er die Werte ja einfach hintereinander.


    Auch würde es erklären, warum das txt leer ist. Der erste Dump (string(0) "") ist ja leer und der wird ausgegeben. Danach (wenn eine weitere Schleife drumrum) erfolgt kein neuer Header. Allerdings würde da das exit; dann auch keinen Sinn ergeben.

  • var_dump($test); hab ich ganz vergessen, sorry - bei zwei ausgewählten Feldern bekomm ich das


    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }
    array(2) { [0]=> string(3) "350" [1]=> string(3) "377" }

  • Auch das dürfte nur ein Dump sein, bei Dir sind es 19. Spricht also noch mehr für eine weitere Schleife drumrum. Eventuell eine while für die DB-Abfrage (für das $row) ?


    Der Dump vom $haus sind ja auch 19 + 2 vom Echo.


  • oh sorry das kann sein - ist ein langes Script - ich hoff das hilft


    $res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(
    'a1.uid, a1.crdate, a1.typ, a1.benutzer, a1.seriennummer, a1.nick, a1.license, a1.code, a2.title',
    'tx_mygbs_seriennummer a1 JOIN tx_mygbs_gereat a2 ON a2.uid = a1.typ',
    'a1.hidden=0 and a1.deleted=0 and a2.hidden=0 and a2.deleted=0 and a1.benutzer = '.$user, #where
    $groupBy='',
    $orderBy= 'typ',
    $limit='');
    $i = 1;



    while($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {


    if(t3lib_div::_GP('absenden')=='Spracherkennung') {
    $test = t3lib_div::_GP('check');


    if(count($test) > 0){
    $haus = '';
    for($i=0 ; $i < count($test); $i++){
    if ($row['uid']==$test[$i]) {
    $haus.=$row['code'].' <br>';
    }
    }
    header("Content-Type: application/force-download");
    header("Content-Disposition: attachment; filename=\"licence.txt\"");
    header("Content-Length: ". strlen($haus));
    echo $haus;
    exit();
    }
    }


    //hier kommen dann noch mehr Marker
    }

  • Ok, so habe ich mir das gedacht.. Entscheidend ist das hier:



    Bedeutet bei Dir also, der geht in den ersten Durchlauf von while(). Wenn er dann in den "if(count($test) > 0)" kommen sollte, dann sendet er nach dem for() auch den Header und geht auch nochmals in den exit(). Alle anderen while danach sind egal, exit war schon da.


    Bei Deinem normalen "echo" würde er den Wert einfach echoen und die while weiter machen. Deine Modifikation geht in den exit. Ohne Exit geht es aber so auch nicht, da er beim ersten "match" den Header senden wurde und kurz darauf den "echo" ausführt. Selbst wenn das while dann weiter läuft, ein zweiter header kann dann nicht mehr gesendet werden.


    Das heißt, Du musst innerhalb der for() das $haus zusammensetzen, so wie bisher. Dann musst Du aber auch den eigentlichen Output der kompletten while zusammensetzen, dafür lässt Du das echo vom Original weg.


    Außerhalb der while() kommen dann die Header und der Output von allen Werten.

  • Nachtrag, weiß aber nicht, ob das so passt und welche Werte da nun genau zusammengesetzte werden. Aber etwa so sollte es funktionieren (ungetestet):