• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Array - FPDF

Seyonne

Mitglied
Hallo Zusammen,

Ich habe huete vormittag folgenden Beitrag gelesen und bin seither am spielen/ändern des scriptes. -> PDF-Rechnung mit PHP erzeugen | Dr. Web Magazin

zum problem:
In script1 werden Rechnungspositionenn in ein array geschrieben:
PHP:
$arrPos[1]['text']        = "Ihr Text zu dieser Position...";
$arrPos[1]['menge']       = 3;
$arrPos[1]['einzelpreis'] = 10.33;
$arrPos[1]['gesamtpreis'] = $arrPos[1]['menge'] * $arrPos[1]['einzelpreis'];
$arrPos[1]['steuer']    = "19";
$arrPos[2]['text']        = "Ihr Text zu dieser Position...";
etc...

und in der folgenden function verarbeitet:
PHP:
foreach ($this->twArrRechnungspositionen as $pos)
  {
   $i++;
   $this->twShowZeileMitMultiCell(array(
              $i,
              $pos['text'],
              $pos['menge'],
              number_format($pos['einzelpreis'],"2",",",".")."€",
     number_format($pos['gesamtpreis'],"2",",",".")."€",
     //sprintf("%9,2f", $pos['einzelpreis']),
              //sprintf("%9,2f", $pos['gesamtpreis']),
     $pos['steuer'] . "%"
              ));
   $this->SetX(27);  // sonst gehts immer ganz links los...
  }

Ich wollte das Array nun dynamisch aus der DB füllen:
PHP:
$j=0;
//for($i=1;$i < $cnt+1; $i++ )
//{
$result2 = mysql_query("SELECT * FROM angebotsposition " .
     "WHERE userid=".$_SESSION['userid'] . " AND angid=" . $angid." order by angpos");
while($row2 = mysql_fetch_array($result2))
{ 
$arrPos = array();
$arrPos[$j]['text']        = $row2['posbez']; //"Position1.\nbla\nbla\nblub";
$arrPos[$j]['menge']       = $row2['posanzahl']; //1;
$arrPos[$j]['einzelpreis'] = $row2['posnetto']; //20.00;
$gesamt=$row2['posnetto']*$row2['posanzahl'];
$arrPos[$j]['gesamtpreis'] = $gesamt;//number_format($gesamt,"2",",",".");   //$arrPos[0]['menge'] * $arrPos[0]['einzelpreis'];
$arrPos[$j]['steuer']     = $row2['posstr']; //"19";
$j++;
}

Jedoch wird mir nur eine Zeile ausgegeben. Ich blicke das array in der existenten funtion nicht so ganz, bin aber der meinung das mein array doch genauso aufgebaut ist wie das manuell erstellte. Manuell erstellt funktioniert alles einwandfrei.

Danke im Voraus,
 
Werbung:
Ohne die Funktionen nun zu kennen, was bringt denn ein
PHP:
print_r($arrPos);
nach der while-Schleife.
Stehen da alle positionen wirklich einzeln gelistet?
 
Das prüfen von arrays hab ich auch noch nie kapiert^^

Array ( [6] => Array ( [text] => 7
[menge] => 7
[einzelpreis] => 7.00
[gesamtpreis] => 49
[steuer] => 19
)
)

Überschreibt sich wohl immer selbst statt mehrdimensionales array zu erweitern..

Ich hatte es mit der for schleife versucht, aber gleiches ergebnis.
 
Werbung:
Nun, ich ersehe aus deinem Code den Aufbau nicht wirklich, mir kommt dein SQL-Statement etwas seltsam vor (Bauchgefühl, da ich nicht weiss, wie du die Daten abspeicherst).

PHP:
$result2 = mysql_query("SELECT * FROM angebotsposition " . "WHERE userid=".$_SESSION['userid'] . " AND angid=" . $angid." order by angpos");
Trag das SQL-Statement doch mal in z.B. phpmyadmin als Abfrage ein und kontrolliere, ob wirklich meherer Ergebnisse ausgegeben werden sollten.

Was immer $angid ist, $angid hat immer nur 1 Wert und ist nicht felxibel. Kombiniert mit der User-ID erscheint mir eine einzeilige Ausgabe sinnvoll.

print_r() zeigt, dass das Ergebnis eindeutig Einzeilig ist.
 
