Bonjour,
Je reviens vous voir, car j'ai un petit problème comme indiqué dans le titre.
voici le souci upload/1522331129-67715-test.jpg
J'ai essayé de le sécuriser avec
if (isset($_GET['billet'])) 
mais ça ne fonctionne pas comme je veux, après je ne sais pas si je l'ai bien placé je vous met le code principale.

// Récupération du billet
		$req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%i \') AS date_creation FROM billet WHERE id = ?');
		$req->execute(array($_GET['billet']));
		$donnees = $req->fetch();
	
		// Affichage du billet 
		if(isset($_GET['billet'])) 
		{
		echo '<div class="insides">';
			echo '<div class="block_titre">';	//On affiche le titre et la date de création du billet
				 echo'<span class="titre_forum">' . htmlspecialchars($donnees['titre']) . '</span> <p class="date_forum"> Posté le ' . $donnees['date_creation'] . '</p> ' ; 
			echo '</div>';

			echo '<p class="contenu_forum">';
				 echo nl2br (htmlspecialchars($donnees['contenu'])) ;   // On affiche le contenu du billet
			echo '</p>';		
		echo '</div>'; 
		}
		else
		{
			echo 'erreur';
		}	
		
		$req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

		// Récupération des commentaires
		$req = $bdd->prepare('SELECT pseudo, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%i \') AS date_commentaire FROM commentaires WHERE id_billet = ? ORDER BY ID DESC');
		$req->execute(array($_GET['billet']));
		while ($donnees = $req->fetch())
			
		// Affichage du billet 
		if (isset($_GET['billet'])) 
		{
		echo '<div class="commentaire">';
			
			echo '<p class="line"> Posté le ' .$donnees['date_commentaire']. 'par <b>' .htmlspecialchars($donnees['pseudo']). '</b>.<br/>';
			echo '<span style="color: blue">' .nl2br(htmlspecialchars($donnees['commentaire'])).  '</span> </p>';
		
		echo '</div>';
		}
		
		else
		{
			echo 'erreur';
		}	
		
		// Fin de la boucle des commentaires

		$req->closeCursor();


Merci.
Modifié par ricem (29 Mar 2018 - 15:53)
salut,

le plus simple serait de mettre tout ton code dans la condition.

if (isset($_GET['billet'])) {...}

Ton erreur s'affiche car tu tentes d'utiliser la variable $_GET['billet'] dans l'exécution de la requête sans pour autant que tu sois sûr qu'elle existe.

...
$req->execute(array($_GET['billet']));
...
Meilleure solution
Merci Zelalsan,
j'ai mis comme indiqué le code dans la condition, comme ceci :
if (isset($_GET['billet']))
		{
		// Récupération du billet
		$req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%i \') AS date_creation FROM billet WHERE id = ?');
		$req->execute(array($_GET['billet']));
		$donnees = $req->fetch();
	
		// Affichage du billet 
		echo '<div class="insides">';
			echo '<div class="block_titre">';	//On affiche le titre et la date de création du billet
				 echo'<span class="titre_forum">' . htmlspecialchars($donnees['titre']) . '</span> <p class="date_forum"> Posté le ' . $donnees['date_creation'] . '</p> ' ; 
			echo '</div>';

			echo '<p class="contenu_forum">';
				 echo nl2br (htmlspecialchars($donnees['contenu'])) ;   // On affiche le contenu du billet
			echo '</p>';		
		echo '</div>'; 
			
		
		$req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

		// Récupération des commentaires
		$req = $bdd->prepare('SELECT pseudo, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%i \') AS date_commentaire FROM commentaires WHERE id_billet = ? ORDER BY ID DESC');
		$req->execute(array($_GET['billet']));
		while ($donnees = $req->fetch())
			
		// Affichage des commentaires
		echo '<div class="commentaire">';
			
			echo '<p class="line"> Posté le ' .$donnees['date_commentaire']. 'par <b>' .htmlspecialchars($donnees['pseudo']). '</b>.<br/>';
			echo '<span style="color: blue">' .nl2br(htmlspecialchars($donnees['commentaire'])).  '</span> </p>';
		
		echo '</div>';
		
		// Fin de la boucle des commentaires
		
		$req->closeCursor();
		}
		?>	
		
		<form class="sujet" action="commentaire_traitement.php" method="post">
			<input class="form" type="text" name="pseudo" id="pseudo" placeholder="Votre pseudo" title="Les caractères spéciaux ne sont pas autorisé, merci"  />
			<input type="submit" class="form2" style="" value="Envoyer" /><br/>
			<textarea class="form" name="commentaire" placeholder="Éditer le commentaire ici, vous pouvez étirer le bloc verticalement en vous plaçant sur le coin en bas à droite." ></textarea>
			<input type="hidden" name="id_billet" value="<?php echo $_GET['billet'];?>" />
		</form>

