Page 1 sur 3

Cannot modify header information - headers already sent by..

Posté : 12 sept. 2006, 11:15
par tchobec
Bonjour,

je sais, vous allez me dire de chercher dans les sujets du forum et dans la FAQ, la réponse s'y trouve.

Je vous rassure, c'est chose faite. J'ai épluché tous les posts concernant cette erreur, j'ai appliqué les conseils que j'y ai trouvé ( suppression des espaces, pas de code html avant, ni dans le fichier appelé par include, etc ...) et pourtant j'ai toujours la même erreur :
Warning: Cannot modify header information - headers already sent by (output started at d:\easyphp1-8\www\genealogie\insert_naissance.php:1) in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 52
Le plus surprenant, c'est que j'ai fameux "header" dans mon premier fichier (insert_individu.php) qui redirige vers le second fichier (insert_naissance.php) qui fonctionne, après validation, ça marche mais pas après validation du second formulaire (dans insert_naissance.php) pour diriger vers le fichier suivant (insert_mariage.php).

Les lignes de codes sont pour moi identiques, à l'exception des requêtes bien sûr. Voici le début des 2 fichiers :

insert_individu.php
<?php require_once('Connections/genealogie.php'); ?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $HTTP_SERVER_VARS['PHP_SELF'];
if (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
  $editFormAction .= "?" . $HTTP_SERVER_VARS['QUERY_STRING'];
}

