PHP , Mysql, Fpdf Doppelte Ausgabe

  • Hallo.
    Ich habe heute nacht während der Arbeit versucht mich ein wenig in fpdf einzuarbeiten.
    Soweit klappt auch die Erstellung der PDF Datei. Komischerweise wird jede Spalte Doppelt ausgegeben. Im FPDF Forum ist leider nix mehr los. Also hoffe ich das ich hier jemanden finde der mir Helfen kann.


    [code=php]<?php
    require('pdf/fpdf.php');
    $db_user = "++++++";
    $db_password = "+++++";
    $db_db = "isys";
    class PDF extends FPDF
    {
    function Header()
    {
    #$this->Image('images/logo.jpg',10,8,33);
    # $this->Image('images/cl_logo.png',170,8,33);

    $this->SetFont('Arial','B',15);

    $this->Cell(60);

    $this->Cell(70,10,'Überschrift ',9,0);

    $this->Ln(20);
    }
    function BasicTable($header,$data)
    {

    foreach($header as $col)
    $this->Cell(20,9,$col,1);
    $this->Ln();

    foreach($data as $row)
    {
    foreach($row as $col)
    $this->Cell(17,6,$col,1);
    $this->Ln();
    }
    }
    function Footer()
    {

    $this->SetY(-10);
    $this->SetFont('Arial','I',8);
    $this->Cell(0,10,'Seite '.$this->PageNo().'/{nb}',0,0,'C');
    }
    }
    $pdf=new PDF();
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->SetFont('Arial','',9);
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken ');
    while($data = $stmt->fetch())
    $pdf->BasicTable($data);
    $pdf->Output();
    ?>[/php]


    Im Anhang ist ein Bild von der Ausgabe. Dort ist der Ausgabefehler zu finden. Ich denke eher das es mal wieder ein kleiner "Dummer " Fehler ist den ich nach zu langer suche einfach nicht sehe.


    • Official Post

    Sollte man nicht wenn, man eine Funktion mit 2 Parametern erstellt, auch beide übergeben :denker: Oder ist das $header das self (python) von php (glaub ich aber nicht).
    was steht denn in den Datensätzen drin die du aus der DB holst? Ich kenne fdpf nicht aber das wäre mein erster ansatz.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Ist kein fpdf-Fehler sondern ein Fehler in der Logik.
    Als erstes hat dbv Recht, du vergisst den zweiten Parameter, und das hat mit deinem Problem zu tun.


    Du machst:
    [code=php]
    while($data = $stmt->fetch())
    $pdf->BasicTable($data);
    [/php]
    Damit holst du dir immer den EINEN nächsten Eintrag aus der Datenbank und führst BasicTable aus. BasicTable ist darauf ausgelegt mit mehreren Daten umzugehen. Da ist schon der erste Fehler.
    Da du den zweiten Parameter vergessen hast, wird der geraten und da es eine passend benannte Variable gibt ($data) die "zufällig" das gleiche beinhaltet wie du in $header drinstehen hast, wird das dafür genommen.
    Beide Variablen werden zu je einer Zelle der Tabelle. Wie gesagt, du verarbeitest immer nur ein Ergebnis aber das in einer Schleife, daher sind sie immer hintereinander.


    Außerdem solltest du deine Funktionsnamen mit einem Kleinbushctaben beginnen, ich habe gerade mit Grenzenloser Bestürzung festgestellt, dass FPDF das anders macht... nehm dir das nicht aus Vorbild.

  • Ok dann habe ich schonmal wieder was neues gelernt. Functionen nur klein :)
    Bin in beidem noch neu PHP, Mysql usw.
    Also das mit dem Header habe ich natürlich verhauen. Was nicht da ist kann er nicht ausgeben :)
    Habs mal geändert. Ausserdem habe ich in einem Tut noch gesehen das eine function eingebaut wurde die die Daten holt. Allerdings werden hier die Daten aus einer Datei geholt.


    Ich habe versucht das ganze nun auf mysql abzuändern. Die Header Reihe wird ausgegeben. Allerdings noch keine Daten aus der Datenbank. Da könnte ich noch nen kleinen oder großen Stupser über die Klippe gebrauchen.
    [code=php]class PDF extends FPDF
    {


    function LoadData()
    {
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken ');
    while($newdata = $stmt->fetch())
    $data = $newdata;

    return $data;
    }
    function Header()
    {
    $this->Image('images/logo.jpg',10,8,33);
    $this->Image('images/cl_logo.png',170,8,33);

    $this->SetFont('Arial','B',15);

    $this->Cell(60);

    $this->Cell(70,10,'Überschrift ',9,0);

    $this->Ln(20);
    }
    function BasicTable($header,$data)
    {

    foreach($header as $col)
    $this->Cell(37,9,$col,1);
    $this->Ln();

    foreach($data as $row)
    {
    foreach($row as $col)
    $this->Cell(17,6,$col,1);
    $this->Ln();
    }
    }
    function Footer()
    {

    $this->SetY(-10);
    $this->SetFont('Arial','I',8);
    $this->Cell(0,10,'Seite '.$this->PageNo().'/{nb}',0,0,'C');
    }
    }
    $pdf=new PDF();
    $header=array('Partner','Eingang WB-1','Eingang WB-2','Ausgang WB-1','Ausgang WB-2');
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->SetFont('Arial','',9);
    $pdf->BasicTable($header,$data);
    $pdf->Output();[/php]

  • Du machst immernoch ein while(...fetch()) du willst das ohne das while und mit fetchAll(). Versuche es damit nochmal (wird nicht alles an Fehler sein aber damit kommst du dann vielleicht selbst weiter)

  • So einmal muss ich noch stören.
    Ich habe in der Function noch einiges umgebaut
    [code=php]function LoadData()
    {
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken ');
    $my = $stmt->fetchALL();
    $data = $my;
    return $data;
    }[/php]


    Bei der Ausgabe der PDF Datei
    [code=php]$pdf=new PDF();
    $header=array('Partner','Eingang WB-1','Eingang WB-2','Ausgang WB-1','Ausgang WB-2');
    $data=$pdf->LoadData();
    $pdf->SetFont('Arial','',9);
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->BasicTable($header,$data);
    $pdf->Output();[/php]
    Meine Frage ist nun muss bei erstellung einer function eine Variable mit übergeben werden?

  • Sieht schon besser aus.

    Code
    $data = $my;
     return $data;


    ist etwas überflüssig, es reicht doch:

    Code
    return $my;


    Aber zu deiner Frage.
    Hä? "Erstellung" einer Funktion ist, wenn du sie tippst... weiß nicht ob du eine Variable benötigst um zu programmieren...
    Aber auch ohne dich auf den Arm zu nehmen verstehe ich die Frage nicht. Du musst natürlich nicht jeder Funktion eine Variable übergeben, und du kannst auch Standartwerte für eine Variable angeben.



    falls das deine Frage nicht beantwortet dann musst du dich deutlicher ausdrücken.
    [hr]
    Disclaimer: In der Antwort-box programmiert, Tippfehler sind wahrscheinlich! Und auf Einrückung hatte ich dabei auch keine Lust, keine Erlaubnis das bei echtem Code wegzulassen!

    • Official Post

    Ich glaube er meint: wenn er eine function definiert
    [code=php]function bla()[/php]
    die variablen die er erwartet auch gleich mit angeben soll oder ob er es so lässt und dann trotzdem
    [code=php]$blub = function bla($var1,$var2)[/php] macht.


    Ganz klar, wenn eine function werte annehmen soll, dann definier das auch so.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Ich steige da langsam immer weniger durch.
    Ich danke euch vielmals für eure Hilfe aber ich werde das ganze erstmal beiseite legen und warten bis das alles in meinem Fernstudium behandelt wird.


    Schönen Abend wünsche ich noch.

  • Eigentlich wollte ich das ganze beiseite schieben und noch Schlafen gehen vor der Nachtschicht aber es lässt mir keine ruhe. :wallbash:
    Erstmal
    [code=php]$data = $my;
    return $data;[/php]
    ist geändert. Die Datenbankabfrage funktioniert. Ich habe es über print_r überprüft.
    [code=php]Array ( [0] => Array ( [spedition] => Zeile1 [0] => Zeile1 [e_wb1] => 100001 [1] => 100001 [e_wb2] => 100002 [2] => 100002 [a_wb1] => 123456 [3]
    => 123456 [a_wb2] => 567890 [4] => 567890 ) [1] => Array ( [spedition] => Zeile 2 [0] => Zeile 2 [e_wb1] => 123456 [1] => 123456 [e_wb2]
    => 456789 [2] => 456789 [a_wb1] => [3] => [a_wb2] => [4] => ) )[/php]


    Also hapert es an der übergabe von
    [code=php]function LoadData()
    {
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken');
    $my = $stmt->fetchALL();
    return $my;
    }[/php]
    an
    [code=php]$data = $pdf->LoadData();[/php]


    Egal was ich auch versuche ob LoadData() ohne Variable oder mit Variable $my es bleibt immer bei einer weißen Seite. Wenn ich bei der Erstellung des PDF´s die Zeile
    $data = $pdf->LoadData(); auskommentiere dann wird dokument erstellt aber hat nur die Header Zeile und keinerlei Daten aus der Datenbank.

  • Der LoadData-Function übergibst du nichts, die hat doch keine Argumente.
    Wenn dein code noch so ist:
    [code=php]
    $pdf=new PDF();
    $header=array('Partner','Eingang WB-1','Eingang WB-2','Ausgang WB-1','Ausgang WB-2');
    $data=$pdf->LoadData();
    $pdf->SetFont('Arial','',9);
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->BasicTable($header,$data);
    $pdf->Output();
    [/php]


    und deine LoadData() die Rückgabe vom fetchAll() zurückgibt, dann sollte es auch ziemlich funktionieren.
    Kannst du uns nochmal das aktuelle Programm komplet geben?

  • Hi. Gerade mal 5 Minuten Pause genommen :D


    Hier ist wie gewünscht das gesamte Script.
    [code=php]require('pdf/fpdf.php');
    $db_user = "isys";
    $db_password = "+++++++++";
    $db_db = "isys";
    class PDF extends FPDF
    {


    function LoadData($data)
    {
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken');
    $my = $stmt->fetchALL();
    return $my;
    }
    function Header()
    {
    $this->Image('images/logo.jpg',10,8,33);
    $this->Image('images/cl_logo.png',170,8,33);
    $this->SetFont('Arial','B',15);
    $this->Cell(60);
    $this->Cell(70,10,'Überschrift ',9,0);
    $this->Ln(20);
    }
    function BasicTable($header,$data)
    {

    foreach($header as $col)
    $this->Cell(37,9,$col,1);
    $this->Ln();

    foreach($data as $row)
    {
    foreach($row as $col)
    $this->Cell(17,6,$col,1);
    $this->Ln();
    }
    }
    function Footer()
    {

    $this->SetY(-10);
    $this->SetFont('Arial','I',8);
    $this->Cell(0,10,'Seite '.$this->PageNo().'/{nb}',0,0,'C');
    }
    }
    $pdf=new PDF();
    $header=array('Partner','Eingang WB-1','Eingang WB-2','Ausgang WB-1','Ausgang WB-2');
    $data = $pdf->LoadData();
    $pdf->SetFont('Arial','',9);
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->BasicTable($header,$data);
    $pdf->Output();


    ?>[/php]

  • Der einzige Fehler den ich sehe ist, dass dein LoadData ein Argument erwartet (unnötig, das nutzt du ja garnicht) aber keines bekommt. Ansonsten sehe ich keinen Fehler. Wenn es einfach weiß bleibt, wird irgendein Fehler auftreten, dafür solltest du das error_reporting aktivieren (google und forensuche geben etliche Anleitungen wie) und mal den Fehler posten.
    Ich befürchte das Argument ist nciht der Fehler der das Verursacht, denn PHP ist mit Argumenten ziemlich gnädig.

  • Also den ersten Fehler konnte ich dank deines Tips mit Error Reporting beheben.
    Das script ist nicht damit klar gekommen das die Daten für die Datenbank über der loaddata Function standen. Was nervig sein wird weil ich die Daten normalerweise über ein db_config include. Aber das ist erstmal nicht so schlimm


    Nun
    [code=php]function LoadData()
    {
    $db_user = "isys";
    $db_password = "";
    $db_db = "isys";
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken');
    $my = $stmt->fetchALL();
    return $my;
    }[/php]
    Funktioniert es. Allerdings habe ich jetzt wieder das Anfangs Problem das die Spalten aus der DB immer Doppelt ausgegeben werden :s




    Hm. Büro , 40 Grad, Nachtschicht und mir brummt die Birne :wallbash:

  • Aaaah ja, Das mit den Variablen hab ich übersehen, das geht so nicht, PHP ist da ziemlich eigen. 1. Musst du da Konstanten verwenden, 2. kennt PHP zwei Sorten von Konstanden, nur eine Funktioniert in diesem Fall glaube ich.
    [code=php]
    const BEISPIEL_KONSTANTE = 'wert';
    [/php]


    ist glaube ich die Variante die nicht funktioniert für das was du willst,


    [code=php]
    define("FOO", "irgendwas");
    [/php]
    sollte meines Erachtens nach funktionieren, aber diese feinheit habe ich auch noch nicht begriffen.


    Dass alles doppelt kommt, dass habe ich schon befürchtet, als ich die Ausgabe deines Arrays gesehen habe, da ist auch alles doppelt drinne.


    Die Standarteinstellung von PDO ist glaube ich ein ::FETCH_ASSOC wenn du ein fetchAll machst. Das heißt, dass die Daten in einem assoziativen Arraay gespeichert werden. (Assoziatives Array heißt du kannst mit $array_name['key'] darauf zugreifen, im Falle von PDO dann also (für die erste Zeile) $row[0]['e_wb1'] für den Wert von der tabellen-Spalte 'e_wb1').


    Meines (auch müden) Kopf nach sähe das also so aus:
    [code=php]
    foreach($data as $row)
    {
    $this->Cell(17,6,$row['e_wb1',1);
    $this->Cell(17,6,$row['e_wb2',1);
    ...
    $this->Ln();
    }
    [/php]


    Wenn das nicht hilft muss ich wohl morgen mal mit frischen Kopf draufgucken und vermutlich die Tomaten von den Augen nehmen.

  • Erstmal vielen Dank das du mir so stark hilfst.
    Also ich habe mal deinen Vorschlag umgesetzt und nun gibt er es nicht mehr Doppelt sondern ! 10fach ! aus :@


    Hier ist das Endergebnis bisher.
    [code=php]<?php
    error_reporting(E_ALL);
    require('pdf/fpdf.php');
    class PDF extends FPDF
    {


    function LoadData()
    {
    $db_user = "isys";
    $db_password = "+++++++";
    $db_db = "isys";
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken');
    $data = $stmt->fetchALL();
    return $data;
    }
    function Header()
    {
    $this->Image('images/logo.jpg',10,8,33);
    $this->Image('images/cl_logo.png',170,8,33);
    $this->SetFont('Arial','B',15);
    $this->Cell(60);
    $this->Cell(70,10,'Überschrift ',9,0);
    $this->Ln(20);
    }
    function BasicTable($header,$data)
    {

    foreach($header as $col)
    $this->Cell(37,9,$col,1);
    $this->Ln();

    foreach($data as $row)
    {
    foreach($row as $col)
    $this->Cell(17,6,$row['spedition'],1);
    $this->Cell(17,6,$row['e_wb1'],1);
    $this->Cell(17,6,$row['e_wb2'],1);
    $this->Cell(17,6,$row['a_wb1'],1);
    $this->Cell(17,6,$row['a_wb2'],1);
    $this->Ln();
    }
    }
    function Footer()
    {

    $this->SetY(-10);
    $this->SetFont('Arial','I',8);
    $this->Cell(0,10,'Seite '.$this->PageNo().'/{nb}',0,0,'C');
    }
    }
    $pdf=new PDF();
    $header=array('Partner','Eingang WB-1','Eingang WB-2','Ausgang WB-1','Ausgang WB-2');
    $data = $pdf->LoadData();
    $pdf->SetFont('Arial','',9);
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->BasicTable($header,$data);
    $pdf->Output();
    ?>[/php]
    Ich werde heute nacht auch nicht mehr dran weiterhämmern. Je länger es wird desto weniger steige ich da noch durch.


    Wünsche dir eine angenehme Nachtruhe. Auf das die Tomaten vor den Augen verschwinden :)

  • So ich habe es hinbekommen.
    Ich musste in der LoadData Function PDO::FETCH_ASSOC angeben.
    [code=php]function LoadData()
    {
    $db_user = "isys";
    $db_password = "";
    $db_db = "isys";
    $db = new PDO("mysql:host=localhost;dbname=$db_db;", $db_user, $db_password);
    $stmt = $db->query('SELECT spedition, e_wb1, e_wb2, a_wb1, a_wb2 FROM tbl_wechselbruecken');
    $data = $stmt->fetchALL(PDO::FETCH_ASSOC);
    return $data;
    }[/php]
    Ausserdem habe ich dann in der Ausgabe wieder die alte foreach schleife eingestellt.
    [code=php]foreach($data as $row)
    {
    foreach($row as $col)
    $this->Cell(37,6,$col,1);
    $this->Ln();

    }[/php]
    Nun Funktioniert es.


    Vielen Dank nochmals für die vielen Hilfe Versuche.