8797 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai basé une grande partie de mon site sur l'écriture dynamique en PHP des urls, en faisant à chaque fois une détection $_GET['quelquechose'].

Or il s'avère quand tentant le recours à "Location" pour concevoir mon abonnement newsletter (renvoyer vers telle ou telle page suivant le cas de figure), le moteur PHP renvoie l'erreur :

Warning: Cannot modify header information - headers already sent by (output started at /home/egypte/public_html/index.php:10) in /home/egypte/public_html/newsletter/inc-newsletter.php on line 50


La ligne 50 incriminée étant :

$insertGoTo = "confirm_subscribe.php";
(...)
header(sprintf("Location: %s", $insertGoTo));


Est-il possible de passer outre l'avertissement ?
Modifié par montoumes (19 Jul 2008 - 21:14)
Bonjour montoumes.

A mon avis tu maitrise mieux que mois les language du web... mais cela dit, j'ai eu l'erreur que tu obtient il y as de ca quelques jours.

Le probleme (tu le sai certainement) viens du fait que la balise header est precede soit par un <?php juste avant soit est integrer sous les balises doctyp head boddy...

Pour ma part je n'ai pas trouve de solution mis a part fair en sorte que la balise header intervienne avant n'importe quel autre affichage...

Bon courage.
La fonction header() de php doit être placée avant tout code HTML donc avant le doctype, ...

Pour remédier à ce problème, mettez ce code tout en haut de votre page :
<?php
ob_start();
?>


Avec ceci, vous pourrez utiliser les header, session_start, ... à n'importe quel endroit de votre page. Qu'il y ai du HTML ou pas
Modifié par Age (18 Jul 2008 - 18:31)
Le classique
Warning: Cannot modify header information - headers already sent by (output started at /home/egypte/public_html/index.php:10) in /home/egypte/public_html/newsletter/inc-newsletter.php on line 50

est assez souvent causé par un simple blanc ou saut de ligne après une balise ?> fermante d'un script.

Il ne faut absolument rien d'écrit (même un saut de ligne ou un blanc) avant un appel à header()
Modérateur
Salut,

Sinon, tu peux tout simplement faire une page de redirection inclue dans une fonction. Il est évident qu'elle a une balise meta refresh.

<<<EDIT
exemple :

<?php
function redirection($insertGoTo){
?>
 <html>
 <head>
 <meta http-equiv="Refresh" content="10; URL=<?php echo $insertGoTo ?>" />
 <title>redirection</title>
 </head>
 <body>
 <!-- mon corp de texte -->
 </body>
 </html>
<?php
}

redirection("http://ma_page.php");
?>



EDIT;

++
Modifié par Nolem (18 Jul 2008 - 22:49)
Merci à tous ! Je teste les variantes et vous dit ce qu'il en est !

Par contre j'ai lu qu'il fallait -si possible- éviter le <meta> refresh pour des raisons de référencement, voire de blacklistage google...
a écrit :
Par contre j'ai lu qu'il fallait -si possible- éviter le <meta> refresh pour des raisons de référencement, voire de blacklistage google...

Ca ne gêne ni le référencement ni le blacklistage, à ma connaissance. Par contre c'est très mauvais pour l'accessibilité, donc c'est mieux d'éviter.

Header, comme setcookie et comme session_start entre autres, doivent absolument intervenir avant tout affichage de code HTML.

Pour ceux qui utilisent la tamporisation de sortie, mettez ob_start en début de script et ob_end_flush tout à la fin. Ce dernier n'est pas absolument obligatoire mais c'est mieux pour faire du code propre, et le flush implicite n'est pas activé partout. C'est comme mysql_close : c'est mieux avec.
QuentinC a écrit :
Par contre c'est très mauvais pour l'accessibilité, donc c'est mieux d'éviter.
Pour quelle(s) raison(s) ?
Bonjour à tous,

J'ai utilisé la méthode
header('Refresh: 0; url='.$insertGoTo.'');
qui me semble la plus approprié et qui ne provoque plus d'erreur.

Par contre, j'ai l'impression que ça empêche le désabonnement de la newsletter...

Et j'ai comme l'impression que le refresh agit avant la suppression dans la table...


$colname_rsUnsub = "-1";
	if (isset($_GET['ID'])) {
	  $colname_rsUnsub = (get_magic_quotes_gpc()) ? $_GET['ID'] : addslashes($_GET['ID']);
	}
	mysql_select_db($base, $sqlConnect);
	$query_rsUnsub = sprintf("SELECT * FROM subs WHERE ID = ".$_GET['ID']."", GetSQLValueString($colname_rsUnsub, "int"));
	$rsUnsub = mysql_query($query_rsUnsub, $sqlConnect) or die(mysql_error());
	$row_rsUnsub = mysql_fetch_assoc($rsUnsub);
	$totalRows_rsUnsub = mysql_num_rows($rsUnsub);
	
	
	if ((isset($_POST['theID'])) && ($_POST['theID'] != "")) {
	  $deleteSQL = sprintf("DELETE FROM subs WHERE ID=".$_GET['ID']."",
						   GetSQLValueString($_POST['theID'], "int"));
	
	  mysql_select_db($base, $sqlConnect);
	  $Result1 = mysql_query($deleteSQL, $sqlConnect) or die(mysql_error());
	
		
	  $deleteGoTo = "newsletter_unsubscribe_complete.php";

	  if (isset($_SERVER['QUERY_STRING'])) {
		$deleteGoTo .= (strpos($deleteGoTo, '?')) ? "&" : "?";
		$deleteGoTo .= $_SERVER['QUERY_STRING'];
	  }
	  header('Refresh: 0; url='.$deleteGoTo.'');

	}


Puis dans le html :


<form method="post" enctype="multipart/form-data" id="form1" action="newsletter_unsubscribe_complete.php">
      <table width="500" border="0" cellpadding="0" cellpadding="0">
        <tr>
          <td width="119" class="formLabel"><label for="SubEmail">Addresse email : </label></td>
          <td width="371"><?php echo $row_rsUnsub['SubEmail']; ?></td>
        </tr>
        <tr>
          <td><p><input name="theID" type="hidden" id="theID" value="<?php echo $_GET['ID']; ?>" /></p></td>
          <td><input type="submit" name="btnUnsubscribe" id="btnUnsubscribe" value="D&eacute;sabonnez moi !" /></td>
        </tr>
      </table>
    </form>
Je clos le sujet en "Résolu" :
- d'une part, bien que le refresh provoque temporairement un affichage non désiré, la solution fonctionne
- d'autre part, j'ai résolu le problème de désinscription de la newsletter.

Merci à tous !
montoumes a écrit :
- d'une part, bien que le refresh provoque temporairement un affichage non désiré, la solution fonctionne
Un petit "exit()" juste après "header()" est souvent utile.