8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je suis débutant en PHP et jusqu'à maintenant, j'ai toujours trouvé les réponses à mes questions en cherchant, mais pas cette fois ci... J'étais habitué à venir sur ce forum en tant que simple invité, mais aujourd'hui, j'ai besoin d'aide, et c'est mon tout premier post Smiley smile

Je suis en train de développer une petite application web qui permet à un utilisateur de rédiger un article, de lui donner un titre et de télécharger une image via un formulaire. L'utilisateur peut prévisualiser le résultat mis en forme, et si ça lui convient, on enregistre le tout dans une table de ma base de données.

Ma version de PHP est 5.6.25 et je travaille avec Wamp en local.

J'ai un problème avec le fonctionnement des Sessions. Je les utilises afin de sauvegarder les valeurs des champs du formulaire après soumission, sinon lorsque l'utilisateur prévisualise l'article, on perd tout au rechargement de la page, et c'est embêtant. J'enregistre donc les $_POST de mes deux champs titre et texte dans deux sessions. Je demande ensuite à PHP d'afficher le contenu de ces sessions dans les attributs value=" " de mes champs, afin d'immédiatement réafficher ce que l'utilisateur à tapé.

Je précise que, par choix et souhaitant me donner un peu de difficulté, tout se passe sur une seule et unique page : redaction.php.

ça ne fonctionne malheureusement pas entièrement : lorsque j'ai rempli les champs, et que je valide le formulaire, le tout se prévisualise bien, mais mes champs sont vide. Par contre si j'actualise ma page juste après, la prévisualisation reste et mes champs se remplissent, ce qui est à la base le comportement que j'attendais... On dirait que PHP à un temps d'écart sur ce que je souhaite qu'il fasse. Je pense que le problème vient de moi, c'est sûrement une histoire de logique et peut être que je n'ai pas bien compris le fonctionnement d'une session. ça fait quelques jours que je bloque là dessus...

Ah oui, autre chose : dans ce script, en l'état actuel, on a quelques erreurs Undefined index quand on arrive sur la page. C'est normal, vu qu'on a rien soumis, les variables ne sont pas encore définies. A la base, je les avait toutes mises dans une condition if isset, mais je l'ai enlevé pensant que mon problème pouvait venir de là...


Le fonctionnement :

On y trouve deux formulaires, dont un pour écrire le texte. Un clic sur le bouton nommé "preview" affichera le texte mis en forme dans un <div> ET enregistrera le $_POST dans des sessions. Un clic sur le bouton nommé "submit" enregistrera l'article et l'adresse de l'image dans la base de données.

Le second formulaire permet simplement de télécharger une image sur le serveur. Elle s'affiche aussitôt dans l'espace de prévisualisation, et est stockée dans une variable de session afin que l'utilisateur puisse prévisualiser à souhait sans devoir re-télécharger l'image. Pour l'image, ça fonctionne très bien, elle s'affiche immédiatement, je peux écrire du texte, prévisualiser à souhait, recharger la page... L'image est toujours là. Le texte aussi cela dit, il ré-apparaît bien dans les champs, mais pas juste après avoir cliqué sur Prévisualiser, il faut d'abord recharger la page manuellement.

Voici le code HTML de la page :


<!-- Formulaire pour écrire le titre et le texte de l'article.  Ce sont ces champs là qui doivent garder leur valeur après la prévisualisation... -->
<h3>Rédiger un article :</h3>
      <form action="redaction.php" method="post" name="form" id="form">
	Titre : <input id="news_title" type="text" name="news_title" value="<?php echo $_SESSION['title'] ; ?>"><br><br>
	<textarea name="news_text" id="news_text"><?php echo $_SESSION['txt'] ;?></textarea><br>
	Auteur : <input id="news_auteur" type="text" name="news_auteur" value="<?php echo htmlentities($_SESSION['username']); ?>"/><br><br>
	
			
  <div>
	<input class="connect_button" type="submit" name="preview" value="Prévisualiser" /> &nbsp; &nbsp;
	<input class="connect_button" type="submit" name="submit" value="Publier" />
  </div>
			
  </form>
		  
		  
<!-- Formulaire pour télécharger une image -->			
<form action="redaction.php" method="post" name="image" id="image" enctype="multipart/form-data"><br>
		<input type="hidden" name="MAX_FILE_SIZE" value="20000" />
		Ajouter une image : <input id="news_image" type="file" name="news_image">&nbsp;
				<input type="submit" value="Télécharger">
</form>


