Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP blog amélioré

Sujet résolu
    26 juillet 2017 à 0:32:09

    Bonjour/bonsoir, alors voilà j'ai un problème avec mon code sur le TP blog améliorer (ajout de commentaire) il m'affiche un message d'erreur et je vous avoue que je galere vraiment depuis 1 jours dessus, voilà le message d'erreur : 

    Notice: Undefined index: auteur in /Applications/MAMP/phpdoc/commentaires_post.php on line 16

    Notice: Undefined index: commentaire in /Applications/MAMP/phpdoc/commentaires_post.php on line 16

    Notice: Undefined index: id_billet in /Applications/MAMP/phpdoc/commentaires_post.php on line 16

    Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /Applications/MAMP/phpdoc/commentaires_post.php:16 Stack trace: #0 /Applications/MAMP/phpdoc/commentaires_post.php(16): PDOStatement->execute(Array) #1 {main} thrown in /Applications/MAMP/phpdoc/commentaires_post.php on line 16

    Voici mes pages php :

    index.php :

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>Mon blog</title>
    		<link rel="stylesheet" href="style.css">
    	</head>
    
    
    
    	<body>
    		<h1>Mon super blog !</h1>
    		<p>Derniers billets du blog :</p>
    
    <?php 
    
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root');
    }
    catch(Exception $e)
    {
    	die ('Erreur : ' .$e->getMessage());
    }
    // On récupère les billets par ordre de date.
    $req = $bdd->query('SELECT id, titre, contenu, DATE_FORMAT(date_creation,\'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets ORDER BY date_creation DESC LIMIT 0,5');
    
    while ($donnees = $req->fetch())
    {
    ?>
    		<div class="news">
    			<h3>
    				<?php echo htmlspecialchars($donnees['titre']);?>
    				<em>le <?php echo htmlspecialchars($donnees['date_creation_fr']);?></em>
    	
    			</h3>
    
    			<p>
    			<?php 
    			echo nl2br(htmlspecialchars($donnees['contenu']));
    			?>
    			<br/>
    			<em><a href="commentaires.php?billet=<?php echo $donnees['id'];?>">Commentaires</a></em>
    			</p>
    
    		</div>
    		<?php
    		}
    		$req->CloseCursor();
    		?>
    
    	</body>
    </html>

    commentaires.php :

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>Mon blog !</title>
    		<link rel="stylesheet"  href="style.css">
    	</head>
    	
    
    	<body>
    		<h1>Mon super blog !</h1>
    		<p><a href="index.php">Retour à la liste des billets</a></p>
    
    <?php
    // CONNEXION A LA BASE DE DONNEES
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root');
    }
    catch(Exception $e)
    {
    	die ('Erreur : ' .$e->getMessage());
    }
    
    //AFFICHAGE DES BILLETS
    $req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets WHERE id = ?');
    $req->execute(array($_GET['billet']));
    $donnees = $req->fetch();
    ?>
    
    <div class="news">
        <h3>
            <?php echo htmlspecialchars($donnees['titre']); ?>
            <em>le <?php echo $donnees['date_creation_fr']; ?></em>
        </h3>
        
        <p>
        <?php
        echo nl2br(htmlspecialchars($donnees['contenu']));
        ?>
        </p>
    </div>
    
    <h2>Commentaires</h2>
    <p>
    <form method="post" action="commentaires_post.php">
    
    <input name="auteur" placeholder="Votre pseudo..." id="auteur" type="text" name="Auteur" required> <br/>
    
    <textarea type="text" id="commentaire" name="commentaire" placeholder="Ajouter un commentaire..." required></textarea> <br/>
    
    <input type="hidden" name="id_billet" value=<?php echo $_GET['billet']; ?> />
    
    <input type="submit" name="Envoyer">
    </p>
    </form>
    <?php
    $req->closeCursor(); // ON LIBERE LE CURSEUR POUR LA PROCHAINE REQUETE
    
    //AFFICHAGE  DES COMMENTAIRES
    $req = $bdd->prepare('SELECT  auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire_fr FROM commentaires WHERE id_billet = ? ORDER BY date_commentaire');
    $req->execute(array($_GET['billet']));
    
    while ($donnees = $req->fetch())
    {
    ?>
    <p><strong><?php echo htmlspecialchars($donnees['auteur']); ?></strong> le <?php echo $donnees['date_commentaire_fr']; ?></p>
    <p><?php echo nl2br(htmlspecialchars($donnees['commentaire'])); ?></p>
    
    
    <?php
    } // Fin de la boucle des commentaires
    $req->closeCursor();
    ?>
    
    
    	</body>
    </html>
     

    et enfin commentaire_post.php :

    <?php 
    // Connexion à la base de données
    try 
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    } 
    
    catch (Exception $e) 
    {
    	die('Erreur : ' . $e->getMessage());
    }
    
    // Insertion du message grâce a une requête préparée
    $req = $bdd->prepare('INSERT INTO commentaires (id_billet, auteur, commentaire, date_commentaire) VALUES (:auteur, :commentaire, :id_billet,  NOW())');
    
    $req->execute(array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet']));
    while ($donnees = $req->fetch())
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    // Redirection du visiteur vers la page des commentaires
    
    header('Location: commentaires.php?billet='.$_POST['billet']);
    
    
    
    
    ?>


    je suis débutant et je galère a apprendre je suis tout embrouyé alors soyez indulgent :D




    • Partager sur Facebook
    • Partager sur Twitter
      26 juillet 2017 à 9:21:49

      Bonjour,

      Attention Auteur ! = auteur

      Tu as ces erreurs en validant le formulaire ?

      • Partager sur Facebook
      • Partager sur Twitter
        26 juillet 2017 à 10:17:32

        Bonjour, oui en validant le formulaire c'est bien ça, et oui il y a une majuscule sur l'attribut name je ne l'avais meme pas vu !
        • Partager sur Facebook
        • Partager sur Twitter
          26 juillet 2017 à 10:31:57

          Après je ne sais pas si c'est une faute de frappe, mais tu indiques commentaire_post.php et c'est commentaires_post.php dans le formulaire.
          • Partager sur Facebook
          • Partager sur Twitter
            26 juillet 2017 à 10:41:13

            Effectivement je vois, je te tiens au jus dès que j'aurait regarder merci !
            • Partager sur Facebook
            • Partager sur Twitter
              26 juillet 2017 à 12:46:58

              Bonjour Luca.V,

              Je souhaite te donner un conseil concernant le traitement des formulaires :

              Avant d'écrire le code qui va traiter ton formulaire et en fait, avant même de te connecter à la base de donnée, la première chose à faire est de vérifier que tu reçois bien tes données de formulaires dans la page qui traite ton formulaire. Ce qui donne pour commentaires_post.php :

              <?php
              
              
              if( isset($_POST['auteur']) &&
              	isset($_POST['commentaire']) &&
              	isset($_POST['id_billet']))
              {
              	//Toutes les données sont bien présentes...
              
              	// Connexion à la base de données
              	try
              	{
              	    $bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
              	}
              	 
              	catch (Exception $e)
              	{
              	    die('Erreur : ' . $e->getMessage());
              	}
              	 
              	// Insertion du message grâce a une requête préparée
              	$req = $bdd->prepare('INSERT INTO commentaires (id_billet, auteur, commentaire, date_commentaire) VALUES (:auteur, :commentaire, :id_billet,  NOW())');
              	 
              	$req->execute(array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet']));
              	while ($donnees = $req->fetch())
              }
              else
              {
              	//Il manque une donnée au formulaire
              }
              
               // Redirection du visiteur vers la page des commentaires
               if(isset($_POST['billet']))
               {
               	header('Location: commentaires.php?billet='.$_POST['billet']);
               }
              
               ?>



              -
              Edité par KingFou 26 juillet 2017 à 12:49:30

              • Partager sur Facebook
              • Partager sur Twitter
                26 juillet 2017 à 13:25:19

                Je prend note et j'essayerai merci bien :d, par contre dans la condition else ligne 27 , on ne met rien dans l'instruction? Cela veut dire que si le formulaire est incomplet qu'est ce qu'il se passe?

                -
                Edité par Luca.V 26 juillet 2017 à 13:29:00

                • Partager sur Facebook
                • Partager sur Twitter
                  27 juillet 2017 à 5:31:44

                  Je t'en prie.
                  Justement ça, c'est à toi d'en décider >> comment ton site se comporte dans le cas d'une telle erreur ? :


                  - tu pourrais mettre une redirection vers la page du formulaire concerné

                  - tu pourrais mettre une redirection  vers une page erreur de ton site

                  - tu pourrais afficher du texte disant à l'utilisateur qu'il n'a pas bien rempli le formulaire et lui demander de cliquer sur précédent pour revenir au formulaire.

                  - tu pourrais laisser une page blanche

                  - tu peux faire ce que tu veux en faite, l'objectif étant que le comportement de ton site corresponde au mieux à ce que tu souhaite :magicien:

                  -
                  Edité par KingFou 27 juillet 2017 à 5:32:07

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 juillet 2017 à 11:40:25

                    > parameter was not defined

                    > :auteur, :commentaire, :id_billet

                    > array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet'])

                    C'est normal, dans ta requête, tes paramètres sont nommés (syntaxe :nom) mais au bind (execute), ils ne sont pas repris (PHP cherche des paramètres positionnels - écrits avec ?).

                    Ou tu rajoutes les noms en clés du tableau d'execute ou tu remplaces les marqueurs de ta requête par des ? (déconseillé)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 juillet 2017 à 18:21:44

                      Merci beaucoup Kingfou et Julp! j'ai appliquer vos conseils, mais là je bute sur un nouvelle erreur SQLSTATE , je cherche sur le web l'éventualité du problème avec le message d'erreur qui est : 

                      Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error in /Applications/MAMP/phpdoc/commentaires_post.php:29 Stack trace: #0 /Applications/MAMP/phpdoc/commentaires_post.php(29): PDOStatement->fetch() #1 {main} thrown in /Applications/MAMP/phpdoc/commentaires_post.php on line 29

                      Mes recherches n'aboutissent à pas grand choses o_O

                      mon code : 

                      <?php 
                      
                      if( isset($_POST['auteur']) &&
                          isset($_POST['commentaire']) &&
                          isset($_POST['id_billet']))
                          // Si Toutes les données sont bien présentes...
                       {
                          // Connexion à la base de données
                      	try 
                      
                      	{
                      		$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
                      	} 
                      
                      	catch (Exception $e) 
                      	{
                      		die('Erreur : ' . $e->getMessage());
                      	}
                      
                      
                      // Insertion du message grâce a une requête préparée
                      	$req = $bdd->prepare('INSERT INTO commentaires ( auteur, commentaire, id_billet, date_commentaire) VALUES ( :auteur, :commentaire, :id_billet, NOW())');
                      
                      	$req->execute(array('auteur' =>$_POST['auteur'], 
                      		'commentaire' =>$_POST['commentaire'], 
                      		'id_billet' =>$_POST['id_billet']));
                      
                      		
                      	while ($donnees = $req->fetch())
                      		
                       
                       // Redirection du visiteur vers la page des commentaires
                      
                       
                          header('Location: commentaires.php?billet='.$_POST['id_billet']);
                       
                      
                      	$req->CloseCursor();
                      
                      } 
                      
                      	else
                      	{
                      		echo "Le formulaire est incomplet, veuillez recommencer.";
                      	}
                      
                      ?>



                      -
                      Edité par Luca.V 27 juillet 2017 à 18:24:57

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 juillet 2017 à 18:34:08

                        Pas de fetch après un INSERT ! Un INSERT ne renvoie jamais rien chez MySQL.

                        Je ne comprends même pas pourquoi tu as mis while ($donnees = $req-&gt;fetch()). Supprimes cette ligne, déplaces le closeCursor avant header tant qu'à faire (ou supprimes-le même, il n'est pas utile) et ajoutes un exit; après header, "normalement", ils vont toujours de pair.

                        -
                        Edité par julp 27 juillet 2017 à 18:37:26

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 juillet 2017 à 18:36:13

                          Arf ça marche, je sais pas j'ai du faire un copier coller bêtement >< , c'est niquel merci Julp !
                          • Partager sur Facebook
                          • Partager sur Twitter

                          TP blog amélioré

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown