Perte de variable _GET apres actualisation de la page

Petit nouveau ! | 3 Messages

02 avr. 2013, 19:07

Bonjour,

voila ce que je tente de réaliser : sur ma Page A j'ai une requete qui me permet de récupérer des Billets dans chaque billet j'ai un lien appelé commentaire (qui transmet la variable $_GET['id_billet] qui ouvre une page B afin de reprendre le billet ciblé avec les commentaires liés à ce même billet. Sur ma pages B je récupère bien tout, sauf que j'ai voulu intégrer un formulaire (sur ma page B) qui permet d'ajouter des commentaires au billet.

Le problème est que lorsque j'envoie le formulaire ça me réactualise la page et je perd ma variable $_GET['id_billet] résultat : "plus aucune info liés au billet ne s'affiche".
Existe t-il une solution afin qu'après avoir actualiser ma page deux elle puisse qd meme conserver la variable $_GET['id_billet] transmise par url de ma page un à deux ?

voici le lien de la page A : <a href="commentairebillet.php?billet=<?php echo $donnees['id']; ?>">Commentaires</a>

voici le code de ma page B :
<?php
session_start();

if(empty($_SESSION['pseudo']))
{
header ('location: mbnlogin.php');
}

?>

<!Doctype htlm>
    <head>
        <meta charset="utf-8" />
		<link rel="stylesheet" href="navigateur.css" />
		<link rel="stylesheet" href="commentaire.css" />
        <title>MBN Commentaire billet</title>
	</head>	
	
	
	<body>
	
	<?php
		
		// Connexion à la base de données
		try
		{
			$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
		}
		catch(Exception $e)
		{
				die('Erreur : '.$e->getMessage());
		}
		// Récupération du billet par Get
		$req = $bdd->prepare('SELECT id, pseudo, titre, commentaire, date FROM bloggy WHERE id = ?');
		$req->execute(array($_GET['billet']));
		$donnees = $req->fetch();
		
		$req->closeCursor(); // Important : on libère le curseur pour la prochaine requête
	?>
	
	<div id="postfinal">
	
		<div id="autor"><p><strong>Auteur : </strong><?php echo $donnees['pseudo'] ?></p></div><div id="titro"><p><strong>Titre : </strong><?php echo $donnees['titre'] ?></p></div><br /><p id="comment"><?php echo $donnees['commentaire'] ?></p><br /><div id="teatime"><p><?php echo $donnees['date'] ?></p></div><br />
		
	</div>
	
	
	
	<div id="lescommentaires">
	
		<h1>Il a dit je cite : </h1>
	<?php	
		// Récupération des commentaires du billet table commentaire
		$req = $bdd->prepare('SELECT id, auteur, commentaire, date FROM commentaires WHERE id_billet = ? ORDER BY date DESC LIMIT 0,10');
		$req->execute(array($_GET['billet']));
		$donnees = $req->fetch();
		
		while ($donnees = $req->fetch())
		{
		?>
		<p> Auteur : <?php echo $donnees['auteur'] ?> le : <?php echo $donnees['date'] ?></p><p> <?php echo $donnees['commentaire'] ?>
		<?php
		}
		$req->closeCursor(); 
	
	?>
	</div>
	
	<div id="formulairedeux">
	
		<form method="post" action="commentairebillet.php">
	
		<input type="hidden" name="id_billet" value="<?php echo $_GET['billet']; ?>" />
		<input type="hidden" name="auteur" value="<?php echo $_SESSION['pseudo']; ?>" />
		<label><strong> Auteur : </strong></label> <input type="text" name="auteur" value="<?php echo $_SESSION['pseudo']; ?>"  DISABLED />
		<label><strong> Comment ?</strong> (500 caractères max) : </label><textarea placeholder="Entre ton commentaire ici"  name="commentaire"   maxlength="500" onkeyup="return ismaxlength(this)"></textarea>
		<input type="hidden" name="date"/>
		<input type="submit" value="Balance" id="balance"/>
		
		
		</form>
	</div>
	<?php
		if(!empty($_POST['commentaire']))
		{
		// On ajoute une entrée dans la table bugreport
		$req = $bdd->prepare('INSERT INTO commentaires(id-billet, auteur, commentaire, date ) VALUES(:id_billet, :auteur, :commentaire,  now())');
		$req->execute(array(
						'id_billet' => $_POST['id_billet'],
						'auteur' => $_POST['auteur'],
						'commentaire' => $_POST['commentaire'],
						
						));
	
	
	
	$req->closeCursor(); 
	}
	?>
	
	
	
	</body>
	
</html>
avez-vous une idée en dehors d’établir mon formulaire sur une autre page pour conserver la variable $_GET apres actualisation de la page ? merci d'avance

Eléphant du PHP | 353 Messages

02 avr. 2013, 20:28

Tu as le paramètres en champ caché. Tu aurais pu aussi garder l'identifiant du billet en l'ajoutant dans l'action du formulaire :

Code : Tout sélectionner

<form method="post" action="commentairebillet.php?billet=<?php echo $_GET['billet'];?>">
Quoi qu'il en soit il te suffit de récupérer l'identifiant du billet soit par $_GET['billet'] soit par $_POST['id_billet']. Ou plus simple tu renommes le champ caché en billet (name="billet") et dans tous les cas tu récupères l'identifiant avec $_REQUEST['billet']

ViPHP
AB
ViPHP | 5818 Messages

02 avr. 2013, 23:29

Oui ou sinon pour éviter tous ces pb de retransmission quand on fait un formulaire sur plusieurs pages on utilise très souvent des variables de session donc par exemple tu pourrais créer une variable $_SESSION['billet'].

