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. 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
    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. Je suis pas sur de comprendre ta demande:
      tu veus passer id_billet d'une table a l'autre ?
      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. 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. 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