Page 1 sur 2
header + GET
Posté : 22 oct. 2014, 22:16
par hunomina972
Bonjours à tous, je me retrouve une énième fois avec un problème : je souhaite utiliser un header ou une autre façon pour actualiser ma page en fonction du $_GET. J'ai donc fais ce code :
$get=$_GET['expediteur'];
header ("Location: message.php?expediteur=".$get);
Il ne fonctionne pas ainsi que plein d'autre du même type, soit il envoie une erreur comme quoi la page est inexistante soit il me renvoie sur la page en question avec les post envoyer (vu que le header est dans une boucle if en fonction d'un POST), écrit dans la base de donnée mais ne me réactualise pas la page et du coup il faut le faire manuellement. Donc auriez vous un moyen pour que dès que le post arrive, cela l'enregistre et tout... puis, ça m'actualise la page pour que les post soit pris en compte dans l'affichage ???
Re: header + GET
Posté : 23 oct. 2014, 10:54
par jojolapine
Bonjour,
Que se passe-t-il si tu ajoutes un die() juste derrière le header ?
$get=$_GET['expediteur'];
header ("Location: message.php?expediteur=".$get);
die('test');
Cordialement,
Re: header + GET
Posté : 23 oct. 2014, 12:17
par hunomina972
Si je met le
die('test');
ça me marque test (normal) et ça ne m'affiche pas le reste de la page html...
Re: header + GET
Posté : 23 oct. 2014, 12:23
par jojolapine
ça n'est justement pas normal
Le header('Location:...') est censé effectuer une redirection, donc tout ce qui se passe après n'est pas censé être exécuté.
(malgré tout il faut toujours placer un exit() après un header('Location:...') car dans certain cas la redirection peut-être initiée et le code suivant le header être tout de même exécuté)
Il y a donc à priori un problème de "headers already sent"... il faudrait afficher les erreurs php pour en savoir plus. ou regarder dans les logs s'il y en a.
Plus d'infos sur l'erreur en question :
http://stackoverflow.com/questions/8028 ... ror-in-php
(erreur supposée bien sur).
Bon courage,
Cordialement,
Re: header + GET
Posté : 23 oct. 2014, 12:55
par hunomina972
Je n'est pas d'erreurs affichées... C'est juste que soit ça n'actualise pas la page, soit ça me renvoie chez mon hébergeur donc JE NE COMPRENDs PAS. En plus je fais toute mes pages sur WAMP avant et cela fonctionne sur WAMP ! WTF ?!?
Voici tout le code de la page :
<?php
session_start();
$sess=$_SESSION['Auth']['pseudo'];
$get=$_GET['expediteur'];
?>
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<link type="text/css" rel="stylesheet" href="Universelle.css"/>
<link type='text/css' rel='stylesheet' href='message.css'/>
<!-- les deux lignes suivantes servent a la favicon du site (pour tous les navigateurs)-->
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /><![endif]-->
<script type="text/javascript" src="Ouverture fenetre 1.js"></script>
<script type="text/javascript" src="Ouverture fenetre 2.js"></script>
<title>Portail Geek - Messages</title>
</head>
<body>
<div class="en-tete"><center><h1 class="grand_titre"><img class="icone" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWurnEUYEIqbnXmuaUNLxitieEiotp8VkrlY0Clzi9xiFLsjL9qQ"/> <img class="bandeau" src="image.gif"/> <img class="icone" src="http://compass.xbox.com/assets/5f/90/5f904be1-94c2-427b-821b-5603fd1f9dc4.jpg?n=hero-xbox-one-all-hardware-gray-bg-600x456.jpg"/></h1></center></div>
<?php include 'sommaire.php'; ?>
<div class="texte">
<?php
if(!empty($_SESSION['Auth'])){
try {
$cnx = new PDO('...');
}
catch (PDOException $e) {
exit('Erreur : ' . $e->getMessage());
}
if(!empty($_GET['expediteur'])){
echo '<h4 style="text-decoration:underline">Discution avec '.$get.':</h4><div class="message">';
$query= $cnx->query("SELECT * FROM message WHERE destinataire='$sess' AND expediteur='$get' OR expediteur='$sess' AND destinataire='$get' ORDER BY timestamp");
while ($tab = $query->fetch()){
if($tab['destinataire']==$sess){
echo "<div class='triangle1'>◄</div><div class='destinataire'>".$tab['expediteur'].' : '.$tab['message'].'</div><br/>';
}
elseif($tab['expediteur']==$sess){
echo "<div class='expediteur'>".$tab['expediteur'].' : '.$tab['message'].'</div><div class="triangle2">►</div><br/>';
}
}
}
if(isset($_POST['message'])){
$message=$_POST['message'];
$timestamp=time();
$d = array(
'expediteur'=>$sess,
'destinataire'=>$get,
'message'=>$message,
'timestamp'=>$timestamp
);
$req = $cnx->prepare('INSERT INTO message (expediteur,destinataire,message,timestamp) VALUES (:expediteur,:destinataire,:message,:timestamp)');
$req->execute($d);
header ("Location: message.php?expediteur=".$get);
}
}
?>
<form class='entrer_message' action='message.php?expediteur=<?php echo $get ?>' method='post'>
<input type='text' name='message' required/>
<input type='submit' value='Envoyer'/>
</form>
</div>
</div>
</body>
</html>
Re: header + GET
Posté : 23 oct. 2014, 13:23
par xTG
T'as du code HTML avant ton header...
Faut pas chercher plus loin...
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<link type="text/css" rel="stylesheet" href="Universelle.css"/>
<link type='text/css' rel='stylesheet' href='message.css'/>
<!-- les deux lignes suivantes servent a la favicon du site (pour tous les navigateurs)-->
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /><![endif]-->
<script type="text/javascript" src="Ouverture fenetre 1.js"></script>
<script type="text/javascript" src="Ouverture fenetre 2.js"></script>
<title>Portail Geek - Messages</title>
</head>
<body>
<div class="en-tete"><center><h1 class="grand_titre"><img class="icone" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWurnEUYEIqbnXmuaUNLxitieEiotp8VkrlY0Clzi9xiFLsjL9qQ"/> <img class="bandeau" src="image.gif"/> <img class="icone" src="http://compass.xbox.com/assets/5f/90/5f904be1-94c2-427b-821b-5603fd1f9dc4.jpg?n=hero-xbox-one-all-hardware-gray-bg-600x456.jpg"/></h1></center></div>
<?php include 'sommaire.php'; ?>
<div class="texte">
Re: header + GET
Posté : 23 oct. 2014, 13:35
par hunomina972
Oui mais sur d autre page aussi et sa marche très bien donc comme ça ça devrait marcher...
<?php
session_start();
$sess=$_SESSION['Auth']['pseudo'];
$get=$_GET['expediteur'];
$cnx = new PDO('');
if(isset($_POST['message'])){
$message=$_POST['message'];
$timestamp=time();
$d = array(
'expediteur'=>$sess,
'destinataire'=>$get,
'message'=>$message,
'timestamp'=>$timestamp
);
$req = $cnx->prepare('INSERT INTO message (expediteur,destinataire,message,timestamp) VALUES (:expediteur,:destinataire,:message,:timestamp)');
$req->execute($d);
header ("Location: message.php?expediteur=".$get);
}
?>
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<link type="text/css" rel="stylesheet" href="Universelle.css"/>
<link type='text/css' rel='stylesheet' href='message.css'/>
<!-- les deux lignes suivantes servent a la favicon du site (pour tous les navigateurs)-->
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /><![endif]-->
<script type="text/javascript" src="Ouverture fenetre 1.js"></script>
<script type="text/javascript" src="Ouverture fenetre 2.js"></script>
<title>Portail Geek - Messages</title>
</head>
<body>
<div class="en-tete"><center><h1 class="grand_titre"><img class="icone" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWurnEUYEIqbnXmuaUNLxitieEiotp8VkrlY0Clzi9xiFLsjL9qQ"/> <img class="bandeau" src="image.gif"/> <img class="icone" src="http://compass.xbox.com/assets/5f/90/5f904be1-94c2-427b-821b-5603fd1f9dc4.jpg?n=hero-xbox-one-all-hardware-gray-bg-600x456.jpg"/></h1></center></div>
<?php include 'sommaire.php'; ?>
<div class="texte">
<?php
if(!empty($_SESSION['Auth'])){
try {
$cnx = new PDO('');
}
catch (PDOException $e) {
exit('Erreur : ' . $e->getMessage());
}
if(!empty($_GET['expediteur'])){
echo '<h4 style="text-decoration:underline">Discution avec '.$get.':</h4><div class="message">';
$query= $cnx->query("SELECT * FROM message WHERE destinataire='$sess' AND expediteur='$get' OR expediteur='$sess' AND destinataire='$get' ORDER BY timestamp");
while ($tab = $query->fetch()){
if($tab['destinataire']==$sess){
echo "<div class='triangle1'>◄</div><div class='destinataire'>".$tab['expediteur'].' : '.$tab['message'].'</div><br/>';
}
elseif($tab['expediteur']==$sess){
echo "<div class='expediteur'>".$tab['expediteur'].' : '.$tab['message'].'</div><div class="triangle2">►</div><br/>';
}
}
}
}
?>
<form class='entrer_message' action='message.php?expediteur=<?php echo $get ?>' method='post'>
<input type='text' name='message' required/>
<input type='submit' value='Envoyer'/>
</form>
</div>
</div>
</body>
</html>
Mais la ça me renvoie sur la page voulu mais elle est toute blanche et 500

