Bonjour,

je dois maintenir une appli PHP faite par un stagiaire il y a 2 ans. Problème : je n'avais jamais vu de PHP avant de mettre le nez dans son code (je bosse en C# ou Java d'habitude).

J'avais déjà réussit à corriger quelques bugs dans son code, mais là je patauge dans ce charabia à la limite du compréhensible ... je sais pas si c'est parce que je connais pas PHP ou s'il a codé comme un goret, mais en tout cas je m'y retrouve pas.

Voici donc le message d'erreur survenu lors du passage de la base MySql d'un serveur Windows 2003 à une Debian Lenny (sur Windows ça marchait) :

Warning: Cannot modify header information - headers already sent by (output started at /var/www/Fraudes/obj/Relance.php:87) in /var/www/Fraudes/fpdf/fpdf.php on line 1032
FPDF error: Some data has already been output, can't send PDF file
Ca se produit lorsque l'utilisateur clique sur un bouton qui doit générer un PDF dans une nouvelle fenêtre.

Ce problème est connu d'après ce que j'ai pu trouver à droite à gauche sur le net, toutefois les solutions proposées ne m'ont pas permis de résoudre le problème.

Je comprend bien qu'on ne doit envoyer que le PDF à la nouvelle page, mais je ne vois pas où dans son code il envoie autre chose.

Voici donc le code (application de gestion des fraudes dans les bus ):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
<?php
include_once("../fpdf/fpdf.php");
include_once("../obj/Fraudeur.php");
include_once("../obj/Infraction.php");
include_once("../obj/Adresse.php");
include_once("../obj/Relance.php");
include_once('connexion.php');
include_once('../../Accidents/Utils/droits.php');
 
session_start();
setlocale(LC_TIME,"fr_FR","fra");
 
 
//Si on a un nouveau visiteur, on commence une session avec des objets vides
//Sinon, c'est que l'on édit, on récupère au fur et à mesure
if (!isset ($_SESSION['id']))
{
	 header ('Location: ../../Accidents/Utils/login.php');
}
//Si on a pas les droits de lecture ou d'admin, on dégage
if(!canRead('Fraudes') && !isAdmin('Fraudes')){
	 header ('Location: ../../Accidents/index.php?msg=no');
}
 
function generation($id,$infraction,$ordre,$adresse){
 
  $fr=new Fraudeur();
  $fr->createFromDB($id);
  $inf=new Infraction();
  $inf->createFromDB($infraction);
 
  // une variable qui va stocker la date du jour en unicode
$ladate=strftime("%d %B %Y");
$ladate=iconv('Windows-1252', 'UTF-8//TRANSLIT', $ladate);
 
  //adresse d'optymo
  $adr="bla bla bla";
  $adr2="bla bla bla";
  $obj="bla bla bla".$inf->getid()."\n";
  $obj.="bla bla bla".$inf->getid()."\n ";
  $titre="bla bla bla";
 
 
  if (isset($_GET['act']) && ($_GET['act']=="add")){
	if (isAdmin('Fraudes')||canWrite('Fraudes')){
	  $titre.=$ladate;
      $qry='SELECT COUNT(*) as n FROM NECESSITE WHERE codeRelance='.$ordre.' AND 
idInfraction='.$infraction.' AND dateNecessite!=NULL;';
      $tmp=mysql_query($qry) or die (mysql_error());
      $req=mysql_fetch_array($tmp);
      if ($req['n']==0){
	$qry='UPDATE NECESSITE SET dateNecessite=now() WHERE codeRelance='.$ordre.'
AND idInfraction='.$infraction.';';
	mysql_query($qry);
      }
    }
  }
  //cas ou le pdf a déjà été généré
  else if (isset($_GET['act']) && ($_GET['act']=="prev")){
    $titre.=$ladate;
  }
  //si on veut récup la date de premiere génération du pdf dans le pdf
  else {
    $qry='SELECT dateNecessite FROM NECESSITE WHERE codeRelance='.$ordre.' AND 
idInfraction='.$infraction.';';
    $tmp=mysql_query($qry) or die (mysql_error());
    $rep=mysql_fetch_array($tmp);
    $datetemp=split_words($rep[0],"-");
    $datelettre=mktime(0,0,0,$datetemp[1],$datetemp[2],$datetemp[0]);
    $titre.=strftime("%d %B %Y",$datelettre);
  }
 
  $signature="Le Directeur d'Exploitation";
 
  //calcule si la personne est mineure
  $annee1=strtotime($fr->getdatenaissance());
  $annee2=strtotime("now");
  $res=$annee2-$annee1;
  if ($res/31556926 < 18){
    if ($ordre==-1)
      creationpdf($fr,$inf,$adresse,$adr,$adr2,$obj,$titre,$signature);
    else {
      $qry='SELECT delaisRelance FROM RELANCE WHERE codeRelance='.$ordre.';';
      $tmp=mysql_query($qry) or die (mysql_error());
      $res=mysql_fetch_array($tmp);
      $qry='SELECT MIN(delaisRelance) FROM RELANCE;';
      $tmp=mysql_query($qry) or die (mysql_error());
      $res2=mysql_fetch_array($tmp);
      //Savoir si c'est la premiere relance
      if ($res[0]==$res2[0])
	$preums=1;
      else
	$preums=0;
      pdfrelance($fr,$inf,$adresse,$adr,$adr2,$obj,$titre,$signature,$preums,1,$res[0]);
    }
  }
  //si majeur
  else {
    $qry='SELECT delaisRelance FROM RELANCE WHERE codeRelance='.$ordre.';';
    $tmp=mysql_query($qry) or die (mysql_error());
    $res=mysql_fetch_array($tmp);
    $qry='SELECT MIN(delaisRelance) FROM RELANCE;';
    $tmp=mysql_query($qry) or die (mysql_error());
    $res2=mysql_fetch_array($tmp);
 
    //Savoir si c'est la premiere relance
    if ($res[0]==$res2[0])
      $preums=1;
    else
      $preums=0;
    pdfrelance($fr,$inf,$adresse,$adr,$adr2,$obj,$titre,$signature,$preums,0,$res[0]);
  }
}
 