if ((isset($HTTP_POST_VARS["MM_insert"])) && ($HTTP_POST_VARS["MM_insert"] == "insert_individu")) {
  $insertSQL = sprintf("INSERT INTO liste_individus (Sosa, Generation, Nom, Prenom1, Prenom2, Prenom3, Sexe, photo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($HTTP_POST_VARS['sosa'], "int"),
                       GetSQLValueString($HTTP_POST_VARS['generation'], "int"),
                       GetSQLValueString($HTTP_POST_VARS['nom'], "text"),
                       GetSQLValueString($HTTP_POST_VARS['prenom1'], "text"),
                       GetSQLValueString($HTTP_POST_VARS['prenom2'], "text"),
                       GetSQLValueString($HTTP_POST_VARS['prenom3'], "text"),
                       GetSQLValueString($HTTP_POST_VARS['sexe'], "text"),
                       GetSQLValueString($HTTP_POST_VARS['photo'], "int"));

  mysql_select_db($database_genealogie, $genealogie);
  $Result1 = mysql_query($insertSQL, $genealogie) or die(mysql_error());

  $insertGoTo = "insert_naissance.php";
  if (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $HTTP_SERVER_VARS['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo)); /* LIGNE 52 */
}
?>
insertion_naissance.php
<?php require_once('Connections/genealogie.php');?>
<?php
/* REQUETE D'INSERTION DANS LA BASE DE DONNEES */
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
  
  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $HTTP_SERVER_VARS['PHP_SELF'];
if (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
  $editFormAction .= "?" . $HTTP_SERVER_VARS['QUERY_STRING'];
}

if ((isset($HTTP_POST_VARS["MM_insert"])) && ($HTTP_POST_VARS["MM_insert"] == "insert_naissance")) {
  $insertSQL = sprintf("INSERT INTO liste_naissances (Type, Ref_individu, naiss_jour, naiss_mois, naiss_annee, Ref_commune, Poss_acte) VALUES (%s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($HTTP_POST_VARS['insert_type'], "text"),
                       GetSQLValueString($HTTP_POST_VARS['id_individu'], "int"),
                       GetSQLValueString($HTTP_POST_VARS['jour_naiss'], "int"),
                       GetSQLValueString($HTTP_POST_VARS['mois_naiss'], "int"),
                       GetSQLValueString($HTTP_POST_VARS['annee_naiss'], "int"),
                       GetSQLValueString($HTTP_POST_VARS['commune_naiss'], "int"),
                       GetSQLValueString($HTTP_POST_VARS['possession_acte_naiss'], "int"));
					   
  mysql_select_db($database_genealogie, $genealogie);
  $Result1 = mysql_query($insertSQL, $genealogie) or die(mysql_error());
  
  $insertGoTo = "insert_mariage.php";
  if (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $HTTP_SERVER_VARS['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo)); /* LIGNE 52 */
}
/* FIN DE REQUETE D'INSERTION DANS LA BASE DE DONNEES */
?>

Le fait de laisser ou de supprimer les espaces ou les retours chariot dans le code PHP ne change absolument rien.
A mon avis le problème vient peut-être de la variable %s appelée par le header du deuxième fichier, mais j'ai essayé de la changer et rien n'y fait non plus.

Je coince et je demande un peu d'aide, SVP.

Posté : 12 sept. 2006, 11:20
par Truc
Salut,
Commence par supprimer les jointures de balises PHP :
<?php require_once('Connections/genealogie.php');?>
<?php 
function GetSQLValueString...
à remplacer par :
<?php require_once('Connections/genealogie.php');
function GetSQLValueString....

Posté : 12 sept. 2006, 11:43
par Ryle
Il y a un "<?php" redondant qui s'est glissé insidieusement (et automatiquement) dans le code de Truc, mais c'est effectivement de la que vient ton soucis. Entre tes deux <?php ... ?> tu as un retour à la ligne en dehors des balises php, du coup envoyé au navigateur comme début de la page empêchant ainsi le header() de fonctionner :)

Posté : 12 sept. 2006, 21:40
par tchobec
Supprimer ou non les jointures PHP ne change rien, dans mon premier fichier, cette jointure existe et ça fonctionne, de même que les espaces entre les balises <?php et ?>.

J'ai toutefois ré-essayé mais rien n'y fait. J'ai ré-étudier les 2 codes, tout est identique à part le requêtes sql, même en supprimant tous les espaces.

Je coince et ça commence à gripper.

Posté : 12 sept. 2006, 22:06
par Truc
Tu ferais aussi bien de changer les superglobales obsolètes par les plus récentes !
$HTTP_SERVER_VARS = $_SERVER
$HTTP_POST_VARS = $_POST

écris directement la chaine correspondant au header() sans passer par une fonction de formatage :
header("Location: ". $insertGoTo);

Posté : 12 sept. 2006, 23:01
par tchobec
Quand j'effectue ces changements, rien ne va plus, même la première page n'est pas accessible sur le serveur !!!

Pour info, j'utilise Dreamweaver MX v6.0 et Easyphp v1.8.0.1.

Posté : 12 sept. 2006, 23:21
par Truc
Les changements que je t'ai préconisé ne devraient rien changer au fonctionnement ponctuel du script... montre ce que ça donne.

Posté : 13 sept. 2006, 22:05
par tchobec
J'ai regardé le principe de fonctionnement de header sur la doc php en ligne sur www.nexen.net mais ça ne change toujours rien,

voici le code complet du premier fichier :
<?php require_once('Connections/genealogie.php');
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . $_SERVER['QUERY_STRING'];
}
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "insert_individu")) {
  $insertSQL = sprintf("INSERT INTO liste_individus (Sosa, Generation, Nom, Prenom1, Prenom2, Prenom3, Sexe, photo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['sosa'], "int"),
                       GetSQLValueString($_POST['generation'], "int"),
                       GetSQLValueString($_POST['nom'], "text"),
                       GetSQLValueString($_POST['prenom1'], "text"),
                       GetSQLValueString($_POST['prenom2'], "text"),
                       GetSQLValueString($_POST['prenom3'], "text"),
                       GetSQLValueString($_POST['sexe'], "text"),
                       GetSQLValueString($_POST['photo'], "int"));
  mysql_select_db($database_genealogie, $genealogie);
  $Result1 = mysql_query($insertSQL, $genealogie) or die(mysql_error());
  $insertGoTo = "insert_naissance.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header("Location: %s", $insertGoTo);/*LIGNE 46 */
}
?>
 
<html>
<head>
<title>INSERTION DES DONNEES</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#9999FF">
	<div align="center"> 
    <table width="69%" bgcolor="#99CCFF">
      <tr> 
        <td colspan="3" align="center"><strong><font size="4">FORMULAIRE D'INSERTION 
          DES DONNEES INDIVIDUELLES</font></strong></td>
      </tr>
	</table>
	</div>
<form action="<?php echo $editFormAction; ?>" method="POST" name="insert_individu" id="insert_individu">
  
  
  <div align="center"> 
    <table width="69%" bgcolor="#99CCFF">
      <tr> 
        <td colspan="3">&nbsp;</td>
      </tr>
      <tr> 
        <td width="104">NOM :</td>
        <td width="445"><input name="nom" type="text" id="nom" maxlength="15"></td>
        <td></td>
      </tr>
      <tr> 
        <td width="104">PRENOMS :</td>
        <td width="445"><input name="prenom1" type="text" id="prenom1" maxlength="15"> 
          <input name="prenom2" type="text" id="prenom2" maxlength="15"> <input name="prenom3" type="text" id="prenom3" maxlength="15"> 
        </td>
        <td></td>
      </tr>
      <tr> 
        <td width="104">SEXE :</td>
        <td width="445"><select name="sexe" id="sexe">
            <option value="M">MASCULIN</option>
            <option value="F">FEMININ</option>
          </select></td>
      </tr>
      <tr> 
        <td width="104">SOSA :</td>
        <td width="445"><input name="sosa" type="text" id="sosa" maxlength="5"> 
        </td>
      </tr>
      <tr> 
        <td width="104">GENERATION </td>
        <td width="445"><input name="generation" type="text" id="generation" maxlength="2"> 
        </td>
      </tr>
      <tr> 
        <td width="104">PHOTO :</td>
        <td width="445"> <select name="photo" id="photo">
            <option value="0">OUI</option>
            <option value="1">NON</option>
          </select></td>
        <td width="120"><input type="submit" name="Submit" value="Ins&eacute;rer"></p> 
        </td>
      </tr>
    </table>
  </div>
  <input type="hidden" name="MM_insert" value="insert_individu">
