script42: FPDF Foreach-Schleife verhält sich merkwürdig

Hallo miteinander,

ich möchte innerhalb eines mit FPDF generierten PDFs einen Stundenplan ausgeben und habe dafür folgenden Code geschrieben:

$pdf->Cell(50, 6, "Wochentag");  
$pdf->Cell(50, 6, "von");  
$pdf->Cell(50, 6, "bis");  
$pdf->Ln();  
foreach( $regStp as $stunde ) {  
	$pdf->Cell(50, 6, $stunde['wochentag']);  
	$pdf->Cell(50, 6, $stunde['von']);  
	$pdf->Cell(50, 6, $stunde['bis']);  
	$pdf->Ln();  
}

Der Teil vor der foreach-Schleife wird auch korrekt ausgegeben, doch für den Teil innerhalb wird jede Zelle um eine Zeile nach unten verrückt, statt erst am Ende der Zeile einen Zeilenumbruch zu generieren, so dass das Ergebnis so aussieht:

Wochentag                 von                  bis   
Montag  
                          13:45   
                                               14:30  
Dienstag           
                          13:45  
                                               15:15  
Mittwoch  
                          13:45  
                                               15:15  
Freitag  
                          13:45  
                                               15:15  

Kann mir jemand sagen, woher dieses eigentümliche Verhalten kommt und wie ich es lösen kann?

Vielen Dank,

Kerstin Gröschel

