FPDF / page blanche / boucle while

Résolu/Fermé
Beninc - 8 févr. 2011 à 17:35
 Beninc - 10 févr. 2011 à 10:52
Bonjour,

j'ai un mini problème avec FPDF.

J'ai créer une facture type, qui fonctionne parfaitement, en allant chercher des données dans une BDD.

Le problème est que, lorsque je me une boucle WHILEpour créer plusieurs facture selon le nombre de donnée dans la BDD, et bien, je me retrouve avec une page blanche.

J'ai parcourus les forums du monde entiers pour trouver.. rien...

Si quelqu'un a une idée, voir une solution, je suis preneur !

Merci d'avance. :)

A voir également:

18 réponses

Utilisateur anonyme
9 févr. 2011 à 09:53
Bonjour,

Le prob doit être autour de la boucle While, vous avez un bout de code pour regarder ce qui cloche ?

Cordialement
0
Heureux de voir une réponse =)

Voici mon code :
( je rappelle quand effectivement ,sans la boucle le pdf fonctionne, mais ne renvois qu'une page (logique) )


ps : J'ai virer l'indentation de la boucle While
<?php 
 session_start(); 
 error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); 

 //http://www.fpdf.org/ 
 include('../include/connexionbdd.php'); 

 if ($_SESSION['identification'] != "admin") 
 { 
  echo "Vous n'avez pas l'autorisation d'acceder à cette page."; 
  exit; 
 } 
 else 
 { 
  require('../fpdf16/fpdf.php'); 
  //Creer le pdf 
  $pdf=new FPDF('P','mm','A4'); 

  //Le début de l'aventure ! 
  $datesql = date("Y-m"); 
  $reqSQL = "SELECT * FROM commande WHERE datecmd LIKE '".$datesql."%'"; 
  $execSQL = mysql_query($reqSQL) or die ("Echec de la requête ".$reqSQL); 
  $ligneSQL = mysql_fetch_array($execSQL);    

  while($ligneSQL != false) 
  { 
   if($ligneSQL["dateannule"] == '0000-00-00' || $ligneSQL["chequecadeaucmd"] == 1) 
   { 
    $ligneSQL = mysql_fetch_array($execSQL);  
   } 
   else 
   { 
$date=date("d/m/Y"); 

//Infos commande 
$datecmd = $ligneSQL["datecmd"]; 
$datecmd = substr($datecmd,8,2)."-".substr($datecmd,5,2)."-".substr($datecmd,0,4); 
$codedistribcmd = $ligneSQL["codedistribcmd"]; 
$codeclecmd = $ligneSQL["codeclecmd"]; 

//Infos distrib 
$reqDistrib = "SELECT * FROM distributeur WHERE codedistrib = '".$codedistribcmd."'"; 
$execDistrib  = mysql_query($reqDistrib ) or die ("Echec de la requête ".$reqDistrib ); 
$ligneDistrib =mysql_fetch_array($execDistrib ); 

$nomdistrib = $ligneDistrib["nomdistrib"]; 
$adressedistrib = $ligneDistrib["adressedistrib"]; 
$cpdistrib = $ligneDistrib["cpdistrib"]; 
$villedistrib = $ligneDistrib["villedistrib"]; 
$nbfacturedistrib = $ligneDistrib["nbfacturedistrib"]; 
if($nbfacturedistrib == "") 
{ 
 $nbfacturedistrib = 0; 
} 

//Infos clé 
$reqCmd = "SELECT * FROM cles WHERE codecle = '".$codeclecmd."'"; 
$execCmd = mysql_query($reqCmd ) or die ("Echec de la requête ".$reqCmd."<br/>".mysql_error() ); 
$ligneCmd = mysql_fetch_array($execCmd ); 

$codecle = $ligneCmd["codecle"]; 
$nomcle = $ligneCmd["nomcle"]; 
$prixcledistrib = $ligneCmd["prixcledistrib"]; 

//Infos facture 
$reqFac = "SELECT * FROM facture"; 
$execFac = mysql_query($reqFac ) or die ("Echec de la requête ".$reqFac ); 
$ligneFac = mysql_fetch_array($execFac ); 

$nbfacture = $ligneFac["nbfacture"]; 
if($nbfacture == "") 
{ 
 $nbfacture = 0; 
} 
$nbfacture = $nbfacture + 1; 
$datenumfacture = date("Ym"); 

//On récupère la TVA 
$reqSQLtva="SELECT valeurprix FROM prix WHERE nomprix = 'TVA'"; 
$execSQLtva = mysql_query($reqSQLtva) or die ("Echec de la requête ".$reqSQLtva); 
$ligneSQLtva = mysql_fetch_array($execSQLtva);   
$tva = $ligneSQLtva["valeurprix"];  

$montanttva = $prixcledistrib * ($tva / 100); 
$montanttva = round($montanttva, 2); 
$prixcledistribTVA = $prixcledistrib + $montanttva; 

//Construction numéro de facture 
$numfacture = $datenumfacture."-".$nbfacturedistrib."-".$nbfacture; 

//Creer une page 
$pdf->AddPage(); 
// Couleur gris claire pour les en-tete 
$pdf->SetFillColor(232,232,232); 

//////////////////////// 
// EN TETE  // 
//////////////////////// 
$pdf->Rect(5,5,200,25); 
$pdf->SetFont('Arial','B',15); 
$pdf->Cell(0,0,'NOMBOITE',0,1); 
$pdf->Ln(5); 
$pdf->SetFont('Arial','B',10); 
$pdf->Cell(0,0,'www.NOMBOITE.fr',0,1); 
$pdf->Ln(5); 
$pdf->Cell(0,0,'************* - Tel : **-**-**-**-**); 
$pdf->Image('../include/ban.jpeg',163,7,40); 
$pdf->Ln(5); 
$pdf->Cell(0,0,'SIRET : *** *** *** ***** *** *******  -  T.V.A ************',0,1); 

//////////////////////// 
// PARTIE HAUT GAUCHE // 
//////////////////////// 
$pdf->Rect(5,33,95,35); 
$pdf->SetFont('Arial','B',10); 
$pdf->Ln(12); 
$pdf->Cell(0,0,'Facture N\' : '.$numfacture,0,1); 
$pdf->setX(114); 
$pdf->Cell(0,0,'Client :',0,1); 
$pdf->Ln(8); 
$pdf->Cell(0,0,'Date : '.$datecmd,0,1); 

//////////////////////// 
// PARTIE HAUT DROITE // 
//////////////////////// 
$pdf->Rect(110,33,95,35); 
$pdf->setX(114); 
$pdf->Cell(0,0, $nomdistrib,0,1); 
$pdf->Ln(5); 
$pdf->setX(114); 
$pdf->Cell(0,0,$adressedistrib,0,1); 
$pdf->Ln(5); 
$pdf->setX(114); 
$pdf->Cell(0,0,$cpdistrib.' '.$villedistrib,0,1); 

//////////////////// 
// PARTIE MILIEUX // 
//////////////////// 
//Rectangle central 
$pdf->Rect(5,71,200,190); 
// Premiere ligne 
$pdf->Rect(5,71,200,10,FD); 
$pdf->Ln(23); 
$pdf->Cell(0,0,'Code',0,1); 
$pdf->setX(35); 
$pdf->Cell(0,0,'Designation',0,1); 
$pdf->setX(130); 
$pdf->Cell(0,0,'Qte',0,1); 
$pdf->setX(160); 
$pdf->Cell(0,0,'P.U(H.T)',0,1); 
$pdf->setX(180); 
$pdf->Cell(0,0,'TOTAL(H.T)',0,1); 
// Deuxieme ligne 
$pdf->Ln(8); 
$pdf->Cell(0,0,$codecle,0,1); 
$pdf->setX(35); 
$pdf->Cell(0,0,$nomcle,0,1); 
$pdf->setX(130); 
$pdf->Cell(0,0,'1',0,1); 
$pdf->setX(160); 
$pdf->Cell(0,0,$prixcledistrib,0,1); 
$pdf->setX(180); 
$pdf->Cell(0,0,$prixcledistribTVA,0,1); 
// Lignes verticales du rectangle central 
$pdf->Rect(5,71,26,20); 
$pdf->Rect(5,71,122,20); 
$pdf->Rect(5,71,152,20); 
$pdf->Rect(5,71,173,20); 
// Lignes horizontales du rectangle central 
$pdf->Rect(5,71,200,20); 

/////////////////// 
// PARTIE DU BAS // 
///////////////////   
$pdf->SetFont('Arial','IU',9); 
$pdf->Ln(182); 
$pdf->Cell(0,0,'Paiement 30 jours fin de mois',0,1); 

// Deux rectangles horizontales 
$pdf->Rect(60,264,145,8,FD); 
$pdf->Rect(60,264,145,16); 
// Lignes verticales 
$pdf->Rect(60,264,37,16); 
$pdf->Rect(60,264,73,16); 
$pdf->Rect(60,264,109,16); 
// Titre ligne 1 
$pdf->SetFont('Arial','B',10); 
$pdf->setX(74); 
$pdf->Cell(0,0,'Montant H.T',0,1); 
$pdf->setX(117); 
$pdf->Cell(0,0,'% TAXE',0,1); 
$pdf->setX(143); 
$pdf->Cell(0,0,'Montant Taxe',0,1); 
$pdf->setX(178); 
$pdf->Cell(0,0,'Montant T.T.C',0,1); 

$pdf->Ln(8); 
$pdf->Cell(0,0,'Facture en Euro',0,1); 
// Montant ligne 2 
$pdf->setX(80); 
$pdf->Cell(0,0,$prixcledistrib,0,1); 
$pdf->setX(117); 
$pdf->Cell(0,0,$tva,0,1); 
$pdf->setX(151); 
$pdf->Cell(0,0,$montanttva,0,1); 
$pdf->setX(186); 
$pdf->Cell(0,0,$prixcledistribTVA,0,1); 

$ligneSQL = mysql_fetch_array($execSQL); 
   } 
  } 
  $pdf->Output(); 
 } 
?> 
0
Utilisateur anonyme
9 févr. 2011 à 10:41
Re

Déjà regarde cette ligne

$pdf->Cell(0,0,'************* - Tel : **-**-**-**-**);

Il manque une apostrophe à la fin

$pdf->Cell(0,0,'************* - Tel : **-**-**-**-**');

Après je ferais plus ceci pour la boucle

while(mysql_fetch_array($execSQL)!==false) {
if (($ligneSQL["dateannule"] != '0000-00-00') && ($ligneSQL["chequecadeaucmd"] != 1)) {
//traitement
}
}

C'est plus simple. Evitez aussi les like surtout sur une date, ça empêche l'utilisation d'index écrivez plutôt WHERE datecmd between '.$dateSQL.'01 and '.$dateSQL.'31

enfin 31 c'est pas très beau mais vous voyez sans doute l'idée
0
Utilisateur anonyme
9 févr. 2011 à 10:44
Pardon rectif

while(($ligneSQL = mysql_fetch_array($execSQL))!==false) {
if (($ligneSQL["dateannule"] != '0000-00-00') && ($ligneSQL["chequecadeaucmd"] != 1)) {
//traitement
}
}
0
Pour l'apostrophe j'ai l'avais supprimer en remplaçant le numéro de tel par **, mais il y était bien.

Pour la date et le LIKE, disons que ça permet de sortir toute les factures correspondantes sans avoir a choisir de date, mais effectivement je partirais sur un between je pense après donc je vais m'y mettre.

Pour le while :

while(($ligneSQL = mysql_fetch_array($execSQL))!==false)

et

while($ligneSQL != false)

sont sensiblement la même chose non ? Quel est la différence ?
La requête s'exécute dans le while si on utilise votre méthode non ?

(non je ne critique pas, je veux saisir toute la subtilité de la chose =)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
9 févr. 2011 à 11:15
Disons que c'est plus lisible, c'est tout

Donc ce n'était pas l'apostrophe alors...

Dans ce cas procédez par étapes.

Commentez toute la partie pdf après $date=date("d/m/Y") avec /*
et fermez le commentaire */ avant $ligneSQL = mysql_fetch_array($execSQL); }} $pdf->Output();
ajoutez après $date=("d/m/Y");
un echo $ligneSQL["datecmd"].'<br/>';

