par
twnguy » 02 nov. 2023, 06:01
Hello à tous !
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
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

[b]Hello à tous[/b] ! :D
J'ai commencé PHP il y a une semaine et j'ai bientôt fini mon projet MAIS... [b]je bloque sur la partie commentaires[/b].
J'ai cette erreur qui s'affiche lorsque le bouton submit est envoyé :
[PHP] 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[/PHP]
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]
<?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}");
}
}
?>
[/PHP]
Voici le formulaire -- [i]le name du textarea introduit par la fonction BBCodeEditorForComments() est "comment"[/i] :
[html]
<!-- 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>
[/html]
Et voici ma table `comments` :
[PHP]
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'
)
[/PHP]
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: