[RESOLU] Problème OVH et header

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Problème OVH et header

Re: Problème OVH et header

par eljeronimooo » 08 mars 2015, 04:28

Finalement j'ai trouvé mon bonheur avec la fonction :
ob_start('ob_gzhandler');
qui correspond output_buffering=on mais avec OVH.

Merci de m'avoir mis sur la piste :)

Re: Problème OVH et header

par eljeronimooo » 07 mars 2015, 22:25

S'il vous plaît, aidez moi. :cry:

Je met toute l’arborescence nécessaire pour comprendre, enfin je pence. Expliquer moi pourquoi j'ai ce message d'erreur alors je j'ai suivi toutes les procédures (que je connais) pour réglé le problème, au moins sur la page index.php.

Voilà la message d'erreur :
Warning: Cannot modify header information - headers already sent by (output started at /home/***/www/index.php:101) in /home/***/www/fonction.php on line 15

Fichier index.php
--1--<?php
--2--///////////////////////////////////////////////////////TRAITEMENT////////////////////////////////////////////////
--63--if (isset($_SESSION[$G_SESSION_id])) {
--64-- $nb_message_recus = GLOBAL_verifie_nombre_une_table_selectif($condition = 'col_iddestinataire = "'.$_SESSION[$G_SESSION_id].'" AND col_supprimer = "0" ',$table = "tab_messageries",$G_bdd,$T_message_erreur);
--65--}

--70--?>
--71--<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
--71--
--72--<head>

--82--<link rel="stylesheet" type="text/css" media="screen" href="style.css" />
--91--<!--[if lte IE 10]><link rel="stylesheet" type="text/css" href="styleie.css"><![endif]-->
--92--<?php echo "<style>$style_php</style>"; ?>
--93--<meta http-equiv="content-type" content="text/html; charset=utf-8" />

--95--</head>
--96--<body>
--97--<!--//////////////////////////////////////////////////////AFFICHAGE///////////////////////////////////////////-->
--98--
--99-- <!--Affiche les boutons du menu volant-->
--100-- <div id="partie_menu_volant">
--101--<?php
--102-- if (isset($_SESSION[$G_SESSION_id])) {
--103-- echo '<div class="boutonmenuvolant_nb_message">'.$nb_message_recus.'</div>';
--104-- }
--105--?>

Fichier config.php
--23--$G_nom_du_site = 'island-3d.com';

Fichier fonction.php
--1--<?php
AUCUN CONTENU HTML ou echo

--14--function GLOBAL_renvoi_page_acceuil(){
--15-- header ("Location: index.php?page=acceuil");
--16--}

--23--function GLOBAL_affiche_alert_system ($var_a_afficher){
--24-- echo "<script>alert(\"$var_a_afficher\")</script>";
--25--}

--71--$G_SESSION_id = 'id_'.$G_nom_du_site;
--72--$G_SESSION_pseudo = 'pseudo_'.$G_nom_du_site;
--73--$G_SESSION_email = 'email_'.$G_nom_du_site;
--74--$G_SESSION_avatar = 'avatar_'.$G_nom_du_site;
--75--$G_SESSION_numaleatoire = 'numaleatoire_'.$G_nom_du_site;

--1143--function GLOBAL_verifie_nombre_une_table_selectif($condition,$table,$G_bdd,$T_message_erreur){
--1144-- $sql = $G_bdd->query (' SELECT COUNT(*) AS col_id FROM '.$table.' WHERE '.$condition.' ') OR (GLOBAL_affiche_alert_system ($var_a_afficher = $T_message_erreur['basededonneeconnexion'].' // '.__FILE__.' // '. __LINE__ .'//TABLE : '.$table.'//CONDITION : '.$condition.'.'));
--1145-- $array = $sql->fetch();
--1146-- $nb = $array['col_id'];
--1147-- return $nb;
--1148--}

Re: Problème OVH et header

par eljeronimooo » 07 mars 2015, 18:19

Merci à @rthur et ynx pour leurs réponses rapides.
J'ai fait des modifications sur mes fichiers suivants vos conseil mais sans succès, j'ai peut-être mal fait quelque chose..

• La solution de ynx : activer output_buffering dans le fichier php.ini :
Comme il n'y à pas de fichier php.ini j'en ai créer un avec notepad++ enregistrer sous le nom « php.ini » sur lequel j'ai ajouter deux ligne :
upload_max_filesize=4M
output_buffering=on
La première est simplement là pour augmenter la taille maximum des input files (par défaut 2mo), sans rapport avec mon problème, je pense.
Ensuite j'ai enregistrer puis envoyer le fichier à la racine de mon site, à côte du dossier www mais aucun effet...

