FPDF / page blanche / boucle while

Résolu
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. :)

18 réponses

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

                                  while(($ligneSQL = mysql_fetch_array($execSQL))!==false) {
                                  if (($ligneSQL["dateannule"] != '0000-00-00') && ($ligneSQL["chequecadeaucmd"] != 1)) {
                                  //traitement
                                  }
                                  }
                              2. 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(); 
                                 } 
                                ?> 
                                
                                1. Bonjour,

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

                                  Cordialement