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. :)

18 réponses

  1. 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
  2. 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
  3. 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
    1. Utilisateur anonyme
       
      Pardon rectif

      while(($ligneSQL = mysql_fetch_array($execSQL))!==false) {
      if (($ligneSQL["dateannule"] != '0000-00-00') && ($ligneSQL["chequecadeaucmd"] != 1)) {
      //traitement
      }
      }
      0
  4. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
  7. 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
    1. Beninc
       
      J'ai aussi essayer la version while(($ligneSQL = mysql_fetch_array($execSQL)) != false) qui ne change pas le problème.
      0
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. Utilisateur anonyme
     
    Attends j'ai vu un truc debile
    Avant ta boucle while
    $i n'est pas definie non ?
    Mettre $i =0;
    0
  16. Utilisateur anonyme
     
    Et active tes messages d'erreur
    Sans message, impossible de comprendre
    Error_reporting('E_ALL');
    Au debut du code
    0
  17. 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
  18. 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
  19. 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