Mais, il me met maintenant une erreur au niveau du <form> sur la balise
<input type="hidden" name="id_billet" value="<?php echo $_GET['billet'];?>" />

Voici l'erreur :
Notice: Undefined index: billet in C:\wamp64\www\monsite\commentaires.php on line 79 Call Stack #TimeMemoryFunctionLocation 10.0003250984{main}( )...\commentaires.php:0 " /> 

Merci de votre aide.
Modifié par ricem (29 Mar 2018 - 21:41)
Re, du coup, j'ai trouvé la solution, je vous mets le code

<?php
		
		require "#require/connet_bdd.php"; //Connexion à la base de données
		
		if (isset($_GET['billet']))
		{
			// Récupération du billet
			$req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%i \') AS date_creation FROM billet WHERE id = ?');
			$req->execute(array($_GET['billet']));
			$donnees = $req->fetch();
		
		{
		?>
		<!-- Affichage du billet -->
		
		<div class="insides">
			<div class="block_titre">	<!-- On affiche le titre et la date de création du billet -->
				<?php echo '<span class="titre_forum">' . htmlspecialchars($donnees['titre']) . '</span> <p class="date_forum"> Posté le ' . $donnees['date_creation'] . '</p> ' ; ?>
			</div>

			<p class="contenu_forum">
				<?php echo nl2br (htmlspecialchars($donnees['contenu'])) ; ?>  <!-- On affiche le contenu du billet -->
			</p>			
		</div>
			
		<?php
		}
		
		$req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

		// Récupération des commentaires
		$req = $bdd->prepare('SELECT pseudo, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%i \') AS date_commentaire FROM commentaires WHERE id_billet = ? ORDER BY ID DESC');
		$req->execute(array($_GET['billet']));
		while ($donnees = $req->fetch())
		
		{
		?>
		
		<!-- Affichage des commentaires -->
		<div class="commentaire">
			
			<p class="line"> Posté le <?php echo $donnees['date_commentaire']; ?> par <b><?php echo htmlspecialchars($donnees['pseudo']); ?></b>.<br/>
			<span style="color: blue"><?php echo nl2br(htmlspecialchars($donnees['commentaire'])); ?> </span> </p>
		
		</div>	
		
		<!-- Fin de la boucle des commentaires -->
		
		<?php
		}
		
		$req->closeCursor();
		
		{
		?>	
		
		<form class="sujet" action="commentaire_traitement.php" method="post">
			<input class="form" type="text" name="pseudo" id="pseudo" placeholder="Votre pseudo" title="Les caractères spéciaux ne sont pas autorisé, merci"  />
			<input type="submit" class="form2" style="" value="Envoyer" /><br/>
			<textarea class="form" name="commentaire" placeholder="Éditer le commentaire ici, vous pouvez étirer le bloc verticalement en vous plaçant sur le coin en bas à droite." ></textarea>
			<input type="hidden" name="id_billet" value="<?php echo $_GET['billet'];?>" />
		</form>
		<span class="line"><i>* Vous devez remplir tout les champs, votre pseudo ne doit pas comporter de caractères spéciaux, ni d'espace, de même le pseudo doit contenir entre 3 et 12 caractères.</i></span>
		
		<?php
		}
		}
		
		else
		{
			echo 'Vous essayez d\'atteindre une page qui n\'existe pas...!!!';
		}	
		
		?>

Par contre, j'aimerais votre avis sur la conception de la page, si ça corresponds à la norme PHP,
Enfin, si je peux l'améliorer ou si c'est bien comme ça (Je prends toutes le remarque, bonne et mauvaise).
Merci.
Modifié par ricem (30 Mar 2018 - 20:14)
Salut,

D'une manière générale, il vaut mieux séparer les différentes étapes dans ton code (et ça ne s'applique pas que pour le PHP). A ta place, je structurerais ton fichier en 3 parties :

