Livre d'or

Résolu/Fermé
reverb94 Messages postés 106 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 7 janvier 2014 - 27 mai 2013 à 15:21
reverb94 Messages postés 106 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 7 janvier 2014 - 30 mai 2013 à 14:08
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

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
0
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
28 mai 2013 à 13:35
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 ;)
0
reverb94 Messages postés 106 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 7 janvier 2014 1
Modifié par reverb94 le 29/05/2013 à 14:39
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.
0
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
29 mai 2013 à 14:52
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.
0
reverb94 Messages postés 106 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 7 janvier 2014 1
30 mai 2013 à 14:08
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.
0