if(isset($_GET['id'])&&isset($_GET['inf'])&&isset($_GET['od'])&&isset($_GET['ad'])){ 
  $_POST['PDF'] = new FPDF();
  generation($_GET['id'],$_GET['inf'],$_GET['od'],$_GET['ad']);
  output_pdf($_POST['PDF']);
 }
//générer toutes les relances
 else if (isset($_GET['od'])&& isset($_GET['all'])){
   $_POST['PDF'] = new FPDF();
   //sélection des personnes à relancer
   $qry='SELECT * FROM INFRACTION,FRAUDEUR,RELANCE,NECESSITE WHERE dateNecessite IS NULL AND RELANCE.codeRelance='.$_GET['od'].'
AND INFRACTION.idFraudeur=FRAUDEUR.idFraudeur AND RELANCE.codeRelance=NECESSITE.codeRelance AND INFRACTION.idInfraction=NECESSITE.idInfraction 
AND INFRACTION.idProcedure IS NULL;';
   $tmp=mysql_query($qry) or die (mysql_error());
   while ($res=mysql_fetch_array($tmp)){
     $qryadresse='SELECT idAdresse FROM ADRESSE WHERE ADRESSE.idFraudeur='.$res['idFraudeur'].' AND fausseAdresse =0 ORDER BY idAdresse DESC;';
     $tmpadresse=mysql_query($qryadresse) or die (mysql_error());
     $resadresse=mysql_fetch_array($tmpadresse);
     //empêche la génération si aucune adresse n'est valide
     if (mysql_num_rows($tmpadresse)>0)
       generation($res['idFraudeur'],$res['idInfraction'],$_GET['od'],$resadresse[0]);
 
   }
   output_pdf($_POST['PDF']);
 }
//découpage de chaine de caractere
function split_words($string,$car){ 
  $retour = array(); 
  $delimiteurs = $car; 
  $tok = strtok($string, $car); 
  while (strlen(join($car, $retour)) != strlen($string)) { 
    array_push($retour, $tok); 
    $tok = strtok ($delimiteurs); 
  } 
  return $retour; 
}
 
