SQL: INSERT INTO avec un $_GET

Résolu
Martin -  
 Martin -
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. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
    0
  2. Martin
     
    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
    }
    ?>
    0
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      >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
      0
    2. Martin
       
      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!
      0
  3. Martin
     
    Quelqu'un pourrait il JUSTE me donner la bonne syntaxe svp?
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. irreligious Messages postés 117 Statut Membre 25
     
    Je suis pas sur de comprendre ta demande:
    tu veus passer id_billet d'une table a l'autre ?
    0
  6. Martin
     
    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...
    0
  7. Martin
     
    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...
    0
  8. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
    0
  9. Martin
     
    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
    0