[RESOLU] Echec requête SQL pour form espace commentaires

Petit nouveau ! | 9 Messages

02 nov. 2023, 06:01

Hello à tous ! :D

J'ai commencé PHP il y a une semaine et j'ai bientôt fini mon projet MAIS... je bloque sur la partie commentaires.

J'ai cette erreur qui s'affiche lorsque le bouton submit est envoyé :
 Fatal error: Uncaught Error: Call to a member function bindParam() on bool in /post.php:41 Stack trace: #0 {main} thrown in /post.php on line 41
J'ai compris qu'il y a une erreur à la ligne 40 où, la fonction prepare() retourne false, et donc, ne s'exécute pas. Or, je n'arrive pas à déceler d'erreur de syntaxe #-o

J'ai pensé que c'était parce que la requête (différente) d'au-dessus n'était pas fermée, mais même après un closeCursor() comme conseillé dans la doc, ça me le refait et je ne trouve pas vraiment de réponse sur internet, ni sur la doc d'ailleurs...

Voici le code complet :
<?php
include_once('includes/session.php');
include_once('includes/bbcode.php');


if (!empty($_GET['id']) || ctype_digit($_GET['id'])) {
    $getPostID = strip_tags(htmlspecialchars($_GET['id']));
}
else {
    header("location: post.php?id=1");
    exit();
}

// Si GET est correct on cherche les données du post
if (isset($getPostID)) {
    $query = $bdd->prepare("SELECT * FROM posts WHERE post_id = :post_id");
    $query->bindParam("post_id",$getPostID,PDO::PARAM_INT);
    $query->execute();

    // Si données sont trouvées on stock les données
    if ($query->rowCount() == 1) {
        $post_data = $query->fetch();
        $content = $post_data['content'];

        $query->closeCursor();
    }
    else {
        // Sinon le post n'existe pas
        $error = 'La page que vous recherchez est introuvable.';
    }
}

// Si le formulaire est envoyé on stock le commentaire dans une variable
if(isset($_POST['submit'])) {
    $comment_content = strip_tags(htmlspecialchars($_POST['comment']));

    if(!empty($comment_content)) {
      // On insère les données du commentaire dans la table
      $sth = $bdd->prepare("INSERT INTO comments VALUES(DEFAULT, :post_id, :comment, :author, NOW(), 1)");
>>>$sth = $bdd->prepare("INSERT INTO comments(comment_id, post_id, comment, author, date, is_enabled) VALUES(DEFAULT, :post_id, :comment, :author, NOW(), 1)")<<<<<< déjà essayé cette syntaxe
      $sth = $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $sth->bindParam("post_id",$getPostID,PDO::PARAM_INT);
      $sth->bindParam("comment",$comment_content,PDO::PARAM_STR);
      $sth->bindParam("author",$loggedUser['pseudo'],PDO::PARAM_STR);
      $sth->execute();

      // Commentaire ajouté on refresh
      $success = 'Votre commentaire a été ajouté !';

      //header("refresh=5;url=post.php?id={$getPostID}");
    }
}
  
?>

Voici le formulaire -- le name du textarea introduit par la fonction BBCodeEditorForComments() est "comment" :
            <!-- Formulaire commentaires -->
            <form name="submit" id="comment" method="post" action="">
              <?php
                echo BBCodeEditorForComments('comment', '', array('bold', 'italic', 'underline', 'stroke', 'sup', 'br', 'justify', 'center', 'right', 'img', 'video', 'url', 'quote'));
              ?>
              <div class="form-group">
                <input type="submit" class="btn btn-primary" name="submit" value="Commenter">
              </div>
              <?php if(isset($success)): ?>
                <div class="alert alert-success" role="alert">
                  <?php echo $success; ?>
                </div>
              <?php endif; ?>
            </form>

Et voici ma table `comments` :
CREATE TABLE `comments` (
  `comment_id` int(11) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) NOT NULL,
  `comment` text NOT NULL,
  `author` varchar(16) NOT NULL,
  `date` datetime NOT NULL,
  `is_enabled` tinyint(4) NOT NULL DEFAULT '1'
) 
Si vous avez des pistes... J'ai d'autres pages où plusieurs requêtes s'effectuent sur la même page et aucun soucis. Quoiqu'il en soit je pense pas que cela vienne de la requête $query car j'ai essayé d'externaliser le traitement du formulaire sur une page comment.php?id={$getPostID} et la même erreur m'est retournée...

Merci à tous et bonne nuit :roll:

Mammouth du PHP | 2703 Messages

02 nov. 2023, 09:17


Petit nouveau ! | 9 Messages

02 nov. 2023, 11:49

Salut or1 !
Quel plaisir en me levant ce matin, j'ai regardé ton commentaire après avoir regardé la doc. Je croyais que le setAttribute(PDO::ERRMODE, PDO:ERRMODE_EXCEPTION) servait à afficher les erreurs s'il y en a dans la requête non ?
Il faut s'en servir uniquement si on a une erreur, right? Mais hier mon formulaire s'envoyait, le message de succès s'affichait mais rien ne s'insérait dans la BDD, c'est pour ça que j'ai rajouté cette ligne, mais je n'ai rien modifié d'autre sinon :?

J'ai juste supprimé cette ligne tout refonctionne :oops: Des fois c'est pas grand chose j'aurais pas du faire nuit blanche :non:

Merci bonne journée !! (Je mets en résolu le temps que tu me répondes pour le setAttribute :?:

Mammouth du PHP | 2703 Messages

02 nov. 2023, 16:36

on utilise cette fonction généralement lors de l'établissement de la connexion à la base de données.
là, le problème, c'est d'avoir écraser la variable.
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
au lieu de
$sth = $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
et pas de fatal error php.

Petit nouveau ! | 9 Messages

03 nov. 2023, 01:09

C'est bon à savoir merci à toi 8-)