Sinon concernant l'organisation de ton code tu devrais séparer le plus possible le traitement php du html, en général on met tout le php possible en haut . Il y a tout un tas de code php dont on se demande ce qu'il vient faire dans ton code html.

Petit nouveau ! | 3 Messages

03 avr. 2013, 06:43

Merci de vos réponses.

En premier :

Code : Tout sélectionner

<form method="post" action="commentairebillet.php?billet=<?php echo $_GET['billet'];?>">
me permet de récupérer la variable $_GET['billet'].

Ce que je n'avais pas prévu c'est que une fois le formulaire envoyer l'utilisateur doit actualiser la page pour afficher son commentaire. De plus cela me renvoie les données du formulaire qu'il à précédemment envoyé.

je pensais donc utiliser cette fonction :

Code : Tout sélectionner

header ('location: commentairebillet.php');
pour régler le problème de l'actualisation manuelle et ainsi la rendre automatique sans renvoie des données du formulaire.
Et afin de transmettre ma variable j'ai tenté :

Code : Tout sélectionner

header ('location: commentairebillet.php?billet=<?php echo $_GET['billet'];?>')
= ne fonctionne pas (je ne sais pas si c'est possible d'effectuer cette opération ou si c'est juste un problème de syntaxe).

En deuxieme : les sessions on l'air d'une très bonne idée mais je ne sais pas ou les déclarer... et j'ai surtout une session deja activé lors de la page login. De plus ma page A affiche plusieurs billet le lien commentaire me permet de récupérer le numéro du billet et sur ma page B grace à la requete d'afficher juste le billet correspondant et de récupérer les commentaires associé à se billet (enregistrer dans une autre table).
Sans le lien m'envoyant en "résumer" le numéro du billet comment ma page B peut savoir quel billet afficher ? et comment j'indique à ma requête par la suite de m'afficher les commentaire liés au billet si je n'ai pas son numéro ? je ne vois pas comment y parvenir grace aux sessions (je suis débutant ne m'en veuillez pas svp).

En troisieme : Pour tes autres solutions Nicolas :
Quoi qu'il en soit il te suffit de récupérer l'identifiant du billet soit par $_GET['billet'] soit par $_POST['id_billet']. Ou plus simple tu renommes le champ caché en billet (name="billet") et dans tous les cas tu récupères l'identifiant avec $_REQUEST['billet']
je ne vois comment les appliquer dans mon cas.

Et pour finir
Il y a tout un tas de code php dont on se demande ce qu'il vient faire dans ton code html.
si je peux te renseigner afin que tu puisse me dire : "tu devrais remplacer ce code php ou le séparer comme ça" je suis preneur comme je l'ai deja dis je débute.

Merci à vous

ViPHP
AB
ViPHP | 5818 Messages

03 avr. 2013, 21:41

Tu peux bien faire, une fois qu'une session est ouverte (donc après session_start()), et dans la page où tu récupère pour la première fois $_GET['billet'] :
$_SESSION['billet'] = isset($_SESSION['billet']) ? $_SESSION['billet'] : null;
$_SESSION['billet'] = isset($_GET['billet']) ? $_GET['billet'] : $_SESSION['billet'];
le code ci-dessus te permet de définir $_SESSION['billet'] = $_GET['billet'] et si $_GET['billet'] n'existe pas on prend la valeur de $_SESSION['billet']
Cela revient au même que de faire
if( isset($_GET['billet']))
{
$_SESSION['billet'] = $_GET['billet'];
}
else if isset($_SESSION['billet']))
{
$_SESSION['billet'] = $_SESSION['billet'];
}
else 
{
$_SESSION['billet'] = null;
}
Ainsi quand tu revient sur cette page tu peux récupérer la valeur de $_SESSION['billet'] précédemment définie par $_GET['billet']



Et dans toutes les autres pages, toujours après session_start() tu peux récupérer cette valeur en faisant
$billet = isset($_SESSION['billet'] ) ? $_SESSION['billet']  : null;

Petit nouveau ! | 3 Messages

05 avr. 2013, 09:21

AB je te remercie ton codage marche parfaitement, excuse moi pour ma réponse tardive mais encore une fois merci.

Si je peux abuser de ta patience j'ai juste deux questions :
$_SESSION['billet'] = isset($_SESSION['billet']) ? $_SESSION['billet'] : null;
$_SESSION['billet'] = isset($_GET['billet']) ? $_GET['billet'] : $_SESSION['billet'];
peux tu me dire ou je peux trouver un site, un bouquin ou je peux apprendre cette syntaxe car c'est la 1er fois que je la rencontre et elle éveille grandement ma curiosité (habituer a ton deuxième codage).

ma deuxième question porte justement sur le deuxième codage et notamment sur ta dernière ligne :
if( isset($_GET['billet']))
{
$_SESSION['billet'] = $_GET['billet'];
}
else if isset($_SESSION['billet']))
{
$_SESSION['billet'] = $_SESSION['billet'];
}
else
{
$_SESSION['billet'] = null;
}


pourquoi définir dans le else NULL pour $_SESSION ?

ViPHP
AB
ViPHP | 5818 Messages

05 avr. 2013, 20:20

1/ lien sur la première syntaxe qu'on appelle les opérateurs ternaires

2/ Pourquoi j'ai mis null parce qu'il fallait choisir quelque chose. En fait c'est la valeur par défaut donc pour ce code quand $_SESSION['billet'] n'a pas encore pris la valeur de $_GET['billet'] ou si $_SESSION['billet'] n'existe pas. Mais tu peux choisir ce que tu veux comme valeur par défaut.
Perso je choisi souvent la valeur null car c'est logique et cela permet de faire if(isset($toto)) qui renverra false si la variable n'a pas été renseignée. Mais suivant les cas il peut-être plus intéressant de choisir une autre valeur comme valeur par défaut.