Souci avec un livre d'or en html

Résolu/Fermé
Signaler
-
 Fugu -
Bonjour,


J'ai créer un livre d'or pour l'ajout de commentaire mais les commentaires ne s'affichent pas sur la page en question (ce que je veux) je suppose que je dois oublier quelque chose notamment en php. Merci infiniment de m'aider.





19 réponses

Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
274
bonsoir,

sans code ça risque d'être difficile
Voila le code html du formulaire:

<html>
<head>
    <link type="text/css" rel="stylesheet" href="style.css" />
<title>Insertion d'une nouvelle signature</title>
</head>


<center>

<form action="livredor.php" method="post">
   <table border=1px bordercolor="#002DFF"/>
<tr><td>
<span>Pseudo :</span>
</td><td>
<input type="text" name="pseudo" maxlength="30" size="50" value="">
</td></tr>
<tr><td>
<span>Votre message :</span>
</td><td>
<textarea name="message" cols="50" rows="10"></textarea>
<input type="submit" name="go" value="Signer">
</td></tr></table>
</form>
</center>
</body>
</html>


Il faudrait que les commentaire de ce formulaire apparaissent dans la meme page au dessus par exemple.
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
274
et le php ?
Justement c'est ce qu'il me manque je suis aller voir sur le site du zéro mais ils expliquent qu'avec une base de donnée moi je veux juste que ce soit comme sur un blog, le commentaire s'affiche et basta.
Je suppose que faire un script.php validant le commentaire est facile pour vous mais pas pour moi qui débute.
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
274
ca passe par une base de donnée sur un blog

tu peux aussi le faire par fichier mais il faut coder des fonctions qui remplace la base de donnée
Tout ça pour un malheureux commentaire?? il y a pas moyen de faire plus simple, car pour afficher un commentaire sur une page ça ma l'air bien hardu quand meme.


Si vraiment il y a pas d'autres solution merci de m'orienter vers les "fonctions" qui remplacent la bdd.
Coucou et merci,


J'utilise ce code pour poster un message et ça marche mais un soucis persiste, le commentaire n'est pas sauvegardé sur la page quand un autre commentaire est envoyé, le code:

