Problem mit der Ausgabe eines MySQL-Selects in fpdf bzw. PHP

[moR-pH-euS]

Magnum P.I.
Servus,
ich bin gerade dabei mir ein Organisations-Interface zu schreiben, bei dem man Kunden anlegen kann, Projekte zu den Kunden erstellt, auf die Projekte dann bucht und sich am Ende eine Rechnung als PDF, aus den Buchungen, generieren lassen kann (mit fpdf).
Mein Problem ist, dass zwar alles funktioniert und ich mir auch PDF's generiern lassen kann, aber leider gibt er mir mehrer Buchungen immer in der gleichen Zeile aus (also in der ersten Rechnungszeile der Rechnung).
Ich dachte eigentlich das durch die while-schleife er wirklich Zeile für Zeile ausgibt, so das ich dann eine Varialbe $i definieren kann, die ich dann immer um 10 erhöhe und in SetXY als Y-Koordinate einfüge
Code:
($pdf->SetXY(20,$i);)

Leider erhöht er mir aber $i nicht, so dass er die Buchungen immer in die gleiche Zeile ausgibt.

Hier mal der Code-Ausschnitt:

Code:
	        while (list($dauer,$std_satz,$aufgabe) = mysql_fetch_row($result0)) {
	        
	        	$i="140";

	        	$i = $i + 10;
	        	
				$preis=$std_satz*$dauer;

				$std_satz = number_format($std_satz, 2, ',', "");

				$preis = number_format($preis, 2, ',', "");


				//erste rechnungszeile
				$pdf->SetXY(20,$i);


				$pdf->SetFont('Times','',10);

				$pdf->Cell(15,4,$today);		

				$pdf->Cell(17,4,$dauer,0,0,'C');

				$pdf->Cell(23,4,$std_satz." Euro",0,0,'C');

				$pdf->Cell(84,4,$aufgabe);


				$pdf->Cell(26,4,$preis." Euro",0,0,'R');


        }

Hat jemand vielleicht eine Idee was ich falsch mache, oder kennt eine andere Methode?

Hier noch der mysql-code:
(user, pass und db habe ich mal rausgenommen ;-)

Code:
		$link = mysql_connect("localhost", "user", "pass")
		or die("Keine Verbindung möglich: " . mysql_error());
		
		//echo "Verbindung zum Datenbankserver erfolgreich";
		mysql_select_db("datenbank") or die("Auswahl der Datenbank fehlgeschlagen");

		/* ausführen einer SQL Anfrage */

		$query0 = " Select dauer, std_satz, aufgabe
					From  buchen
					Where pid=$pid";
		$result0 = mysql_query($query0) or die("Anfrage fehlgeschlagen: " . mysql_error());

edit: ich habe mal ein pdf angehängt.
 

Anhänge

  • doc (14).pdf
    90,1 KB · Aufrufe: 554