Que faire ???
Re: header + GET
Posté : 23 oct. 2014, 13:39
par jojolapine
Commence par afficher les erreurs php...
Ensuite il peut y avoir des différences de configuration qui font que le header('Location:') au milieu du contenu fonctionne...
Mais c'est une mauvaise pratique...
Il ne faut pas qu'il y ai de sortie html avant un header, point final!
Lis le lien que je t'ai donné ci-avant (jusqu'au bout).
Bon courage,
Re: header + GET
Posté : 23 oct. 2014, 14:08
par hunomina972
Re: header + GET
Posté : 23 oct. 2014, 14:20
par ynx
Salut,
Effectivement si la directive output_buffering est activée (ce qui est le cas sur wamp il me semble), la redirection fonctionne même si du contenu est envoyé avant l'appel à la fonction header (puisque ce contenu n'est pas envoyé directement mais enregistré dans le buffer). Cette directive doit être désactivée sur ton serveur d'hébergement, ce qui explique que tu rencontres ce problème.
Plusieurs solutions pour résoudre ceci :
- déplacer les instructions header() en haut de ton script (avant que le moindre contenu ne soit envoyé)
- utiliser la temporisation de sortie de php pour créer un buffering sur le contenu avant le header :
http://php.net/manual/fr/ref.outcontrol.php
- activer la directive output_buffering
Le header('Location:...') est censé effectuer une redirection, donc tout ce qui se passe après n'est pas censé être exécuté.
Juste pour corriger, non le header('Location') n'effectue pas lui même la redirection. Cette instruction modifie l'entête http à envoyer au client pour que le navigateur effectue la redirection, mais le code qui est la suite de cette instruction est bien censé être exécuté (notamment car la fonction header ne sert pas qu'à faire des redirections). C'est pour cela qu'il est toujours conseillé d'ajouter un exit après une modifications de l'entête http pour effectuer une redirection.
Bonne journée
Re: header + GET
Posté : 23 oct. 2014, 14:22
par jojolapine
Malheureusement l'anglais et la programmation sont indissociables...
Pour revenir au sujet, dans ton précédent extrait de code, le header() se trouve avant qu'il n'y ait un affichage quelconque : pas de html, pas d'echo/print, etc...
Maintenant pour pouvoir diagnostiquer le problème, il faut absolument que tu affiches les erreurs php. Il y a des tonnes de ressources sur le sujet sur google

Re: header + GET
Posté : 23 oct. 2014, 14:25
par Mazarini
Ajoutes ob_start(); au début (cf
http://php.net/manual/fr/function.ob-start.php)
Il me semble que dans wamp le buffering est activé par défaut. Ce n'est pas propre à mon avis, mais ça doit te dépanner.
Re: header + GET
Posté : 23 oct. 2014, 14:49
par hunomina972
Mon code est le suivant mais je me retrouve toujours avec une page blanche :
<?php
session_start();
ob_start();
$sess=$_SESSION['Auth']['pseudo'];
$get=$_GET['expediteur']
try {
$cnx = new PDO('...');
}
catch (PDOException $e) {
die('Erreur : ' . $e->getMessage());
}
if(isset($_POST['message'])){
$message=$_POST['message'];
$timestamp=time();
$d = array(
'expediteur'=>$sess,
'destinataire'=>$get,
'message'=>$message,
'timestamp'=>$timestamp
);
$req = $cnx->prepare('INSERT INTO message (expediteur,destinataire,message,timestamp) VALUES (:expediteur,:destinataire,:message,:timestamp)');
$req->execute($d);
header ("Location: message.php?expediteur=".$get);
}
?>
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<link type="text/css" rel="stylesheet" href="Universelle.css"/>
<link type='text/css' rel='stylesheet' href='message.css'/>
<!-- les deux lignes suivantes servent a la favicon du site (pour tous les navigateurs)-->
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /><![endif]-->
<script type="text/javascript" src="Ouverture fenetre 1.js"></script>
<script type="text/javascript" src="Ouverture fenetre 2.js"></script>
<title>Portail Geek - Messages</title>
</head>
<body>
<div class="en-tete"><center><h1 class="grand_titre"><img class="icone" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWurnEUYEIqbnXmuaUNLxitieEiotp8VkrlY0Clzi9xiFLsjL9qQ"/> <img class="bandeau" src="image.gif"/> <img class="icone" src="http://compass.xbox.com/assets/5f/90/5f904be1-94c2-427b-821b-5603fd1f9dc4.jpg?n=hero-xbox-one-all-hardware-gray-bg-600x456.jpg"/></h1></center></div>
<?php include 'sommaire.php'; ?>
<div class="texte">
<?php
if(!empty($_SESSION['Auth'])){
if(!empty($_GET['expediteur'])){
echo '<h4 style="text-decoration:underline">Discution avec '.$get.':</h4><div class="message">';
$query= $cnx->query("SELECT * FROM message WHERE destinataire='$sess' AND expediteur='$get' OR expediteur='$sess' AND destinataire='$get' ORDER BY timestamp");
while ($tab = $query->fetch()){
if($tab['destinataire']==$sess){
echo "<div class='triangle1'>◄</div><div class='destinataire'>".$tab['expediteur'].' : '.$tab['message'].'</div><br/>';
}
elseif($tab['expediteur']==$sess){
echo "<div class='expediteur'>".$tab['expediteur'].' : '.$tab['message'].'</div><div class="triangle2">►</div><br/>';
}
}
}
}
?>
<form class='entrer_message' action='message.php?expediteur=<?php echo $get ?>' method='post'>
<input type='text' name='message' required/>
<input type='submit' value='Envoyer'/>
</form>
</div>
</div>
</body>
</html>
N'y aurai-t-il pas un autre moyen pour actualiser la page ???
Re: header + GET
Posté : 23 oct. 2014, 14:53
par jojolapine
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
Affiche les erreurs php,
....
Pour vérifier tu fait un fichier test.php avec une erreur volontaire de syntaxe php. et tu vérifie que tu as bien l'erreur affichée....
Re: header + GET
Posté : 23 oct. 2014, 14:54
par hunomina972
Comment je les active les erreurs, le try -> catch est déjà écrit ???