Livre d'or [Résolu/Fermé]

Signaler
Messages postés
106
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
7 janvier 2014
-
reverb94
Messages postés
106
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
7 janvier 2014
-
Bonjour à tous,

Je créer actuellement un livre d'or pour un site, en PHP ( fonction PDO ) et je suis confronté à quelques petits soucis.
Ayant déjà créé précédemment un système d'inscription, j'ai essayé de reprendre le même principe pour créer un livre d'or.

Dans un premier temps, j'aimerais faire en sorte que le message de l'internaute soit posté correctement sur le site avec son pseudo, sont message et la date d'édition du message ( également ajouter une note entre 1 et 10 mais à voir plus tard ^^ ).

Une erreur apparaît lors de l'envoie de donnée :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /home/croba/public_html/signaturelivreor.php:12 Stack trace: #0 /home/croba/public_html/signaturelivreor.php(12): PDOStatement->execute(Array) #1 {main} thrown in /home/croba/public_html/signaturelivreor.php on line 12

voici ma page livreor.php :

<?php session_start(); ?>
<!DOCTYPE HTML>
<html>
<head>
<link href="mafavicon.png" rel="shortcut icon" title="montitre" type="image/png" />
<link href="css1.css" rel="stylesheet" type="text/css">
<title>Livre d'or / Laissez votre avis par rapport au site, aux artistes, et divers sujets.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="Livre d'or, donner votre avis, sur les artistes, le site ou d'autres thèmes." />
<meta name="keywords" content="livre d'or, avis, commentaires, messages, site, notation, sujet" />
</head>
<body>
<div id="container">
<?php include("header.inc.php"); ?>
<?php include("menus.inc.php"); ?>
<div id="corpslivreor">
 
<div id="retourselect">
<a href="livreor.php" title="recharger la page"><h1 class="titre1">Livre d'or</h1></a>
</div>
 <div id="textelivreor">
 <p class="texte2">Ici, vous pourrez donner votre avis par rapport au site, aux artistes ou autres sujets...</p>
 </div>
 
<?php require_once("connexionlivreor.inc.php"); ?>
 
<?php 
$reponse = $bdd->prepare('SELECT membre_pseudo,messagelo,note,dateedit FROM commentaire ORDER BY dateedit DESC');
$reponse->execute();
$nb_signature = $reponse->fetch();
 
if ($nb_signature==0)
{
    echo '<p class="textewarning">'."aucune signature.".'<p>';
    }  
else {
?>
<?php
    while ($data = $reponse->fetch()) 
         
    echo htmlspecialchars($data['membre_pseudo']);
    echo htmlspecialchars($data['messagelo']);
    echo htmlspecialchars($data['note']);
    echo htmlspecialchars($data['dateedit']);
     
 } $reponse->closeCursor(); ?>
 <form action="signaturelivreor.php" method="post">
<fieldset>
<p class="classinscr"><label>Votre pseudo :
<input type="text" name="membre_pseudo" />
</label>
</p>
<p class="classinscr">
<label>Votre message :
<input type="text" name="messagelo" />
</label>
</p>
<p class="classinscr">
<label>donnez une note :
<input type="text" name="note" />
</label>
</p>
<p class="classinscr">
<label>
<input type="submit" name="submit" value="envoyer" />
</label>
</p>
</fieldset>
</form>
 
<?php  include("signaturelivreor.php"); ?>
</div>
<?php include("footer.inc.php"); ?>
 
</div>
</body>
</html>


et voici ma seconde page permettant l'insertion des données signaturelivreor.php :

<?php session_start(); ?>
<?php  
   if ((isset($_POST['membre_pseudo'])) && (isset($_POST['messagelo']))) { 
      // si les 3 variables ne sont pas vides, et si l'adresse E-mail est valide, alors, et seulement dans ce cas, on fera notre insertion dans la base
      if ((!empty($_POST['membre_pseudo'])) && (!empty($_POST['messagelo']))) { 
         
require_once("connexionlivreor.inc.php");
  
            // on prepare notre requête d'insertion des données
$reponse = $bdd->prepare('INSERT INTO commentaire (membre_pseudo,messagelo,note,dateedit) VALUES (:membre_pseudo,:messagelo,:dateedit,CURDATE())');
  
$reponse->execute(array('membre_pseudo'=>$_POST['membre_pseudo'], 'messagelo'=>$_POST['messagelo'], 'note'=>$_POST['note']));
  
            // on ferme la connexion à la base de données
  
            // on redirige le visiteur vers l'accueil du livre d'or
            header('Location: livreor.php'); 
  
      } 
      else { 
         echo "Au moins un des champs est vide."; 
      } 
   } 
   
?> 
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>laissez votre signature, vos commentaires et votre note</title>
</head>
<body>
</body>
</html>


Merci pour votre attention et votre aide.

3 réponses

Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
169
salut,

dans un premier temps affiche les données en post
<pre>
print_r($_POST);
</pre>


afin de vérifier ce que tu récupère. ensuite, je n'ai pas tout regardé en détail donc je te laisse vérifier, mais dans le cas où l'utilisateur met des caractères spéciaux dans son commentaire. pour les gérer tu as la fonction mysql_real_escape_string

exemple :
$note = mysql_real_escape_string($_POST['note']);<br/>


dis moi ce qu'il en est.

naga
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
149
Salut,

Tu t'es un peu emmêlé les pinceaux sur ta requête préparée.

Ca devrait être

$reponse = $bdd->prepare('INSERT INTO commentaire (membre_pseudo,messagelo,note,dateedit) VALUES (:membre_pseudo,:messagelo,:note,CURDATE())');

puisque c'est ce que tu a utilisé lors de ton 'binding' au lieu de

$reponse = $bdd->prepare('INSERT INTO commentaire (membre_pseudo,messagelo,note,dateedit) VALUES (:membre_pseudo,:messagelo,:dateedit,CURDATE())');

cause pour laquelle le moteur PHP ne trouve pas les bons paramètres. Pour la suite c'est nickel ;)
reverb94
Messages postés
106
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
7 janvier 2014

Bonjour Bionik,
Je vais tenté cet solution mais ça m'étonnerais que cela marche car dans une de mes autres pages, 'inscription', j'utilise le même principe sans spécifier :dateedit, et la date s'insère automatiquement grâce à Curdate.
Je tiens au courant.
Merci ton aide :) sincèrement.
Bionik
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
149
Oui je sais que tu prends la date automatiquement avec CURDATE (tu peux même essayer avec NOW() pour avoir et la date et l'heure, mais il faut que le champ dans ta table soit de type datetime), mais c'est dans le nom de tes marqueurs ou tu t'es trompé, t'as ajouté un marqueur :dateedit que tu ne 'bind' pas mais c'est plutôt :note que t'as 'bindé' par la suite donc c'est ce que tu devrais utiliser dans ta requête.
Messages postés
106
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
7 janvier 2014

Bonjour à tous,

N'ayant pas définie la variable note, je l'ai supprimé provisoirement pour m'évité quelques soucis, la requêtes fonctionne parfaitement de la manière suivante :)
$reponse = $bdd->prepare('INSERT INTO commentaire (membre_pseudo,messagelo,dateedit) VALUES (:membre_pseudo,:messagelo,Now())');
// ou CURDATE pour avoir juste la date jour mois année


Voilà ^^ merci encore pour votre aide.