akzeptierte Antworten

  1. Hallo,

    Kann mir jemand sagen, woher dieses eigentümliche Verhalten kommt und wie ich es lösen kann?

    Zeig mal bitte, wie du $regStp befüllst. Es sieht so aus, als ob dort Zeilenumbrüche mitgespeichert sind.

    Gruß
    Kalk

    Edith schlägt vor, es mit einem Trim zu versuchen zu lösen...

    1. Hallo Kalk,

      die Daten kommen hierher:

      $sqlRegStp = "SELECT wochentag, von, bis, gueltig_ab FROM {$from} a JOIN wochentag b ON a.wochentagnr = b.wochentagnr WHERE vertragsnr = :vertragsnr;";
      
      $stmt = $pdo->db->prepare($sqlRegStp); 
      if(!$stmt->execute(array(':vertragsnr' => $vertragsnr))) {
      	echo "SQL Fehler <br />";
      	echo $stmt->queryString."<br />";
      	echo $stmt->errorInfo()[2];
      } else {
      	while($rowRegStp = $stmt->fetch()) {
      		$regStp[]['wochentag'] = $rowRegStp['wochentag'];
      		$regStp[]['von'] = $rowRegStp['von'];
      		$regStp[]['bis'] = $rowRegStp['bis'];
      	}
      }
      

      Herzliche Grüße,

      Kerstin

      1. Hallo,

        hm, wenns mit dem Trim nicht klappt, dann vielleicht mal gucken, wie Matt Doyle es vor 10 Jahren(?) beschrieben hat.

        Ansonsten hilft sicher Debugging…

        Gruß
        Kalk

        1. Danke schonmal für die Ideen!

          Ich habe mir zunächst einmal ohne foreach-Schleife den ersten Eintrag anzeigen lassen, um zu sehen, ob es an den Whitespaces liegt, also so:

          		$pdf->Cell(50, 6, $regStp[0]['wochentag']);
          		$pdf->Cell(50, 6, $regStp[0]['von']);
          		$pdf->Cell(50, 6, $regStp[0]['bis']);
          		$pdf->Ln();
          

          und jetzt wird mir nur noch der Wochentag und gar keine Zeiten mehr angezeigt. Jetzt kapier ich gar nichts mehr... Ich versuche es also mal mit Trim und überprüfe die Datenbank...

        2. Hallo Kalk,

          Ich hab's jetzt mal mit Trim probiert, doch scheint es nicht an Whitespaces zu liegen.
          Das Bild ist nach wie vor das Gleiche und in der MySQL-Datenbank sind die Einträge auch brav als "Time"-Einträge zu finden, lassen als auch wenig Spielraum für Whitespaces.
          Habt Ihr noch irgendwelche schlauen Ideen, was ich überprüfen kann bzw. Tipps, wie ich das fertige PDF überhaupt untersuchen kann? Die Browser-Entwicklertools greifen hier ja nicht. Was mich halt auch total verwirrt, ist, dass, wenn ich den Code aus der Foreach-Schleife rausziehe, für die Zeit gar nichts angezeigt wird.

          Danke für Eure Hilfe,
          Kerstin Gröschel

          1. Hallo,

            Habt Ihr noch irgendwelche schlauen Ideen, was ich überprüfen kann bzw. Tipps, wie ich das fertige PDF überhaupt untersuchen kann? Die Browser-Entwicklertools greifen hier ja nicht.

            Probier mal die verschiedenen Parameter des output-Befehls.

            Gruß
            Kalk

            Edith glaubt, die sind auch nicht hilfreich 😟

            1. Okay, trotzdem danke und Grüße an Edith, wer auch immer sie sein mag... :-)

              1. Hallo,

                Edith ist die, der meistens noch was einfällt, nachdem ich schon auf Speichern geklickt habe…

                Gruß
                Kalk

                1. Ja, das dachte ich mir schon wegen der jeweils zwei "Versionen" ... ;-) .
                  Herzliche Grüße, auch an Edith,
                  Kerstin

    2. Ich hab's raus!

      Es lag tatsächlich an der Datenbankabfrage bzw. dem Befüllen des Arrays.

      Ich hatte es ja so gemacht:

      	while($rowRegStp = $stmt->fetch()) {
      		$regStp[]['wochentag'] = $rowRegStp['wochentag'];
      		$regStp[]['von'] = $rowRegStp['von'];
      		$regStp[]['bis'] = $rowRegStp['bis'];
      	}
      

      Was dazu geführt hat, dass die leeren eckigen Klammern unabhängig vom zweiten Parameter durchnummeriert wurden.

      Die Lösung war also die Bestückung der ersten Klammer, um innerhalb eines while-Zyklus die gleiche Zahl darin stehen zu haben.

      	$i=0;
      	while($rowRegStp = $stmt->fetch()) {
      		$regStp[$i]['wochentag'] = $rowRegStp['wochentag'];
      		$regStp[$i]['von'] = $rowRegStp['von'];
      		$regStp[$i]['bis'] = $rowRegStp['bis'];
      		$i++;
      	}
      

      Danke für Eure Hilfe,

      Kerstin

      1. Hallo Kerstin,

        Die Lösung war also die Bestückung der ersten Klammer, um innerhalb eines while-Zyklus die gleiche Zahl darin stehen zu haben.

        Warum nicht einfach:

        while($rowRegStp = $stmt->fetch()) {
        	$regStp[] = $rowRegStp;
        }
        

        ? Oder alternativ gleich fetchAll()

        Gruß,
        Tobias

        1. Hallo Tobias,

          das ist natürlich noch viel besser! Ich hab's glaube ich erst nicht so gemacht, weil ich nur 3 von 7 Spalten brauche, aber das macht ja eigentlich kaum was aus hier.

          fetchAll() kannte ich noch gar nicht, also vielen Dank!

          Herzliche Grüße,
          Kerstin

          1. Hallo

            das ist natürlich noch viel besser! Ich hab's glaube ich erst nicht so gemacht, weil ich nur 3 von 7 Spalten brauche

            Dann frage in der Datenbank auch nur die drei benötigten Spalten ab. Das verringert die bereitzuhaltende und zu verarbeitende Datenmenge um die nicht benutzten Ergebnisfelder und ermöglicht es dir, deinen Code zu vereinfachen.

            aber das macht ja eigentlich kaum was aus hier.

            Hier war es der Unterschied zwischen der direkten Übernahme mit $regStp[] = $rowRegStp; und der händischen, bei dir fehlerhaften Zuweisung. Ganz so „kaum“ ist der Unterschied dann doch nicht. 😉

            fetchAll() kannte ich noch gar nicht, also vielen Dank!

            Probiere es damit, sei dir aber des Umstands gewahr, dass die Funktion nicht auf jedem Server zur Verfügung steht, obwohl sie der PHP-Version entsprechend eigentlich da sein müsste.

            Tschö, Auge

            --
            Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
            Hohle Köpfe von Terry Pratchett
            1. Hallo Auge,

              also doch die händische Variante - eben auf die korrekte Weise?
              Denn mit $regStp[] = $rowRegStp bekomme ich ja wie auch mit fetchAll() alle Spalten, oder?
              Danke für den Hinweis zu fetchAll()!

              Herzliche Grüße
              Kerstin

              1. Hallo

                also doch die händische Variante - eben auf die korrekte Weise?
                Denn mit $regStp[] = $rowRegStp bekomme ich ja wie auch mit fetchAll() alle Spalten, oder?

                Natürlich. Du übergibst alle in der Zeile vorhandenen Werte an das Arrayelement aus $regStp, also sind die dort dann auch alle vorhanden. Deshalb wies ich ja darauf hin, nur die Felder aus der Datenbank abzufragen, die du wirklich zu benutzen gedenkst. Wenn in $rowRegStp nur die drei Felder „wochentag“, „von“ und „bis“ drinstehen, übergibst du logischerweise auch nur diese drei Werte an $regStp[].

                Tschö, Auge

                --
                Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                Hohle Köpfe von Terry Pratchett
                1. Ahhh! Jetzt hat's klick gemacht! Danke!