</form>
</body>
</html>
et voilà le résultat après validation du formulaire :
Bad Request
Your browser sent a request that this server could not understand.

Apache/1.3.33 Server at localhost Port 80
je me demande si le %s ne serait pas en cause sur la ligne 46 mais avant ça fonctionnait bien avec ça !!!

Posté : 13 sept. 2006, 22:30
par Ryle
Le message d'erreur à changé déjà, l'erreur n'est donc plus la même :)

Ta syntaxe du header n'est effectivement pas bonne. Le permier argument est une chaine, le second est un booleen qui permet de compléter ou remplacer le header similaire précédent... les %s et compagnie ne servent normalement que pour dans les printf :)

Essaies comme ceci plutôt :
header("Location:" . $insertGoTo);

Posté : 13 sept. 2006, 22:32
par Truc
écris directement la chaine correspondant au header() sans passer par une fonction de formatage :
header("Location: ". $insertGoTo);
ta ta ta... :-*

Posté : 13 sept. 2006, 22:42
par tchobec
J'ai bien effectué ce changement. Ma 1ère page se charge, après renseignement du form et validation il me renvoit une erreur comme si je ne faisait pas appel à l'include du début de fichier !!!
Warning: mysql_insert_id(): A link to the server could not be established in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 68

Notice: Undefined variable: database_genealogie in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 76

Notice: Undefined variable: genealogie in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 76

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 76

Notice: Undefined variable: genealogie in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 78

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 78
au temps pour moi, c'est dans l'autre fichier que la ligne était malencontreusement commentée.

OK c'est bon je test avec la suite et j'ai toujours l'erreur du départ, même avec le code corrigé dans les 2 fichiers.

Posté : 13 sept. 2006, 22:52
par Truc
ça veut dire que tu n'as plus d'erreurs ?

Posté : 13 sept. 2006, 22:59
par tchobec
Si, j'ai toujours l'erreur
Warning: Cannot modify header information - headers already sent by (output started at d:\easyphp1-8\www\genealogie\insert_naissance.php:1) in d:\easyphp1-8\www\genealogie\insert_naissance.php on line 46
je test au début du 2ème fichier avec
<?php
// Voici un exemple d'utilisation des paramètres optionnels de fichier et de ligne
// disponibles depuis PHP 4.3.0. Notez que $filename et $linenum sont
// transmis pour utilisation ultérieure. Ne les assignez pas avant de les utiliser.
if (!headers_sent($filename, $linenum)) {
    header ('Location: http://www.example.com/');
    exit;
// Vous allez probablement déclencher une erreur ici
} else {
    echo "Les en-têtes ont déjà été envoyés, depuis le fichier $filename à la ligne $linenum\n" .
          "Il est donc impossible de vous rediriger automatiquement, aussi veuillez
          cliquez <a href=\"http://www.example.com\">ici</a>.\n";
    exit;
}
?>
et j'ai l'affichage suivant après validation du 1er
Les en-têtes ont déjà été envoyés, depuis le fichier d:\easyphp1-8\www\genealogie\insert_naissance.php à la ligne 1 Il est donc impossible de vous rediriger automatiquement, aussi veuillez cliquez ici.

Posté : 13 sept. 2006, 23:05
par Truc
que contient "genealogie.php" ?
s'il y a des espaces ou sauts de ligne en dehors des balises <?php ?> tu aura égalment une erreur...

Posté : 13 sept. 2006, 23:07
par tchobec
rien qui posait problème avant :
<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_genealogie = "localhost";
$database_genealogie = "genealogie_alex";
$username_genealogie = "root";
$password_genealogie = "";
$genealogie = mysql_pconnect($hostname_genealogie, $username_genealogie, $password_genealogie) or die(mysql_error());
?>