Cannot modify header information - headers already sent by..

Eléphanteau du PHP | 27 Messages

12 sept. 2006, 11:15

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

12 sept. 2006, 11:20

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 sept. 2006, 11:43

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

Eléphanteau du PHP | 27 Messages

12 sept. 2006, 21:40

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

12 sept. 2006, 22:06

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);

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

12 sept. 2006, 23:01

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

12 sept. 2006, 23:21

Les changements que je t'ai préconisé ne devraient rien changer au fonctionnement ponctuel du script... montre ce que ça donne.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

13 sept. 2006, 22:05

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 !!!
Modifié en dernier par tchobec le 13 sept. 2006, 22:32, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 sept. 2006, 22:30

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);

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 sept. 2006, 22:32

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

13 sept. 2006, 22:42

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 sept. 2006, 22:52

ça veut dire que tu n'as plus d'erreurs ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

13 sept. 2006, 22:59

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.
Modifié en dernier par tchobec le 13 sept. 2006, 23:06, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 sept. 2006, 23:05

que contient "genealogie.php" ?
s'il y a des espaces ou sauts de ligne en dehors des balises <?php ?> tu aura égalment une erreur...

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 27 Messages

13 sept. 2006, 23:07

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());
?>
Modifié en dernier par tchobec le 13 sept. 2006, 23:14, modifié 1 fois.