And der Abfrage liegt es nicht, das Projekt besteht mittlerweile aus fast 10k Zeilen, ohne die Tabellenstruktur zu kennen wirkt es bissl komisch^^
tabelle user -> tabelle angebot -> tabelle angebotsposition mit den jeweiligen keys drin um die sache nicht unnötig mit joins zu verklomplizieren.

PHP:
echo "1->".$row['position']."<br>2->"-.$row['menge'];
etc gibt mir in meinem test auch alle 9 datensätze wie gewünscht aus. Nur wie fülle ich dynamisch das Array das die benötigte Schachtelung entsteht?
PHP:
$arrPos[1]['text'] = "Ihr Text zu dieser Position...";
$arrPos[1]['menge'] = 3;
$arrPos[1]['einzelpreis'] = 10.33;
$arrPos[1]['gesamtpreis'] = $arrPos[1]['menge'] * $arrPos[1]['einzelpreis'];
$arrPos[1]['steuer'] = "19";
$arrPos[2]['text'] = "Ihr Text zu dieser Position...";
 
Nur zur Kontrolle für mich (ich bin schon etwas müde und lese vielleicht über Fehler drüber :mrgreen: )
Füg mal den Code im Script ganz oben ein:
PHP:
function dbquery($query)
{
   global $query_error;

   $query_error = '';
   $result = @mysql_query($query);
   if (!$result)
   {
      $query_error = "(".mysql_errno().")".mysql_error();
      return false;
   }
   else
   {
      return $result;
   }   
}


function myfetch_all($sql)
{
   global $query_error;

   $result = dbquery($sql);
   if(!$result)
   {
      return false;
   }
   
   $x = 1;
   // array 0 ist der feldname...
   for($r = 0; $r < mysql_num_fields($result); $r++)
   {
      $ergebnis[0][$r] = mysql_field_name($result,$r);
   }

   // ab array 1 werden die daten gelesen
   while ($row = mysql_fetch_row($result))
   {
      for($a = 0; $a < mysql_num_fields($result); $a++)
      {
         $ergebnis[$x][$a] = $row[$a];
      }
      $x++;
   }

   return $ergebnis;
}
dann ruf mit
PHP:
$result2 = myfetch_all ("SELECT * FROM angebotsposition " . "WHERE userid=".$_SESSION['userid'] . " AND angid=" . $angid." order by angpos");
print_r($result2);
Dein SQL-Statement auf.

PS
Habe Editiert, my_utf8 Funktion gibt es nicht bei dir.
 
Werbung:
Fatal error: Call to undefined function dbquery() in C:\xampp\xampp\htdocs\Projekte\Homepage\pdf.ang.php on line 33
 
Habe editiert, ganz oben steht die Funktion nun drinnen, sorry...
Die folgende Funktionen sollten dein Array so befüllen, wie du es haben möchtest.
PHP:
function myfetch_all_field($sql)
{
   global $query_error;

   $result = dbquery($sql);
   $x = 0;
   // array 0 ist feldname...
   for($r = 0; $r < mysql_num_fields($result); $r++)
   {
      $field[] = mysql_field_name($result,$r);
   }

   while ($row = mysql_fetch_row($result))
   {
      for($a = 0; $a < mysql_num_fields($result); $a++)
      {
         $ergebnis[$x][$field[$a]] = $row[$a];
      }
      $x++;
   }
   return $ergebnis;
}
 
