SQL: INSERT INTO avec un $_GET

Résolu
Bonjour,

Problème tout simple mais j'apprends actuellement le PHP MySQL:

Je suis entrain de peaufiner un blog (exercice) , je souhaite envoyer des commentaires dans ma bases de données afin de pouvoir les afficher à la suite d'un billet. 'auteur' et 'commentaire' j'y arrive, il parviennent bien jusqu'à ma base de donnée mais quand je souhaite récupérer "id_billet" avec le fonction $_GET je n'y arrive pas :( (syntaxe mauvaise) si quelqu'un pourrait m'aider SVP

// Insertion du message à l'aide d'une requête préparée
$req = $bdd -> prepare ('INSERT INTO commentaires (auteur, commentaire) VALUES (?, ?) WHERE id_billet = '$_GET['billet']'') or die (print_r ($bdd->errorInfo ()));
$req -> execute (array($_POST['auteur'], $_POST['commentaire'],$_GET['billet'])) or die (print_r ($bdd->errorInfo ()));

// Redirection du visiteur vers la page du blog
header('Location: commentairesblog.php');

Merci à vous

9 réponses

  1. Tu es au TOOOOOP Xav!!! il manquait juste ceci:

    <input type="hidden" name="billet" id = "id_billet" value="<?php echo $_GET['billet']; ?>" />

    Mais maintenant cela fonctionne merci bcp!!!!!

    Martin
    1. OK j'ai compris.

      Alors, dans la page où tu as le formulaire de commentaire, tu rajoutes un <input> hidden :
      <p> <label for = "commentaire"> Message </label> : <input type = "text" name = "commentaire" id = "commentaire" ></p>
      <input type="hidden" name="billet" value="<?php echo $_GET['billet']; ?>" />
      <input type="submit" name="button" value="Envoyer" /> 


      Ensuite, tu modifies ta requête d'insertion :
      $req = $bdd -> prepare ('INSERT INTO commentaires (auteur, commentaire, id_billet) VALUES (?, ?, ?)') or die (print_r ($bdd->errorInfo ()));
      
      $req -> execute (array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet'])) or die (print_r ($bdd->errorInfo ())); 


      Xavier
      1. non, de mon premier fichier php (commentairesblog.php vers commentairesblogpost.php)

        J'ai voulu rectifié un petit peu commentairesblogpost.php:

        // Insertion du message à l'aide d'une requête préparée
        $req = $bdd -> prepare ('INSERT INTO commentaires (auteur, commentaire, id_billet) VALUES (?, ?, ?)') or die (print_r ($bdd->errorInfo ()));

        $req -> execute (array($_POST['auteur'], $_POST['commentaire'], $_GET['id_billet'])) or die (print_r ($bdd->errorInfo ()));

        // Redirection du visiteur vers la page du blog
        header('Location: commentairesblog.php');


        Mais je me retrouve avec ce message d'erreur:
        Erreur : SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_billet' cannot be null

        Comme si $_GET['id_billet'] n'arrivait pas à trouver l'information de la page précédente commentairesblog.php.

        Merci à vous tous de m'aider ^^, c'est tout bête mais je lui suis aussi...
        1. non, de mon premier fichier php (commentairesblog.php vers commentairesblogpost.php)

          J'ai voulu rectifié un petit peu commentairesblogpost.php:

          // Insertion du message à l'aide d'une requête préparée
          $req = $bdd -> prepare ('INSERT INTO commentaires (auteur, commentaire, id_billet) VALUES (?, ?, ?)') or die (print_r ($bdd->errorInfo ()));

          $req -> execute (array($_POST['auteur'], $_POST['commentaire'], $_GET['id_billet'])) or die (print_r ($bdd->errorInfo ()));

          // Redirection du visiteur vers la page du blog
          header('Location: commentairesblog.php');


          Mais je me retrouve avec ce message d'erreur:
          Erreur : SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_billet' cannot be null

          Comme si $_GET['id_billet'] n'arrivait pas à trouver l'information de la page précédente commentairesblog.php.

          Merci à vous tous de m'aider ^^, c'est tout bête mais je lui suis aussi...
          1. Je suis pas sur de comprendre ta demande:
            tu veus passer id_billet d'une table a l'autre ?
            1. Looool je savais que j'allais passer pour un débile ^^

              Bonjoru Xavier

              En fait j'ai une page avec le billet et les commentaires sur ce billet:

              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
              <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
              <head>
              <title>Mon blog</title>
              <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
              <link href="style.css" rel="stylesheet" type="text/css" />
              </head>

              <body>
              <h1>Mon super blog !</h1>
              <p><a href="indexblog.php">Retour à la liste des billets</a></p>

              <?php
              // Connexion à la base de données
              try
              {
              $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
              $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root', $pdo_options);

              // Récupération du billet
              $req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %H:%i\') 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>

              <?php
              $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

              // Récupération des commentaires
              $req = $bdd->prepare('SELECT auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %H:%i\') 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();

              }
              catch(Exception $e)
              {
              die('Erreur : '.$e->getMessage());
              }
              ?>
              <form action = "commentairesblogpost.php" method = "post">
              <p> <label for = "auteur"> Pseudo </label>: <input type = "text" name = "auteur" id = "auteur"/></p>
              <p> <label for = "commentaire"> Message </label> : <input type = "text" name = "commentaire" id = "commentaire" ></p>
              <input type="submit" name="button" value="Envoyer" />

              </body>
              </html>

              Et ensuite, j'ai ma page qui me permet d'ajouter le nouveau commentaire (mes scripts sont loin d'être parfait mais je débute):

              <?php

              if (!empty($_POST['auteur']) && !empty($_POST['commentaire']) AND isset ($_POST ['auteur']) && isset ($_POST ['commentaire']))
              {
              try
              {
              $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
              $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root', $pdo_options);

              // Insertion du message à l'aide d'une requête préparée
              $req = $bdd -> prepare ('INSERT INTO commentaires (auteur, commentaire) VALUES (?, ?) WHERE id_billet = '$_GET['billet']'') or die (print_r ($bdd->errorInfo ()));
              $req -> execute (array($_POST['auteur'], $_POST['commentaire'],$_GET['billet'])) or die (print_r ($bdd->errorInfo ()));

              // Redirection du visiteur vers la page du blog
              header('Location: commentairesblog.php');
              }
              catch(Exception $e)
              {
              die('Erreur : '.$e->getMessage());
              }
              }
              else // Sinon, on affiche un message d'erreur
              {
              ?>
              <script type="text/javascript">

              alert('Vous avez oublié de remplir un ou plusieurs champs')
              history.back();

              </script>
              <?php
              }
              ?>
              1. >Looool je savais que j'allais passer pour un débile ^^
                Bien loin de moi cette idée.

                Mais je ne comprends toujours pas ce que tu veux faire de ce id_billet = '$_GET['billet']'
                Pour moi, il suffit d'enlever le WHERE ainsi que le ,$_GET['billet'] de la commande ->execute()

                Xavier

                PS : désolé pour le délai de réponse, je bosse en fait :p
              2. Re Salut Xavier,

                J'ai une base de donnée qui contient deux tables: billets et commentaires.

                Dans ma table commentaires j'ai 5 colonnes: id, id_billet, auteur, commentaire, date_commentaire. Je souhaiterai envoyer dans ma base de donnée id_billet dans ma table "commentaires"afin qu'il puisse être enregistré sur la page du billet en question à le suite des autres commentaires. Sans ça, id_billet = 0 dans ma base de donnée et n'arrive donc nul part car aucun billet porte l'id de 0.

                Donc je veux récupérer l'id_billet de la page commentairesblog.php et l'envoyer à ma base de donnée depuis commentairesblogpost.php.

                Source: http://www.siteduzero.com/tutoriel-3-231261-tp-un-blog-avec-des-commentaires.html

                Merci à toi!
            2. Bonjour,

              Oulà... Ta requête ne va pas, on ne met pas de WHERE avec un INSERT.
              De plus tes guillemets sont mal placés.

              Tu essaies de faire quoi exactement ? Récupérer dans une variable l'id du billet qui vient d'être inséré ?

              Xavier