//lettre d'information pour fraudeur mineur
function creationpdf($fr,$inf,$adf,$adr,$adr2,$obj,$titre,$signature) {
  $adrfraudeur="Madame ou Monsieur parents de\n";
  $intro="      "."Madame, Monsieur,";
  $corps="      "."Le ";
  $dateinf=split_words($inf->getdate(),"-");
  $corps.=$dateinf[2].'/'.$dateinf[1].'/'.$dateinf[0];
  $corps.=", votre enfant qui voyageait dans l'un de nos bus, n'a ";
  $corps.="pu, lors d'un contrôle, présenter un titre de transport valable à notre agent assermenté";
  $corps.="\n\n"."      "."Nous lui avons donc dressé un procès verbal d'infraction et lui en avons remis un double.";
  $corps.="\n\n"."      "."Sur ce procès-verbal figure le montant de l'indemnité forfaitaire qui ";
  $corps.="correspond à une transaction libératoire de toute poursuite.";
  $corps.="\n\n"."      "."Nous vous prions d'agréer, Madame, Monsieur, l'expression de nos sentiments distingués.";
 
 
  $adrfraudeur.=$fr->getnom()." ";
  $adrfraudeur.=$fr->getprenom()."\n";
 
 
  $adresse=new Adresse();
  $adresse->createFromDB($adf);
  $adrfraudeur.=$adresse->getrue()."\n";
  if ($adresse->getcomplement()!="")
    $adrfraudeur.=$adresse->getcomplement()."\n";
  $adrfraudeur.=$adresse->getcp()." ".$adresse->getcommune();
 
  $_POST['PDF']->AddPage();
  $_POST['PDF']->SetFont('Arial','B',12);
  $_POST['PDF']->setXY(10,15);
  $_POST['PDF']->MultiCell(90,5, utf8_decode($adr), 0, "C", 0);
  $_POST['PDF']->SetFont('');
  $_POST['PDF']->MultiCell(90,5, utf8_decode($adr2),0, "C",0);
  $_POST['PDF']->setY(50);
  $_POST['PDF']->setX(120);
  $_POST['PDF']->MultiCell(90,5,utf8_decode($adrfraudeur),0, "L",0);
  $_POST['PDF']->setY(85);
  $_POST['PDF']->setX(7);
  $_POST['PDF']->MultiCell(90,5,utf8_decode($obj),0, "L",0);
  $_POST['PDF']->setXY(120,115);
  $_POST['PDF']->MultiCell(90,5,utf8_decode($titre),0, "L",0);
  $_POST['PDF']->setXY(30,130);
  $_POST['PDF']->MultiCell(80,5,utf8_decode($intro),0,"L",0);
  $_POST['PDF']->setXY(30,140);
  $_POST['PDF']->MultiCell(150,5,utf8_decode($corps),0,"J",0);
  $_POST['PDF']->setX(130);
  $_POST['PDF']->MultiCell(60,5,utf8_decode("\n\n\n\n".$signature),0,"L",0);
  $_POST['PDF']->Output("inf".$inf->getid().".pdf","D");
  }
 