Zuletzt bearbeitet von einem Moderator:
Ahso, hatte nur die function vergessen zu kopieren^^
Jetzt wird chaotisch:
Array ( [0] => Array ( [0] => posid [1] => userid [2] => kundeaccid [3] => angid [4] => angpos [5] => posangelegt [6] => poserledigt [7] => posanzahl [8] => posnetto [9] => posbrutto [10] => possteuer [11] => posstr [12] => posbez ) [1] => Array ( [0] => 000000000000023 [1] => 0000000001 [2] => 3 [3] => 14 [4] => 1 [5] => 2011-05-27 [6] => 0000-00-00 [7] => 13 [8] => 55.36 [9] => 65.88 [10] => 10.52 [11] => 19 [12] => sfghsfj ) [2] => Array ( [0] => 000000000000086 [1] => 0000000001 [2] => 0 [3] => 14 [4] => 2 [5] => 2011-06-01 [6] => 0000-00-00 [7] => 2 [8] => 2.00 [9] => 2.38 [10] => 0.38 [11] => 19 [12] => 2 ) [3] => Array ( [0] => 000000000000087 [1] => 0000000001 [2] => 0 [3] => 14 [4] => 3 [5] => 2011-06-01 [6] => 0000-00-00 [7] => 3 [8] => 3.00 [9] => 3.57 [10] => 0.57 [11] => 19 [12] => 3 ) [4] => Array ( [0] => 000000000000088 [1] => 0000000001 [2] => 0 [3] => 14 [4] => 4 [5] => 2011-06-01 [6] => 0000-00-00 [7] => 4 [8] => 4.00 [9] => 4.76 [10] => 0.76 [11] => 19 [12] => 4 ) [5] => Array ( [0] => 000000000000089 [1] => 0000000001 [2] => 0 [3] => 14 [4] => 5 [5] => 2011-06-01 [6] => 0000-00-00 [7] => 5 [8] => 5.00 [9] => 5.95 [10] => 0.95 [11] => 19 [12] => 5 ) [6] => Array ( [0] => 000000000000090 [1] => 0000000001 [2] => 0 [3] => 14 [4] => 6 [5] => 2011-06-01 [6] => 0000-00-00 [7] => 6 [8] => 6.00 [9] => 7.14 [10] => 1.14 [11] => 19 [12] => 6 ) [7] => Array ( [0] => 000000000000091 [1] => 0000000001 [2] => 0 [3] => 14 [4] => 7 [5] => 2011-06-01 [6] => 0000-00-00 [7] => 7 [8] => 7.00 [9] => 8.33 [10] => 1.33 [11] => 19 [12] => 7 ) ) Array ( [6] => Array ( [text] => 7 [menge] => 7 [einzelpreis] => 7.00 [gesamtpreis] => 49 [steuer] => 19 ) )
 
Werbung:
Nö, das sieht doch gut aus...
PHP:
function dbquery($query)
{
   global $query_error;

   $query_error = '';
   $result = @mysql_query($query);
   if (!$result)
   {
      $query_error = "(".mysql_errno().")".mysql_error();
      return false;
   }
   else
   {
      return $result;
   }   
}

function myfetch_all_field($sql)
{
   global $query_error;

   $result = dbquery($sql);
   $x = 0;
   // array 0 ist feldname...
   for($r = 0; $r < mysql_num_fields($result); $r++)
   {
      $field[] = mysql_field_name($result,$r);
   }

   while ($row = mysql_fetch_row($result))
   {
      for($a = 0; $a < mysql_num_fields($result); $a++)
      {
         $ergebnis[$x][$field[$a]] = $row[$a];
      }
      $x++;
   }
   return $ergebnis;
}  

$arrPos = myfetch_all_field ("SELECT * FROM angebotsposition " . "WHERE userid=".$_SESSION['userid'] . " AND angid=" . $angid." order by angpos");
sollte dein gewünschtes Ergebnis sein, im Index 0 stehen die Feldnamen, du solltest also ab Index 1 ausgeben. Eventuell ein
PHP:
unset ($arrpos[0]);
 
also statt meiner while($row = mysql... jetzt

PHP:
$arrpos = array();
$arrpos = myfetch_all_field($sql);

Oder wie wende ich die function an?
 
genau so, dann sollte dein array so befüllt sein, wie du das wünscht.
Statt deine While also:

PHP:
$arrPos = myfetch_all_field ("SELECT * FROM angebotsposition " . "WHERE userid=".$_SESSION['userid'] . " AND angid=" . $angid." order by angpos");

Die dbquery Funktion nicht vergessen ;-)
 
Werbung:
Notice: Undefined index: text in ...



