FPDF / page blanche / boucle while

Résolu
Beninc -  
 Beninc -
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
 
Bonjour,

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

Cordialement
0
Beninc
 
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
 
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
 
Pardon rectif

while(($ligneSQL = mysql_fetch_array($execSQL))!==false) {
if (($ligneSQL["dateannule"] != '0000-00-00') && ($ligneSQL["chequecadeaucmd"] != 1)) {
//traitement
}
}
0
Beninc
 
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
 
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
Beninc
 
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
Beninc
 
J'ai aussi essayer la version while(($ligneSQL = mysql_fetch_array($execSQL)) != false) qui ne change pas le problème.
0
Beninc
 
<?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
Beninc
 
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
 
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
Beninc
 
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
Beninc
 
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
Beninc
 
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
Beninc
 
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
 
Attends j'ai vu un truc debile
Avant ta boucle while
$i n'est pas definie non ?
Mettre $i =0;
0
Utilisateur anonyme
 
Et active tes messages d'erreur
Sans message, impossible de comprendre
Error_reporting('E_ALL');
Au debut du code
0
Beninc
 
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
 
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
Beninc
 
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