//lettre relance pour mineur ou majeur
function pdfrelance($fr,$inf,$adf,$adr,$adr2,$obj,$titre,$signature,$preums,$jeune,$delrel) {
  /*  $PDF = new FPDF();
   $PDF->AddPage();*/
  $corps="      "."Le ";
  $dateinf=split_words($inf->getdate(),"-");
  $corps.=$dateinf[2].'/'.$dateinf[1].'/'.$dateinf[0];
  if ($jeune==1){
    $adrfraudeur="Madame ou Monsieur parents de\n";
    $intro="      "."Madame, Monsieur,";
    $corps.=", votre enfant qui voyageait dans l'un de nos bus, n'a pu, lors d'un contrôle, ";
  }
  else {
    $adrfraudeur=$fr->getcivilite()."\n";
    $intro="      ".$fr->getcivilite().",";
    $corps.=", au cours d'un contrôle, vous n'avez pas pas pu ";
  }
  $corps.="présenter un titre de transport valable à notre agent assermenté.";
 
  $corps.="\n\n"."      ";
  if ($jeune==1)
    $corps.="Nous lui ";
  else 
    $corps.="Nous vous ";
  $corps.="avons donc dressé un procès verbal d'infraction et ";
  if ($jeune==1)
    $corps.="lui ";
  else
    $corps.="vous ";
  $corps.="en avons remis un double.";
 
  //recuperation categorie infraction
  /* 03/12/2009 JMN - modification de la requete sql afin de prendre effectivement en compte l'infraction par son ID
   * Code original : $qry="SELECT tarifCategorie FROM CATEGORIE,GENRE,INFRACTION WHERE INFRACTION.idGenre=GENRE.idGenre AND GENRE.idCategorie=CATEGORIE.idCategorie";
   */
  $qry="SELECT tarifCategorie FROM CATEGORIE,GENRE,INFRACTION WHERE INFRACTION.idGenre=GENRE.idGenre AND GENRE.idCategorie=CATEGORIE.idCategorie AND INFRACTION.idInfraction=".$inf->getid().";";
  $tmp=mysql_query($qry) or die (mysql_error());
  $res=mysql_fetch_array($tmp);
  $montant=$res[0];
 
  //mineur
  if ($jeune==0){
    $corps.="\n\n"."      ";
    $corps.="Le contrôleur qui a constaté votre infraction vous a proposé le paiement immédiat ";
    $corps.="de ".$montant." ";
    $corps.="Euros et à défaut, nous vous avons informé que le règlement pourrait s'effectuer dans ";
    $corps.="nos services dans un délai de HUIT JOURS à compter de la date de l'infraction.";
  }
  $corps.="\n\n"."      ";
  $corps.="Aucun règlement n'ayant été effectué à ce jour, nous vous signalons que l'indemnité ";
 
  //recuperation des frais
  $qry="SELECT fraisRelance FROM RELANCE,INFRACTION,NECESSITE WHERE NECESSITE.codeRelance=RELANCE.codeRelance AND
NECESSITE.idInfraction=INFRACTION.idInfraction AND delaisRelance<=".$delrel." AND INFRACTION.idInfraction=".$inf->getid().";";
  $tmp=mysql_query($qry) or die (mysql_error());
  $major=0;
  while($res=mysql_fetch_array($tmp)){
    $major=$major+$res['fraisRelance'];
  }
 
  $corps.="forfaitaire de ".$montant." Euros est majorée de ".$major." Euros pour frais de dossier.";
 
  //si premiere lettre
  if ($preums==1){
    $corps.="\n\n"."      ";
    $corps.="Nous vous rappelons qu'à défaut de règlement dans les DEUX MOIS suivant l'infraction, ";
    $corps.="vous serez redevable d'une amende forfaitaire majorée recouvrée par le Trésor Public d'un ";
    $corps.="montant de 305 Euros.";
  }
 
  $corps.="\n\n"."      ";
  $somme=$montant+$major;
  $corps.="C'est  pourquoi,  nous  vous  invitons  à  vous  acquitter  de  la  somme  de ".$somme." Euros ";
 
  //on récup la prochaine relance
  $qry='SELECT MIN(delaisRelance) FROM RELANCE WHERE delaisRelance>'.$delrel.';';
  $tmp=mysql_query($qry) or die (mysql_error());
  $min=mysql_fetch_array($tmp);
  $del=split_words($inf->getdate(),"-");
  if ($min[0]!="")
    $ajout=$min[0];
  else {
    $ajout=60;
    $obj.="\nDERNIER AVIS AVANT POURSUITES";
  }
  $delai=date("d/m/Y",mktime(0,0,0,$del[1],$del[2]+$ajout,$del[0]));
 
 
  $corps.="avant le ".$delai." ; passé ce délai, nous serons dans l'obligation d'appliquer la règlementation ";
  $corps.=" indiquée sur le récepissé du procès-verbal.";
  $corps.="\n\n"."      "."Nous vous prions d'agréer, Madame, Monsieur, l'expression de nos sentiments distingués.";
 
 
 
  $adrfraudeur.=$fr->getnom()." ";
  $adrfraudeur.=$fr->getprenom()."\n";
  //ajouter l'adresse
  $adresse=new Adresse();
  $adresse->createFromDB($adf);
  $adrfraudeur.=$adresse->getrue()."\n";
  if ($adresse->getcomplement()!="")
    $adrfraudeur.=$adresse->getcomplement()."\n";
  $adrfraudeur.=$adresse->getcp()." ".$adresse->getcommune();
 
  $ps="P.S. Veuillez ne pas tenir compte de ce courrier si vous avez déjà effectué le règlement.";
  //Sélection de la police
  $_POST['PDF']->AddPage();
  $_POST['PDF']->SetFont('Arial','B',12);
  $_POST['PDF']->setXY(10,15);
  $_POST['PDF']->MultiCell(90,5, utf8_decode($adr), 0, "C", 0);
  $_POST['PDF']->SetFont('');
  $_POST['PDF']->MultiCell(90,5, utf8_decode($adr2),0, "C",0);
  $_POST['PDF']->setY(45);
  $_POST['PDF']->setX(120);
  $_POST['PDF']->MultiCell(90,5,utf8_decode($adrfraudeur),0, "L",0);
  $_POST['PDF']->setY(70);
  $_POST['PDF']->setX(7);
  $_POST['PDF']->MultiCell(90,5,utf8_decode($obj),0, "L",0);
  $_POST['PDF']->setXY(120,96);
  $_POST['PDF']->MultiCell(90,5,utf8_decode($titre),0, "L",0);
  $_POST['PDF']->setXY(30,105);
  $_POST['PDF']->MultiCell(80,5,utf8_decode($intro),0,"L",0);
  $_POST['PDF']->setXY(30,115);
  $_POST['PDF']->MultiCell(150,5,utf8_decode($corps),0,"J",0);
  $_POST['PDF']->setX(130);
  $_POST['PDF']->MultiCell(60,5,utf8_decode("\n\n".$signature),0,"L",0);
  $_POST['PDF']->setXY(30,265);
  $_POST['PDF']->MultiCell(150,5,utf8_decode($ps),0,"J",0);
}
 
//nom du fichier de sortie
function output_pdf($PDF){
  if (isset($_GET['inf']) && $_GET['inf']!="")
    $_POST['PDF']->Output($_GET['od']."_".$_GET['inf'].".pdf","D");
  else
    $_POST['PDF']->Output("lst_".$_GET['od'].".pdf","D");
}
?>
Si une bonne âme souhaite se pencher sur le problème, je suis ouvert à toutes les suggestions (sauf réécrire en C#, ça m'a déjà été refusé ).