- La récupération et l'initialisation des données : récupérer les données envoyées par l'utilisateur (formulaire, paramètre dans l'URL, etc...) et initialiser d'autres variables (messages d'erreurs par exemple)

- Le traitement des données : vérifier que les données fournies par l'utilisateur sont correctes et mettre à jour la base de données (toutes les requêtes SQL)

- L'affichage des données : générer le code HTML qui contient le résultat de l'opération (afficher les données traitées, ou le message d'erreur si nécessaire)

J'espère t'avoir éclairé.
Modérateur
Bonjour,

Moi ce qui me dérange dans cette version du code ce sont les appels incessants aux données GET. Celles-ci ne sont absolument pas sécurisées et vérifiées.

Qu'il s'agisse de données POST ou GET, prenez l'habitude de les récupérer en tête de page, de les sécuriser et d'hydrater la variable avec la donnée GET|POST.

Ensuite vous ne devez absolument plus utiliser de données GET|POST mais uniquement vos variables qui contiendront une donnée sûre.

Php inclus nombre de fonction de vérification et de filtres. Il contient tout ce dont vous avez besoin pour travailler les données externes.

Quand vous recevez des données externes poser-vous les questions suivantes :
Et si la donnée contient du code (JS, HTML, PHP ou autre) comment va réagir mon script ?
Quel type de donnée j'attends ? Suis-je sûr d'obtenir ce type ?

Certaines données correspondent à un schéma particulier (pattern) comme une adresse mail. Demandez-vous si la donnée reçu correspond bien au schéma attendu ?

Enfin, prévoyez toujours une issue de secours au cas où une/des données ne sont pas valides. Évitez dans ces cas là de laisser courir le script inutilement ou prévoyez des valeurs par défaut.

C'est tout, pour le moment... Smiley smile
Merci Anymah et Greg_Lumiere,
J'ai ce code qui traite l'envoi de du formulaire :

<?php

if (empty($_POST["pseudo"] AND $_POST['commentaire'] AND preg_match("#^[a-zA-Z0-9éèàù-]{3,12}$#", $_POST['pseudo']) AND strlen(trim($_POST['commentaire'])) > 0 )) 
	{
	header('Location: commentaires.php?billet=' . intval($_POST['id_billet']));
	}

else
	{
	require "#require/connet_bdd.php"; //Connexion à la base de données

	// Insertion du message à l'aide d'une requête préparée
	$req = $bdd->prepare('INSERT INTO commentaires (id_billet, pseudo, commentaire, date_commentaire) VALUES(?, ?, ?, NOW())');
	$req->execute(array($_POST['id_billet'], $_POST['pseudo'], $_POST['commentaire']));  

	// Redirection du visiteur vers la page du chatbox
	header('Location: commentaires.php?billet=' . intval($_POST['id_billet']));
	}
?>

ça sécurise un peu plus quand même... Smiley langue
Puis le requête prépare normalement ça sécurise et le "htmlspecialchars" aussi enfin, je pense Smiley lol
Modérateur
ricem a écrit :

ça sécurise un peu plus quand même... Smiley langue
Puis le requête prépare normalement ça sécurise et le "htmlspecialchars" aussi enfin, je pense Smiley lol

Que néni, vous sécurisez ici les données POST et vous reprenez dans le code précédent des données GET.
OK oui je l'avoue, je chipote et je suis sûr que vous avez prévu le coup. Smiley cligne

ricem a écrit :
Puis le requête prépare normalement ça sécurise

Ce n'est pas tant ce qui vient de votre Bdd qui soit motif à l'anxiété mais tout ce que vous y insérez ainsi que tout ce qui provient de l'extérieur - formulaire (get/post), url (get), fichiers et que sais-je encore.

ricem a écrit :
et le "htmlspecialchars" aussi enfin, je pense

Vous pensez bien Smiley biggrin
Greg_Lumiere a écrit :
Par contre comment s'imbriquent ces deux codes ? Votre procédé me semble illogique et déraisonné.

Heu....le code :
<form class="sujet" action="commentaire_traitement.php" method="post">
appelle le fichier présent au dessus...
Après, faut prendre en compte le fait que je débute, donc, je n'ai pas forcement les raisonnements appropriés Smiley murf
Modifié par ricem (30 Mar 2018 - 15:06)