• La solution d'@rthur : mettre un exit; après chaque appel de header n'a rien réglé non plus, la page à juste afficher le message erreur puis page blanche ce qui me semble normal car PHP lit le header, renvoi un message d'erreur puis lit exit et du coup stop le traitement. Non ?
Je précise que mes header sont tous appeler l'une des ces fonctions toutes écrites dans fonction.php :
function GLOBAL_renvoi_page_erreur(){
header ("Location: index.php?page=erreur404");
exit;
}
function GLOBAL_renvoi_page_hacker(){
header ("Location: index.php?page=hacker");
exit;
}
function GLOBAL_renvoi_page_obselet(){
header ("Location: index.php?page=obselet");
exit;
}
function GLOBAL_renvoi_page_inaxessecible(){
header ("Location: index.php?page=inaccessible");
exit;
}
function GLOBAL_renvoi_page_acceuil(){
header ("Location: index.php?page=acceuil");
exit;
}
function GLOBAL_renvoi_page_precedente($G_page_precedente){
header ("Location: $G_page_precedente");
exit;
}
function GLOBAL_renvoi_page_souhaitee($page_a_renvoyer){
header ("Location: index.php?page=$page_a_renvoyer");
exit;
}
function GLOBAL_renvoi_admin($adresse_a_renvoyer){
header ("Location: $adresse_a_renvoyer");
exit;
}
function GLOBAL_rafraichi_page($nb_seconde,$adresse_a_renvoyer){
header ("Refresh:$nb_seconde;$adresse_a_renvoyer");
exit;
}

• Donc il ne reste plus qu'a réécrire tout les PHP avant les HTML ce qui va être long et compliquer dans certain cas, en cours...

• Mais après avoir fait passer tout les header dans des fonctions suivant les conseil de @rthur et après avoir retirer le exit; qui à été sans effet sur mon problème. En faisant la même procédure bugé qu'avant sur mon site j'ai eu nouveau message d'erreur :

Warning: Cannot modify header information - headers already sent by (output started at /home/***/www/index.php:35) in /home/***/www/fonction.php on line 15

Alors je suis aller voir ma ligne 35 de index.php et surprise :
--34--<body>
--35--<?php
--36-- //Connexion à la base de données
--37-- $G_bdd = GLOBAL_connexion_bdd ($G_bdd_info,$G_site_en_local);
Je précise que ma page index.php comme par :
--1--<?php
--2--session_start();
--3--include ( "config.php");

Cette construction correspond au code « Bidon » de ynx alors pourquoi le message d'erreur indique cette ligne ? C'est à devenir fou...

Précision : ligne 15 de fonction.php fournie plus haut dans le message et correspond à
header ("Location: index.php?page=acceuil");
Oui je sais le mot « accueil » est mal orthographier (c pas le seul) mais ce n'est pas la cause du problème j'ai vérifié, mais je sort quand même... 8-|

Re: Problème OVH et header

par ynx » 06 mars 2015, 14:09

Salut,

Quelques remarques sur tes pistes de corrections :
Piste 1, il faut vérifier les sauts de ligne et/ou espace avant la première balise <?php (pas l'inverse), c-a-d les caractères appartement au contenu HTML. Les espaces et sauts de ligne à l'intérieur des balises php ne poseront pas de soucis.

Piste 2, ne surtout réécrire tout le code html avec des echo en php. Cela compliquerait la lisibilité donc l'évolution et la maintenance de code (et toutes ces guillemets à échapper...).

La règle de base concernant la modification des entêtes HTML avec la fonction php header() est qu'aucun contenu (saut de ligne, echo, message d'erreur...) ne doit être envoyé au client avant l'appel de la fonction header().

Une solution possible est de modifier ton code pour effectuer tous les traitements php dès le début du fichier et n'afficher ensuite que le code html avec quelques echo et/ou quelques boucles simples.
Voici un exemple à partir d'un code bidon :
<?php
session_start();
include ('config.php');
include ('fonction.php');
?>
<!DOCTYPE html>
<html>
<head>
	<title>Test1</title>
</head>
<body>
<?php
//Connexion à la base de données
$bdd = getBDD();

$donnees = $bdd->query('..sql..');

if ($result === FALSE) {
	// redirection vers erreur.php
	header('Location: erreur.php');
	exit();
}
?>
	<div class="liste-donnees">
	<?php foreach ($donnees->fetch() as $donnee) : ?>
		<span><?php echo $donnee; ?></span>
	<?php endforeach; ?>
	</div>
</body>
</html>
-> ici le début du fichier html est envoyé avant l'appel de la fonction header(), nous avons donc l'erreur php "output already sent".
En déplaçant le traitement php au début du fichier :
<?php
session_start();
include ('config.php');
include ('fonction.php');

//Connexion à la base de données
$bdd = getBDD();

$donnees = $bdd->query('..sql..');

if ($result === FALSE) {
	// redirection vers erreur.php
	header('Location: erreur.php');
	exit();
}
?>
<!DOCTYPE html>
<html>
<head>
	<title>Test1</title>
</head>
<body>
	<div class="liste-donnees">
	<?php foreach ($donnees->fetch() as $donnee) : ?>
		<span><?php echo $donnee; ?></span>
	<?php endforeach; ?>
	</div>
</body>
</html>
-> ici la redirection avec header() fonctionne puisque aucun contenu n'est envoyé avant. Le code php à l'intérieur du html n'est utilisé que pour l'affichage.

