[RESOLU] header + GET

Eléphant du PHP | 88 Messages

22 oct. 2014, 22:16

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 ???
Le temps donne sa légitimité à l'existence...

ViPHP
ViPHP | 3607 Messages

23 oct. 2014, 10:54

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,

Eléphant du PHP | 88 Messages

23 oct. 2014, 12:17

Si je met le
die('test');
ça me marque test (normal) et ça ne m'affiche pas le reste de la page html...
Le temps donne sa légitimité à l'existence...

ViPHP
ViPHP | 3607 Messages

23 oct. 2014, 12:23

ç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,

Eléphant du PHP | 88 Messages

23 oct. 2014, 12:55

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'>&#x25c4</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">&#x25ba</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>
Le temps donne sa légitimité à l'existence...

ViPHP
xTG
ViPHP | 7331 Messages

23 oct. 2014, 13:23

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

Eléphant du PHP | 88 Messages

23 oct. 2014, 13:35

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'>&#x25c4</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">&#x25ba</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 #-o Que faire ???
Le temps donne sa légitimité à l'existence...

ViPHP
ViPHP | 3607 Messages

23 oct. 2014, 13:39

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,

Eléphant du PHP | 88 Messages

23 oct. 2014, 14:08

Je suis archi-nul en anglais... :!: :?: :!: #-o
Le temps donne sa légitimité à l'existence...

ynx
Mammouth du PHP | 586 Messages

23 oct. 2014, 14:20

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

ViPHP
ViPHP | 3607 Messages

23 oct. 2014, 14:22

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

ViPHP
ViPHP | 2577 Messages

23 oct. 2014, 14:25

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.

Eléphant du PHP | 88 Messages

23 oct. 2014, 14:49

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'>&#x25c4</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">&#x25ba</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 ???
Le temps donne sa légitimité à l'existence...

ViPHP
ViPHP | 3607 Messages

23 oct. 2014, 14:53

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

Eléphant du PHP | 88 Messages

23 oct. 2014, 14:54

Comment je les active les erreurs, le try -> catch est déjà écrit ???
Le temps donne sa légitimité à l'existence...