... ohne mich in PHP auszukennen, wuerde ich doch auf den ersten Blick fast vermuten, dass Du in dieser Zeile
Code:
while (list($dauer,$std_satz,$aufgabe) = mysql_fetch_row($result0)) {
den Fehler eingebaut hast.
Wenn ich das richtig verstehe, muesstest Du das "=" durch ein "<" ersetzen, damit Du ein hochzaehlen der Zeile bekommst.
 
ja mit dem = will er ja die sachen aus dem mysql_fetch_blah in list() packen

hab deinen fehler(denk ich), deklarier mal $i =140; ausserhalb der schleife (die "" brauchst du auch nciht bei 140) denn wenn bei jeder zeile die y koordinate wieder 140 hat bringts dir nichts
 
Code:
while (list($dauer,$std_satz,$aufgabe) = mysql_fetch_row($result0)) {
    $i="140";
    $i = $i + 10;
Leider erhöht er mir aber $i nicht
Bei jedem Durchlauf der While-Schleife wird $i erst einmal auf 140 gesetzt und danach um 10 erhöht. Sprich: bei jedem Aufrufen von "$pdf->SetXY()" hat $i den Wert 150.
--> Das Initialisieren von $i mit dem Startwert musst du vor dem While machen.
 
Ohnen PHP-Kenntnisse geb ich hier mal meine unqualifizierte Meinung ab.

Aus der Java-Programmierung kenn ich while-Schleifen in etwa so:

Code:
while (Bedingung)
{
    arbeite
}

Beispiel:

int i =  0;

while( i <= 10 )
{
   System.out.println("Zeile:  " + i);

   i++;
}

Also erst initialisieren und dann while dann solange arbeiten lassen bis die Bedingung nicht mehr erfüllt werden kann.
Hier auf das kleiner/gleich achten. Die Bedingung wird erfüllt solange der Wert sowohl kleiner als auch gleich 10 ist. Erst wenn der Wert grösser ist wird die Bedingung nicht mehr erfüllt und die Schleife beendet.
Eine Alternative wäre ggf. eine for-Schleife.

Wie gesagt von PHP habe ich keine Ahnung. Aber ich nehme mal an, dass PHP mit Schleifen ähnlich umgeht.

Vielleicht funktioniert dies:
Code:
$i="140";

while (list($dauer,$std_satz,$aufgabe) <= mysql_fetch_row($result0)) {

				$preis=$std_satz*$dauer;

				$std_satz = number_format($std_satz, 2, ',', "");

				$preis = number_format($preis, 2, ',', "");

				//erste rechnungszeile
				$pdf->SetXY(20,$i);

				$pdf->SetFont('Times','',10);

				$pdf->Cell(15,4,$today);		

				$pdf->Cell(17,4,$dauer,0,0,'C');

				$pdf->Cell(23,4,$std_satz." Euro",0,0,'C');

				$pdf->Cell(84,4,$aufgabe);

				$pdf->Cell(26,4,$preis." Euro",0,0,'R');

	        	$i = $i + 10;

        }
Der Wert von $i wird dann erst am Schluss erhöht. Es sei denn du willst den y-Wert bereits für die erste Zeile auf 150 setzen. Dann sollte das bei der Initialisierung von $i gesetzt werden.
 
Vielen lieben dank. Ist natürich sehr dämlich $i=140 innerhalb der while-schleife zu setzen, das war es natürlich *vordenkopfschlag*.
 
@morpheus
Ich bin auch gerade am Basteln solch eines Tools, ist auch schon fertig, nur kriegt man bei mir kein PDF als Rechnung. Das wollte ich ständig einbauen, aber war nicht fähig. Hast du zufällig nen netten Link mit ner Anleitung usw. für mich?

Thx
 
Hi

Vielen Dank für die Tips, ich hab mich jetzt dann doch für FPDF entschieden, hab aber jetzt ein kleines Problemchen. Ich habe von der Homepage folgendes Bsp. etwas umgeschrieben, alles klappt mehr oder weniger wie am Schnürchen, ich habe aber dennoch ein kleines Problem. Zunächst mal der Code:

PHP:
<?php
require('fpdf.php');

$testvariable = 'testinhalt';

class PDF extends FPDF
{
//Page header
function Header()
{
    //Logo
    $this->Image('logo_pb.png',10,8,33);
    //Arial bold 15
    $this->SetFont('Arial','B',15);
    //Move to the right
    $this->Cell(80);
    //Title
    $this->Cell(30,10,'Title',1,0,'C');
    //Line break
    $this->Ln(20);
}

//Page footer
function Footer()
{
    //Position at 1.5 cm from bottom
    $this->SetY(-15);
    //Arial italic 8
    $this->SetFont('Arial','I',8);
    //Page number
    $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
}
}

//Instanciation of inherited class
$pdf=new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->SetFont('Times','',12);
for($i=1;$i<=40;$i++)
    $pdf->Cell(0,10,'Printing line number '.$i,0,1);
$pdf->Output();
?>

Ich habe also Header und Footer, das klappt auch noch wunderbar, allerdings müsste ich im Header auf die Variable $testvariable zugreifen, die außerhalb der Klasse definiert wurde. Irgendwie geht das nicht, wahrscheinlich gerade deshalb, weil die Variable außerhalb der Klasse ist. Aber wie kann ich es dennoch schaffen, darauf zuzugreifen??

Thx
 
du musst die varialbe im header als global setzen, dann kannst du im header auf sie zugreifen, ich habe es mal angehängt (das rote ist es ;-)
im übrigen wäre es geschickter gewesen einen neuen thread aufzumachen, da dein problem nichts mehr mit dem thread-titel zu tun hat...

Code:
<?php 
require('fpdf.php'); 

$testvariable = 'testinhalt'; 

class PDF extends FPDF 
{ 
//Page header
function Header() 
{ 
  [COLOR="Red"] 
    global $testvariable;

    $this->Cell(<x>,<y>,$testvariable);
[/COLOR] 
    //Logo 
    $this->Image('logo_pb.png',10,8,33); 
    //Arial bold 15 
    $this->SetFont('Arial','B',15); 
    //Move to the right 
    $this->Cell(80); 
    //Title 
    $this->Cell(30,10,'Title',1,0,'C'); 
    //Line break 
    $this->Ln(20); 
} 

//Page footer 
function Footer() 
{ 
    //Position at 1.5 cm from bottom 
    $this->SetY(-15); 
    //Arial italic 8 
    $this->SetFont('Arial','I',8); 
    //Page number 
    $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); 
} 
} 

//Instanciation of inherited class 
$pdf=new PDF(); 
$pdf->AliasNbPages(); 
$pdf->AddPage(); 
$pdf->SetFont('Times','',12); 
for($i=1;$i<=40;$i++) 
    $pdf->Cell(0,10,'Printing line number '.$i,0,1); 
$pdf->Output(); 
?>
 
Hi morpheus

danke für den Tip, hat natürlich auf Anhieb geklappt. Ich dachte mir schon, dass das nur so ne Kleinigkeit ist, deshalb hab ich keinen neuen Thread aufgemacht, werd ich das nächstemal aber machen.

Grüße
 
Zurück
Oben