La deuxième solution possible pour résoudre ce problème est de configurer php pour utiliser la bufferisation de sortie : il suffit de modifier dans le fichier php.ini la directive output_buffering (http://php.net/manual/fr/outcontrol.configuration.php)
Avec cette option, PHP va stocker tout le contenu de sortie dans un buffer avant le l'envoyer au client : la fonction header() peut alors être utilisée n'importe quand dans ton code.

Bonne journée

Re: Problème OVH et header

par @rthur » 06 mars 2015, 13:11

Bonjour,

Une astuce toute simple, à connaitre pour éviter ce type de problème :
Dès que tu utilises header ("Location: ..."); il faut toujours le faire suivre d'un exit;

Tu demandes une redirection vers une autre page, donc il n'y a plus rien qui doit être traité derrière ni renvoyé au navigateur.

Problème OVH et header

par eljeronimooo » 06 mars 2015, 12:57

Bonjour, tout d’abord. Merci pour tout ce que vous faites grâce à vous tous j'ai créer mon premier site web : )
Voilà le liens : http://island-3d.com/
Je viens de le mettre en ligne sur OVH et malheureusement il y à des soucis alors qu'il fonctionne parfaitement avec WAMP : (
Après une nuit complète je suis parvenu à en corrigé un certain nombre (fonction mail, doctype, session_start...) les plus facile quoi. Mais celui-là résiste et met mes nerfs à rude épreuve depuis trop longtemps...

J'ai des messages d'erreurs quand je quitte une session et quand j'appel la fonction header.
En cherchant sur le net j'ai trouvé des infos mais rien ni fait, voilà ce que j'ai testé :

Encodage en UTF-8(sans BOM) pour tout les fichiers
Pas de caractères avant la première balise <?php du fichier ni après la dernière balise ?> du fichier (j'ai vérifié en affichant les caractère invisible)
Le SESSION_START(); est juste sous la balise <?php au début du fichier index.php qui s'ouvre en premier et sans aucun caractère avant.

Mais toujours le même message d'erreur alors avant de passé des heures voir des jours à tout re-coder je voudrai avoir l'avis de la communauté sur quelques pistes.

PSITE 1 = Un caractère en trop :
• le caractère « SAUT DE LIGNE » après la première balise <?php du fichier
• le caractère « SAUT DE LIGNE » avant la dernière balise ?> du fichier
• le caractère « ESPACE » entre la balise <?php et mon code pour toutes les balises du fichier
• le caractère « ESPACE » entre mon code et la balise ?> pour toutes les balises du fichier

PISTE 2 = Alternance PHP / HTML
• L'alternance entre du code PHP et HTML et des commentaires au milieu serai à l'origine du problème donc il faudrait tout réécrire en PHP en mettant le HTML entre parenthèse avec des echo

QUESTION ANNEXE
Faut t'il corrigé toutes les pages pour faire disparaître ce message d'erreur (plus bas) ou juste corrigé les pages index.php et fonction.php ? Histoire de voir si je suis sur la bonne voie avant de tout corrigé...

• Voilà un des message d'erreur obtenu après l'appel d'un header:
Warning: Cannot modify header information - headers already sent by (output started at /home/*****/www/index.php:35) in /home/******/www/fonction.php on line 15

• Voilà le début de fonction.php jusqu'à la ligne 15 :
<?php
function GLOBAL_renvoi_page_erreur(){
header ("Location: index.php?page=erreur404");
}
function GLOBAL_renvoi_page_hacker(){
header ("Location: index.php?page=hacker");
}
function GLOBAL_renvoi_page_obselet(){
header ("Location: index.php?page=obselet");
}
function GLOBAL_renvoi_page_inaxessecible(){
header ("Location: index.php?page=inaccessible");
}
function GLOBAL_renvoi_page_acceuil(){
header ("Location: index.php?page=acceuil");

• Voilà le début du fichier index.php jusqu'à la ligne 35 :
<?php
session_start();
include ( "config.php");
include ("fonction.php");
include ("style.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >

<head>

<!--Inclu les fichier et script requis-->
<link rel="shortcut icon" type="image/x-icon" href="<?php echo $G_mini_logo; ?>" />
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/alert.js"></script>
<script type="text/javascript" src="js/vote.js"></script>
<script type="text/javascript">var RecaptchaOptions = {theme : '<?php echo $G_style_captcha ?>'}</script>
<link rel="stylesheet" type="text/css" media="screen" href="style.css" />
<!--[if lte IE 10]>
<link rel="stylesheet" type="text/css" href="styleie.css">
<![endif]-->
<?php echo "<style>$style_php</style>"; ?>

<!--Incrit les balises meta-->
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="LANGUAGE" content="FR">
<meta name="DESCRIPTION" content="Acceuil du site">

</head>

<body>
<?php
//Connexion à la base de données
$G_bdd = GLOBAL_connexion_bdd ($G_bdd_info,$G_site_en_local);