<!-- Espace de prévisualisation -->
<h3 style="text-align:center;">Prévisualiser l'article :</h3>
		<div class="news_container">
			<img alt="Téléchargez une image pour la visionner" src="uploads/<?php print_r(isset($_SESSION['image']) ? $_SESSION['image'] : '' );?>">
			<?php
				
                                // Stocker les valeurs des champs dans des sessions
				$_SESSION['title'] = htmlspecialchars($_POST['news_title']);
				$_SESSION['txt'] = $_POST['news_text'];		
			
			
				if (isset($_POST['preview'])) // Si le formulaire est prévisualisé
				{
					
					
					 echo('<h3>'); print_r($_SESSION['title']); echo ('</h3>') ;				// Titre
					 print_r ($_SESSION['txt'] );												// Texte HTML
					 echo ('<i> Publié par ' . htmlspecialchars($_POST['news_auteur']) . ',');	// Publié par "nom utilisateur",
					 echo (' le ');																// le
					 echo date('d-m-Y');														// "Date"
					 echo (' à ');																// à
					 echo date('H:i');															// "Heure"
					 echo ('.</i>');															// (Fin).	
				}
					
	
				if (isset($_POST['submit']))  // Si le formulaire est soumis
				{
					// Déclaration des variables
					$news_title = htmlspecialchars($_POST['news_title']);
					$news_text = $_POST['news_text'];
					$news_auteur = htmlspecialchars($_POST['news_auteur']);
					$news_image = $_FILES['news_image']['name'];
					
					//Connexion
					try
					{
						$bdd = new PDO('mysql:host=localhost;dbname=imfp_admin;charset=utf8', 'root', '');
					}
					catch( 
					Exception $e )
					{
						die('Erreur : '.$e->getMessage());
					}
					
					//Insertion des données dans la base
					$req = $bdd->prepare( 'INSERT INTO news(news_title, news_text, news_date, news_auteur, news_image) VALUES(:news_title, :news_text, NOW(), :news_auteur, :news_image)' );
					$req->execute(array(
					'news_title' => $news_title,
					'news_text' => $news_text,
					'news_auteur' => $news_auteur,
                                        'news_image' => $news_image));


					echo "L'article a bien été ajouté.";

				}
				
					
			?>
		</div>
	


Maintenant, le code PHP, qui est situé en tout début de page :


<?php 

session_start();

// Envoyer une image
if(!empty($_FILES)){
	$dossier = 'uploads/';

if (move_uploaded_file($_FILES['news_image']['tmp_name'], $dossier.$_FILES['news_image']['name']))
{
    echo "<div class=\"sucess\">Le fichier ".$_FILES['news_image']['name'].
            " a été téléchargé avec succès.</div>";
}

// Garder l'image en mémoire
$_SESSION['image'] = $_FILES['news_image']['name'];
}
?>


J'espère vous avoir donné suffisamment d'infos pour vous permettre de m'aider. Si ce n'est pas le cas, je fournirai ce qu'il manque.

Je bloque vraiment et je ne comprend pas pourquoi le contenu de mes $_SESSION ne s'affichent pas immédiatement après soumission du formulaire. Un regard d'expert sur la chose me sera bénéfique, et je suis d'avance reconnaissant à celles et ceux qui voudront bien m'aider. Smiley lol

Merci beaucoup ! Smiley smile

Loraga
Modifié par Loraga (23 Nov 2017 - 17:03)
salut,

c'est tout simplement parce que tu assignes les valeurs à $_SESSION après l'affichage de ton formulaire.
Tu dois le faire avant :

<?php

	if (isset($_POST['preview']) || isset($_POST['submit'])) {
		// Stocker les valeurs des champs dans des sessions
		$_SESSION['title'] = $_POST['news_title'];
		$_SESSION['txt']   = $_POST['news_text'];
	}

?>
<!-- Formulaire pour écrire le titre et le texte de l'article.  Ce sont ces champs là qui doivent garder leur valeur après la prévisualisation... -->



Par contre en dehors de ta question initiale, il y a aussi beaucoup de choses qui peuvent être dites sur ton code Smiley smile .

Je te déconseillerais déjà par exemple de nommer "submit" ton <input type=submit>.
Je te conseillerais aussi d'utiliser des <labels> pour tes éléments de formulaires. Je ne sais pas trop quel est le statut de ton projet mais les mises en page avec le <br> et &nbsp; sont à éviter aussi si tu veux faire quelque chose de propre.
Il faut aussi utiliser htmlspecialchars de manière plus efficace. Pas la peine par exemple de stocker tes données avec ça mais utilise-le simplement à l'affichage.
Il y a également des manières plus simples d'afficher en sortie en PHP. Tu peux utiliser par exemple les virgules pour concaténer des variables textes avec ton texte "fixe", du genre :
echo 'Texte', $variable' encore du texte';


Il y a peut être encore d'autres choses à revoir. En espérant que ça peut déjà t'aider.
Meilleure solution
Bonjour Zalalsan,

Zelalsan a écrit :

c'est tout simplement parce que tu assignes les valeurs à $_SESSION après l'affichage de ton formulaire.


Merci beaucoup, ça fonctionne ! Smiley biggrin Le problème se situait bien entre la chaise et le clavier alors... C'était une histoire de logique que je n'ai pas encore bien saisie.

Merci également pour tes conseils bonus. J'ai du ménage à faire ! Pour les labels, je viens de constater leur utilité. Effectivement, c'est important, je vais les utiliser !

Evidemment, la mise en page avec des <br> et des espaces, c'est par flemmardise, je l'avoue... Ce n'est que temporaire, histoire d'avoir quelque chose de lisible. Ma priorité dans ce projet, c'est d'apprendre le PHP, alors je me concentre sur la programmation plutôt que sur le style, qui viendra après bien entendu.

Effectivement, le htmlspecialchars ne doit servir qu'à l'affichage... Je le sais en plus. Pour une raison obscure, j'en ai trop mis.

Merci encore pour tes conseils. Je vais pouvoir faire du ménage dans mon code, ce sera bien plus lisible et efficace !

Je place donc ce sujet en résolu. Mais si, au passage, vous constatez des grossièretés dans mon code et que vous souhaitez m'en faire part, c'est avec plaisir. On apprend énormément sur ce forum, c'est aussi le but de mon inscription ici Smiley smile

Loraga
Modifié par Loraga (23 Nov 2017 - 19:36)