PHP:
private function twShowRechnungspositionen() 
 {  
    
  // Spaltenbreiten und Beschriftung der Spaltenköpfe festlegen
  $this->twSetSpaltenbreiten(array(12, 70, 14, 24, 24, 17));
  $this->twSetSpaltenkoepfe(array('Pos', 'Text', 'Menge', 'Netto', 'Gesamt', 'Steuer'));
  // Tabellenköpfe (nur mit Cell) 
  $this->SetFillColor(244);
  $this->SetTextColor(000);
  $this->SetLineWidth(.3);
  $this->SetFont('Arial', 'B', '12');   
  $this->SetXY(27, 106);  
  for ($i=0; $i<count($this->twArrSpaltenkoepfe); $i++) 
  {
   $this->Cell($this->twArrSpaltenbreiten[$i], 7, $this->twArrSpaltenkoepfe[$i], 1, 0, 'C', 1); 
  }
  $this->ln();
  
  // Tabellenzeilen (mit MultiCell)
  $this->SetFillColor(224, 235, 255);
  $this->SetFont('Arial', '', 10);
  $this->SetXY(27, 113);
  $i = 0; 
  foreach ($this->twArrRechnungspositionen as $pos)      //Hier gehts weiter mit dem array
  {
   $i++;
   $this->twShowZeileMitMultiCell(array(
              $i,
              $pos['text'],
              $pos['menge'],
              number_format($pos['einzelpreis'],"2",",",".")."€",
     number_format($pos['gesamtpreis'],"2",",",".")."€",
     //sprintf("%9,2f", $pos['einzelpreis']),
              //sprintf("%9,2f", $pos['gesamtpreis']),
     $pos['steuer'] . "%"
              ));
   $this->SetX(27);  // sonst gehts immer ganz links los...
  }
    $this->Cell(array_sum($this->twArrSpaltenbreiten), 0, '', 'T');  //Tabellenlinie unten
 }
 
AHHH OK, das war error reporting E_ALL was header.... unterbrochen hatte. ich habe in meiner pdf nun 7 zeilen jedoch ohne inhalt.

Jedenfalls sind das super nützliche funktionen, danke dir soweit vielmals :D

 
Wie gesagt, ich hänge schon sehr durch:
Dann müsste man nun noch die entspechenden pdf-Variablen belegen.

Wenn ich deine while-Schleife ansehe, scheint der Fehler übrigens der zu sein:
PHP:
$arrPos = array();
while($row2 = mysql_fetch_array($result2))
{ 
// $arrPos = array(); // muss vor die Schleife
$arrPos[$j]['text']        = $row2['posbez']; //"Position1.\nbla\nbla\nblub";
$arrPos[$j]['menge']       = $row2['posanzahl']; //1;
$arrPos[$j]['einzelpreis'] = $row2['posnetto']; //20.00;
$gesamt=$row2['posnetto']*$row2['posanzahl'];
$arrPos[$j]['gesamtpreis'] = $gesamt;//number_format($gesamt,"2",",",".");   //$arrPos[0]['menge'] * $arrPos[0]['einzelpreis'];
$arrPos[$j]['steuer']     = $row2['posstr']; //"19";
$j++;
}
Du definierst dass array arrPos immer wieder neu


Wenn die Klasse an die Vorgaben gebunden ist, muss man die Variablen noch richtig belegen, den Fehler mit em Index 0 behebe ich auch gleich.