if (isset($_POST['pseudo']) && isset($_POST['com])) { 
   
   echo 'De'.$_POST['pseudo'].' pseudo: '.$_POST['com'];  
}  


Il faudrait que chaque commentaire reste sur la page en question une fois envoyé, comment faire ça?
AVEC UNE BASE DE DONNEES, il faut bien stocker quelque part les informations(données) à afficher et c'est certainement pas la page qui fait ça. Un blog c'est une base de données, l'affichage c'est PHP qui récupére les messages et utilisateurs de chaque billets.
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
274
en l'écrivant dans un fichier ou dans une base de donnée.

echo ne fait qu'afficher pour le script en court c'est normal que ca ne sauvegarde pas ce n'est pas sont but.

soit tu écris dans un fichier et tu vas récupérer ton fichier pour le lire et l'afficher ou alors tu insert dans une base de donnée et tu sélectionnes les messages ce qui est a mon avis plus simple à mettre en place pour pouvoir administrer les message.

une dernière chose protège tes variables

htmlentities() et si tu utilise une base de donnée utilise pdo et des requêtes préparées
Ok c'est bien noté pour les htmlentities() ^^

Donc avant de me lancer dans le langage SQL je tente quand meme de faire sans vue que c'est juste une page de com's que je veux.Dans mon apprentissage j'ai un code qui m'affiche bien le livre d'or en m'affichant (cette fois-ci) une fois sur 2 le commentaire en question.

Voici le code php de la page livre d'or:

/* PARAMETRES A DEFINIR */
// Nombre maximum de commentaires à afficher par page
define('NB_COM_PAR_PAGES', 8);
// Nombre maximum de pages de commentaires affichées
define('NB_MAX_PAGES', 999);
// Nombre maximum de caractères possible dans un commentaire
define('LONGUEUR_MAX_COM', 1500);
// Nombre maximum de caractères par mot
// pour éviter une augmentation de la largeur des tableaux
define('LONGUEUR_MAX_MOT', 70);
// Chemin du fichier qui stocke les messages du livre d'or
define('FICHIER_MESSAGES', 'livredor.dat');
   
$message = (isset($_POST['message'])) ? $_POST['message'] : "";
$nom = (isset($_POST['pseudo'])) ? $_POST['pseudo'] : "";
$email = (isset($_POST['email'])) ? $_POST['email'] : "";
$page = (isset($_GET['page'])) ? $_GET['page'] : 1;
if(!file_exists(FICHIER_MESSAGES)) {
	// attention le repertoire doit avoir les droits
	// en ecriture pour la creation du fichier
	$FichierLivre=fopen(FICHIER_MESSAGES,'w+');
	$ligne1 = "Fichier livre d'or, ne pas éditer !\n";
	fputs($FichierLivre, $ligne1);
	fclose($FichierLivre);
}


Le fichier livredor.dat dont la page livredor.php se sert pour afficher les messages ne semble pas fonctionner :/ je précise qu'il est bien dans le meme répertoire que livredor.php, une erreur de code?

Merci.

Bonsoir,

Ton code crée bien le fichier livredor.dat avec la phrase que tu indiques à l'intérieur.
Il faut savoir que "w+" : Ouvre en lecture et écriture ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
Personnellement, j'utiliserai "a+" pour l'écriture et un "r" tout simple pour la lecture.
De plus, ton "if(!file_exists(FICHIER_MESSAGES))" ne sert à rien.

Je te propose ceci :
<?php
/* PARAMETRES A DEFINIR */
// Nombre maximum de commentaires à afficher par page
define('NB_COM_PAR_PAGES', 8);
// Nombre maximum de pages de commentaires affichées
define('NB_MAX_PAGES', 999);
// Nombre maximum de caractères possible dans un commentaire
define('LONGUEUR_MAX_COM', 1500);
// Nombre maximum de caractères par mot
// pour éviter une augmentation de la largeur des tableaux
define('LONGUEUR_MAX_MOT', 70);
// Chemin du fichier qui stocke les messages du livre d'or
define('FICHIER_MESSAGES', 'livredor.dat');
   
$message = (isset($_POST['message'])) ? $_POST['message'] : "";
$nom = (isset($_POST['pseudo'])) ? $_POST['pseudo'] : "";
$email = (isset($_POST['email'])) ? $_POST['email'] : "";
$page = (isset($_GET['page'])) ? $_GET['page'] : 1;

// Ecriture du fichier
$FichierLivre=fopen(FICHIER_MESSAGES,'a+');
fputs($FichierLivre, $nom);
fputs($FichierLivre, " : ");
fputs($FichierLivre, $message);
fputs($FichierLivre, "\n"); // Pour passer une ligne
fclose($FichierLivre);

// Lecture du fichier
$FichierLivre=fopen(FICHIER_MESSAGES,'r');
while (!feof($FichierLivre)) { //on parcourt toutes les lignes
  echo fgets($FichierLivre, 2000)."<br>"; // lecture du contenu de la ligne
}
fclose($FichierLivre);
?>


J'espère que c'est ça que tu veux.
Coucou et merci beaucoup, ton code marche mais j'ai pu faire plus simple encore, les commentaires s'affichent bien mais cette fois j'ai le soucis en sens inverse, a chaque actualisation ou visite avec un autre navigateur j'ai ça qui s'affiche dans mon fichier.doc:

<b>ggggg</b> (<a href="mailto:"></a>) - 05/03/2012 23:59:30<br>gggggggg<br><hr>
<b>ggggg</b> (<a href="mailto:"></a>) - 06/03/2012 00:00:51<br>gggggggg<br><hr>
<b></b> (<a href="mailto:"></a>) - 06/03/2012 00:01:21<br><br><hr>
<b></b> (<a href="mailto:"></a>) - 06/03/2012 00:01:35<br><br><hr>


C'est pas génial car en actualisant la page le commentaire précédant reviens et en la visitation d'un autre navigateur voila ce qui apparrait a la place d'un commentaire: ()


Voila le code que j'utilise pour ma page livredor:


<html>
<head>
    <link type="text/css" rel="stylesheet" href="style.css" />
<title>Insertion d'une nouvelle signature</title>
</head>

<?php 

//Ouverture du fichier en écriture

$fp = fopen("/var/www/commentaires.doc",a);



//On convertit les caracteres html

$nom = htmlspecialchars($_POST['nom']);

$mail = htmlspecialchars($_POST['mail']);

$message = stripslashes(nl2br(htmlentities($_POST['message'])));

$d = date ( "d/m/Y H:i:s" );



$page = "";

$lemail = "<a href=\"mailto:$mail\">$mail</a>";

$page .= "<b>$nom</b> (".$lemail.") - $d<br>$message<br><hr>\n";



//On rajoute le message

fwrite($fp,"$page" ,strlen("$page"));



//fermeture du fichier

fclose($fp);

?>

<center>

<form action="livredor.php" method="post">

   <table border=1px bordercolor="#000000"/>
<tr><td>
<span class="gras">Pseudo :</span>
</td><td>
<input type="text" name="nom" maxlength="30" size="50" value="">
</td></tr>
<tr><td>
<span class="gras">Votre message :</span>
</td><td>
<textarea name="message" cols="50" rows="10"></textarea>
</td></tr><tr><td><td align="center">
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Lf9A8sSAAAAAFOFiTr5U5vt-G_WjOmcQ1jJ7b1P"></script>

	<noscript>
  		<iframe src="http://www.google.com/recaptcha/api/noscript?k=6Lf9A8sSAAAAAFOFiTr5U5vt-G_WjOmcQ1jJ7b1P" height="300" width="500" frameborder="0"></iframe><br/>
  		<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
  		<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
	</noscript>
<input type="submit" name="go" value="Signer">
</td></tr></table>
</form>
</center>
<?php include("commentaires.doc"); ?>
</body>
</html>



Le code me semble bon pourtant, erreur de balise peut-etre?

Merci.

Je te conseille de créer une autre page contenant ton code php qui ajoutera le commentaire (fichier qui porte le nom de "livredoradd.php" par exemple) et à la fin de cette page, tu rajoutes :
header('Location: livredor.php');


Ce qui aura pour effet de revenir sur le formulaire et d'afficher les commentaires.
Et n'oublie pas de vérifier si "nom" et "message" ont bien été envoyés par le formulaire.
Merci de ta réponse, j'ai pu régler le problème du () qui revenait a chaque visite de page en rajoutant cette ligne:

if (!empty($_POST['nom']) && !empty($_POST['message']) )



Par contre en actualisant la page l'ancien commentaire reviens toujours :/

Pour ton conseil je prends note, c'est pour des raisons de sécurité c'est ça?
Problème régler merci !


Une dernière question, niveau sécurité quel droit donner au fichier? ne faut-il pas non plus mettre des token? j'ai vu ça sur un forum qui parlé de sécurité web.
C'est juste pour éviter d'avoir ton ancien commentaire qui revient quand tu actualises ta page.

Edit : Niveau sécurité, je ne m'y connais pas trop.
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
274
pour la sécurité l'accès a un fichier ne joue pas vraiment.

mais ça ne fait pas très pro si en entrant l'url du fichier il s'affiche. il faut le mettre dans un autre répertoire avec un fichier .htaccess qui n'autorise pas l'accès par http

mais pour si tu apprends ce n'est pas grave qu'on puisse avoir accès a ce fichier.

le mieux reste de tout faire passer par le fichier index.php et de développer le reste en objet ça à beau d'avantage comment centralisé la sécurité. réduire le code en évitent les répétitions, le rendre plus clair et mieux organiser et finalement te faciliter la vie.

plutot que fileopen etc.

utilise plutot file_put_contents et file_get_contents

https://www.php.net/manual/fr/function.file-put-contents.php

https://www.php.net/manual/fr/function.file-get-contents.php

pour file_put_contents utilise systématiquement le flag LOCK_EX ça permet d'éviter bien des soucis
Messages postés
1935
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
11 mai 2014
274
une dernière chose en espérant qu'il n'y ait pas d'erreur de code. (je suis fatigué et je le sors d'une class développé dans un autre contexte)

insère ce code au début de chaque page te permet de sécurisé toutes les données autres que les fichiers entré par l'utilisateur

 function secure($item) { 
  $object = false; 
  if(is_array($item) || (is_object($item) && get_class($item) === 'stdClass')) { 
   if(!is_array($item)) { 
    $item = (array)$item; 
    $object = true; 
   } 
   foreach($item as $key => $value) { 
    if(is_array($value) || (is_object($item) && get_class($item) === 'stdClass')) $item[$key] = secure($value); 
    else if(is_string($value)) $item[$key] = htmlentities($value); 
    else $item[$key] = $value; 
   } 
   return ($object)? (object)$item : $item; 
  } 
  elseif(is_string($item)) return htmlentities($item); 
  else return $item; 
 } 

 if(isset($_GET)) $_GET = secure($_GET); 
 if(isset($_POST)) $_GET = secure($_POST); 
 if(isset($_COOKIE)) $_GET = secure($_COOKIE);


ça permet de ne pas avoir a appeler les htmlentities a chaque entrée get post ou cookie au risque d'en oublié et ça reste totalement réversible avec html_entity_decode