Mit FPDF über Schleifen Tabellen erstellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mit FPDF über Schleifen Tabellen erstellen

    Hallo zusammen,

    und wieder hab ich ein Problem.. diesmal mit der FPDF-Klasse bei der Erstellung eines neuen pdf-Documents.

    Gedacht ist das so, dass alle Klassen aus einer Datenbank ausgelesen werden.. dann werden in einer while-Schleife die Teilnehmer einer jeden Klassen ausgelesen und in ein Array geschrieben ($data[klasse][teilnehmer]). Wenn für eine Klasse keine Teilnehmer vorhanden sind, wird die komplette Klasse ausgelassen - also nicht in das Array geschrieben. Wenn ich jetzt über print_r($data) ausgeben lasse, was vorhanden ist, dann wird mir der (derzeit einzig vorhandene) Teilnehmer angezeigt. Wenn ich allerdings über die Tabelle im pdf den ausgeben möchte, dann steht zwar für die Klasse der Tabellen-kopf da, aber nicht der Teilnehmer selber.
    Hier mal der Code dazu:

    Quellcode

    1. require('fpdf17/fpdf.php');
    2. class PDF extends FPDF
    3. {
    4. // Page header
    5. function Header()
    6. {
    7. // Arial bold 15
    8. $this->SetFont('Arial','B',15);
    9. // Move to the right
    10. $this->Cell(5);
    11. // Title
    12. $this->Cell(25,15,'Ergebnisliste',0,0,'L');
    13. // Line break
    14. $this->Ln(15);
    15. }
    16. // Page footer
    17. function Footer()
    18. {
    19. // Position at 1.5 cm from bottom
    20. $this->SetY(-15);
    21. // Arial italic 8
    22. $this->SetFont('Arial','I',8);
    23. // Page number
    24. $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
    25. }
    26. // Better table
    27. function ImprovedTable($header, $data)
    28. {
    29. $this->Ln();
    30. $this->SetFont('Arial','',11);
    31. $this->Cell(100,10,'Klasse: '.$header[1],0,'L');
    32. //$this->Cell(0,10,'ID: '.$header[2],0,'L');
    33. $this->Ln();
    34. $this->SetFont('Arial','B',9);
    35. $this->Cell(12,7,'','B',0,'L');
    36. $this->Cell(35,7,'Name','B',0,'L');
    37. $this->Cell(40,7,'Verein','B',0,'L');
    38. $this->Cell(13,7,'Jahr','B',0,'L');
    39. $this->Cell(13,7,'Land','B',0,'L');
    40. $this->Cell(11,7,$header[3].' Mtr','B',0,'C');
    41. $this->Cell(11,7,$header[4].' Mtr','B',0,'C');
    42. if ($header[5] != NULL) {
    43. $this->Cell(11,7,$header[5].' Mtr','B',0,'C'); }
    44. else {
    45. $this->Cell(11,7,'-','B',0,'C'); }
    46. if ($header[6] != NULL) {
    47. $this->Cell(11,7,$header[6].' Mtr','B',0,'C'); }
    48. else {
    49. $this->Cell(11,7,'-','B',0,'C'); }
    50. $this->Cell(10,7,'10\'','B',0,'C');
    51. $this->Cell(10,7,'9\'','B',0,'C');
    52. $this->Cell(15,7,'Total','B',0,'L');
    53. $this->Ln();
    54. // Data
    55. $this->SetFont('Arial','',10);
    56. for ($i=1;$i<count($data);$i++)
    57. {
    58. foreach($data[$i] as $row)
    59. {
    60. $this->Cell(12,5,$row[1],0,'L');
    61. $this->Cell(45,5,$row[2],0,0,'L');
    62. $this->Cell(55,5,$row[3],0,0,'L');
    63. $this->Cell(55,5,$row[4],0,0,'L');
    64. $this->Cell(15,5,$row[5],0,0,'C');
    65. $this->Cell(10,5,$row[6],0,0,'C');
    66. $this->Cell(10,5,$row[7],0,0,'C');
    67. $this->Cell(10,5,$row[8],0,0,'C');
    68. $this->Cell(10,5,$row[9],0,0,'C');
    69. $this->Cell(10,5,$row[10],0,0,'C');
    70. $this->Cell(10,5,$row[11],0,0,'C');
    71. $this->Cell(10,5,$row[12],0,0,'C');
    72. $this->Cell(10,5,$row[13],0,0,'C');
    73. $this->Ln();
    74. }
    75. }
    76. //print_r($data);
    77. // Closing line
    78. }
    79. }
    80. $pdf = new PDF();
    81. $pdf->SetTitle("Ergebnisliste");
    82. $pdf->AliasNbPages();
    83. $pdf->AddPage();
    84. $pdf->SetFont('Arial','',12);
    85. $pdf->Cell(5);
    86. $pdf->MultiCell(0,5,$titel,0,1);
    87. $ergebnis1 = $mysqli->query("SELECT name, id, entf_1_durchgang, entf_2_durchgang, entf_3_durchgang, entf_4_durchgang FROM klasse");
    88. while ($row1 = $ergebnis1->fetch_object())
    89. {
    90. $header = array(
    91. 1 => $row1->name,
    92. 2 => $row1->id,
    93. 3 => $row1->entf_1_durchgang,
    94. 4 => $row1->entf_2_durchgang,
    95. 5 => $row1->entf_3_durchgang,
    96. 6 => $row1->entf_4_durchgang);
    97. $data = array();
    98. $i = 1;
    99. $ergebnis2 = $mysqli->query("SELECT name, verein, entf_1_ergebnis, entf_2_ergebnis, entf_3_ergebnis, entf_4_ergebnis, ergebnis_gesamt, x, x_10, scheibe_num, scheibe_alph FROM teilnehmer WHERE klasse = '$row1->id' ORDER BY ergebnis_gesamt, x, x_10 DESC");
    100. if ($ergebnis2->num_rows != NULL)
    101. {
    102. while ($row2 = $ergebnis2->fetch_object())
    103. {
    104. $ergeb1 = $mysqli->query("SELECT name FROM verein WHERE id = '$row2->verein'");
    105. $ro1 = $ergeb1->fetch_object();
    106. $data[$i] = array(
    107. 2 => $row2->scheibe_num.$row2->scheibe_alph,
    108. 3 => $row2->name,
    109. 4 => $ro1->name,
    110. 5 => '',
    111. 6 => '',
    112. 7 => $row2->entf_1_ergebnis,
    113. 8 => $row2->entf_2_ergebnis,
    114. 9 => $row2->entf_3_ergebnis,
    115. 10 => $row2->entf_4_ergebnis,
    116. 11 => $row2->x,
    117. 12 => $row2->x_10,
    118. 13 => $row2->ergebnis_gesamt);
    119. $i++;
    120. }
    121. //print_r($data);
    122. $pdf->ImprovedTable($header, $data);
    123. }
    124. }
    125. $pdf->Output();
    Alles anzeigen


    Angezeigt wird dann eben nur der Teil mit $header. Ich bin mir fast sicher, dass es an der for und der foreach-Schleife liegt, aber ich kanns nicht mit Garantie sagen, bzw. weiß nicht, wie ich den Fehler beheben kann.

    Ich hoffe, ihr könnt mir folgen, was ich mein, und mir helfen

    Danke schonmal

    LG

    Fipsi
  • Das - dass es mit 0 beginnt - wollte/hab ich doch damit unterbunden, dass ich bei dem setzen des Arrays schon mit $i = 1 beginn? Und wenn ich in der for-Schleife mit $i = 0 beginn, jammert er von wegen offset.

    Und das mit Join hat mir schon mal jemand empfohlen.. hab ich aufgehört, nachdem die komplette Datenbank weg war (frag mich nicht, wie ich das geschafft hab).
  • Uhhh ... denk nicht so kompliziert. ;)

    Du kannst dir die ganze Mühe sparen, idem du die Zuweidung einfach über $data[] = array(/* daten hier */); machst. mit [] wird automatisch eine neue Zeile angelegt und durchnummeriert.

    Was mir grade erst auffällt - du erstellst ein 1-Dimensionales Array und iterierst mit 2 Schleifen? Eine reicht doch, oder?

    Quellcode

    1. foreach($data as $row)
    2. {
    3. // code
    4. }



    Eigentlich müsste dein Code sogar einen Fehler werfen, da du in der inneren Schleife auf nicht zugewiesene Indizes zugreifst.

    Schau mal, ob das was hilft. ;)

    VG Bodo06