Comme ça vous verrez si la boucle fonctionne bien, si ça marche, réduisez votre zone commentée petit à petit, vous allez tomber sur le bug de cette façon

Ha oui, tout en haut du code mettez un error_reporting(E_ALL);
histoire de voir les messages d'erreur
0
Hum étrange.. Je pensais que ça afficherais quelque chose mais non.
J'ai fais ça :
$i = 1;
while($ligneSQL != false)
{
   $pdf->AddPage();
   $pdf->Cell(0,0,$i,0,1);
   $i = $i + 1;

   $ligneSQL = mysql_fetch_array($execSQL);
}
$pdf->Output();



Avec le reste de la page qui n'a pas changé.

Il m'affiche encore une page blanche.

Pourtant si je fais
$pdf->AddPage();
echo $i."<br/>";
$i = $i + 1;


Il m'affiche :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FPDF error: Some data has already been output, can't send PDF file


En format html et non pas pdf ( s'qui à du sens )
0
J'ai aussi essayer la version while(($ligneSQL = mysql_fetch_array($execSQL)) != false) qui ne change pas le problème.
0
<?php
	require('../fpdf16/fpdf.php');
	$pdf=new FPDF('P','mm','A4');		

	$i = 1;
	while($i < 10)
	{			
		$pdf->AddPage();
		$pdf->Cell(0,0,$i,0,1);
		$i = $i + 1;
	}
	
	$pdf->Output();
?>




J'ai simplifier la chose à ça, mais toujours une page blanche.
Donc c est vraiment le while qui fout la m***e..
0
Ok alors j'ai tester le bout de code while $i sur un fpd qui fonctionne, en faite le while m'affiche rien du tout, c'est pour ça que j'ai une page blanche.

J'avais foutu le while avec des saut de ligne + l'affichage du $i, mais rien du tout. Juste le pdf normal.
0
Utilisateur anonyme
9 févr. 2011 à 11:57
Oui, tu crée un fichier PDF vide à priori, si tu mets un echo en plus avant le output c'est normal qu'il couine

Mais un $pdf->Cell(200,200,'coucou'); devrait t'afficher quelques chose
un $pdf->Cell(0,0, $i) c'est un peu pas très haut pour une cellule 0
0
Disons qu'il y a des marges avec.
Mais même avec un

require('../fpdf16/fpdf.php');
$pdf=new FPDF('P','mm','A4');
$pdf->AddPage();
while($i < 10)
{
$pdf->Cell(150,150,$i,0,1);
$i = $i + 1;
}
$pdf->Output();

rien ne s'affiche.

Pourtant j'ai un exemple de fpdf venant d'un ami, avec une boucle while, qui fonctionne parfaitement..
Je ne vois vraiment pas ou est le problème :/
0
Bon je comprend pas.

J'ai creer une nouvelle page.
Dedans je met ça :

<?php
	require('../fpdf16/fpdf.php');
	$pdf=new FPDF('P','mm','A4');		
	$pdf->AddPage();
	
	$pdf->Cell(0,0,'BON DE COMMANDE - Partie FrenchKeys',0,1);
	
	$pdf->Output();
?>


Du copier coller exacte de mon pdf qui fonctionne.

Et pourtant, j'ai une page blanche... o.o'
0
Apres moulte test, l'erreur viendrait de ça :

if($ligneSQL["dateannule"] == '0000-00-00' || $ligneSQL["chequecadeaucmd"] == 1)

ou $ligneSQL["chequecadeaucmd"] == 1 fonctionne, mais ou
$ligneSQL["dateannule"] == '0000-00-00' ne fonctionne pas.

Meme en utilisant des variable du type

$vardate = $ligneSQL["dateannule"];
$vardateannule = '0000-00-00';

while($ligneSQL != false)
{
if($vardate == $vardateannule || $ligneSQL["chequecadeaucmd"] == 1)
......
0
Bon en faite, c'était une erreur humaine.

$ligneSQL["dateannule"] == '0000-00-00'

aurait du etre

$ligneSQL["dateannule"] != '0000-00-00'

Effectivement la page blanche était normale.

Mais après le coup des pages blanche était étrange dans le cas des pages simples. ( qui parfois fonctionnaient sur chrome et pas sur firefox o.o )

Bref, cela fonctionne, tout est nikel.

Merci du coup de main, et bonne continuation =)
0
Utilisateur anonyme
9 févr. 2011 à 16:19
Attends j'ai vu un truc debile
Avant ta boucle while
$i n'est pas definie non ?
Mettre $i =0;
0
Utilisateur anonyme
9 févr. 2011 à 16:21
Et active tes messages d'erreur
Sans message, impossible de comprendre
Error_reporting('E_ALL');
Au debut du code
0
Attends j'ai vu un truc debile
Avant ta boucle while
$i n'est pas definie non ?
Mettre $i =0;


Ahah, non j'ai du rater un copier coller ^^

Sinon en haut de ma page j'avais déjà
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
de noté, mais bon, le problème venait de ma mauvaise condition, et d'un firefox qui avait du mal, au niveau du cache ou au niveau des cookies je sais pas, enfin, ça fonctionne maintenant.
0
Utilisateur anonyme
10 févr. 2011 à 08:17
Hum le cache,

En PHP il est conseillé de vider le cache des pages pour éviter ce problème :

header("cache-control:no-cache,no-store,must-revalidate");
header("pragma:no-cache");
0
Ouai effectivement, ça semble intéressent d'utiliser ça.
Merci pour le conseil.

A tout hasard, si je te redirige vers un autre topic :

https://forums.commentcamarche.net/forum/affich-20795656-france-map-probleme-de-bdd-d-affichage

Tu pense pouvoir m'aider ?
0