PHP:
for ($i = 0; $i < (count($arrPos) - 1); $i++)
{
  $arrPos[$i]['text']        = $arrPos[($i + 1)]['posbez'];
  $arrPos[$i]['menge']       = $arrPos[($i + 1)]['posanzahl']; //1;
  $arrPos[$i]['einzelpreis'] =  $arrPos[($i + 1)]['posnetto']; //20.00;
  $gesamt= $arrPos[($i + 1)]['posnetto']*$arrPos[($i + 1)]['posanzahl'];
  $arrPos[($i]['gesamtpreis'] = $gesamt;//number_format($gesamt,"2",",",".");     
  $arrPos[$i]['steuer']     =  $arrPos[($i + 1)]['posstr']; //"19";
}
Damit wird es aber schon wieder etwas aufwendig, denke ich.
Deine While Schleife scheint bei mir nun übrigens auch zu funktionieren..
 
Werbung:
Da es gestern doch relativ spät war hab ich nochmal von vorne angefangen und meine erste Version der for/while schleife genommen.

PHP:
for($i=1;$i < $cnt+1; $i++ )
{
$result2 = mysql_query("SELECT * FROM angebotsposition " .
"WHERE userid=".$_SESSION['userid'] . " AND angid=" . $angid." AND angpos=".$i." order by angpos");
while($row2 = mysql_fetch_array($result2))
{ 
$arrPos = array();
$arrPos[$i]['text'] = $row2['posbez']; //"Position1.\nbla\nbla\nblub";
$arrPos[$i]['menge'] = $row2['posanzahl']; //1;
$arrPos[$i]['einzelpreis'] = $row2['posnetto']; //20.00;
$gesamt=$row2['posnetto']*$row2['posanzahl'];
$arrPos[$i]['gesamtpreis'] = $gesamt;//number_format($gesamt,"2",",","."); //$arrPos[0]['menge'] * $arrPos[0]['einzelpreis'];
$arrPos[$i]['steuer'] = $row2['posstr']; //"19";
}
}

Jetzt fällt mir auf das
PHP:
$arrPos = array();
in der while schleife steht und folglich immer neu definiert wird!

Da raus und vor die for schleife et voilat es geht wie es soll... Danke dennoch ;D
 
.....
Wenn ich deine while-Schleife ansehe, scheint der Fehler übrigens der zu sein:
PHP:
$arrPos = array();
while($row2 = mysql_fetch_array($result2))
{ 
// $arrPos = array(); // muss vor die Schleife
$arrPos[$j]['text']        = $row2['posbez']; //"Position1.\nbla\nbla\nblub";
$arrPos[$j]['menge']       = $row2['posanzahl']; //1;
$arrPos[$j]['einzelpreis'] = $row2['posnetto']; //20.00;
$gesamt=$row2['posnetto']*$row2['posanzahl'];
$arrPos[$j]['gesamtpreis'] = $gesamt;//number_format($gesamt,"2",",",".");   //$arrPos[0]['menge'] * $arrPos[0]['einzelpreis'];
$arrPos[$j]['steuer']     = $row2['posstr']; //"19";
$j++;
}
Du definierst dass array arrPos immer wieder neu
.......
Aber trotzdem gerne
 
SQL-Queries sollten nach Möglichkeit (sprich: wenn es sich vermeiden lässt) nicht in Schleifen ausgeführt werden.

Tut's nicht vielleicht auch das hier?

PHP:
$result = mysql_query("SELECT * FROM angebotsposition " .
"WHERE userid=".$_SESSION['userid'] . " AND angid=" . $angid." order by angpos");

Von SELECT * ist ebenfalls abzuraten. Wähle die gewünschten Felder lieber explizit aus.
 
Werbung:
Von SELECT * ist ebenfalls abzuraten. Wähle die gewünschten Felder lieber explizit aus.

Theoretisch schon, nur wenn ich Daten aus jedem Feld brauche auch?

SQL-Queries sollten nach Möglichkeit (sprich: wenn es sich vermeiden lässt) nicht in Schleifen ausgeführt werden.

Das Projekt basiert darauf. Oder gibts ne andere Möglichkeit Dynamisch mit Daten aus der DB große Tabellen zu erstellen?

while(row... liest ja nur jeweils einen Datensatz aus.

Mittlerweile habe ich mit FPDF ein anderes Problem:

FPDF error: Unsupported image type: 3
PHP:
$path="http://localhost/projekte/homepage/pics/upload/";
$userid=$_SESSION['userid'];
conndb();
$sql3 = "SELECT userpdflogo FROM userpdf WHERE userid=$userid"; 
$result3 = mysql_query($sql3, $conn);
$row3 = mysql_fetch_array($result3,MYSQL_ASSOC);

$filer = $row3['userpdflogo'];
$picsizer = getimagesize($path.$filer);

$this->Image($path.$row3['userpdflogo'],115, 12,80 ,30,$picsizer[2]);
</SPAN>..pics/upload/1_2011-06-10_13-15-02.jpg

Den Pfad Absolut angeben bringt ebenfalls nichts.
-->http://localhost/projekte/homepage/p...0_13-15-02.jpg

In DB steht der Name der Grafik, die Grafik selbst liegt im Verzeichnis, wie unschwer zu erkennen
icon_biggrin.gif
 
Wenn ich statt
$picsizer[2] ----> 'png'
angebe, kann ich PNG und JPG drucken... da ich Uploads JPG, PNG, GIF zulassen will bringt mir das leider aber nicht viel... und jetzt extra die file extension mit in DB schreiben/auslesen müsste doch eigentlich unnötig sein.
Oder ist das Problem das ich nicht die Grafik an sich sondern nur nen String/Pfad zur Grafik habe?
Bin da seit gestern noch nicht so durchgestiegen..

Gleich noch ne Frage :D
Kann ich beim Upload irgendwie prüfen ob die Grafik nen Alphachannel hat? Das geht bei FPDF ohne die GD2.xx extension ja nicht. Und das jetzt alles zu implementieren ist mir erstmal zu kompliziert. oO
 
Zurück
Oben