Bonjour/bonsoir, alors voilà j'ai un problème avec mon code sur le TP blog améliorer (ajout de commentaire) il m'affiche un message d'erreur et je vous avoue que je galere vraiment depuis 1 jours dessus, voilà le message d'erreur :
Notice: Undefined index: auteur in /Applications/MAMP/phpdoc/commentaires_post.php on line 16
Notice: Undefined index: commentaire in /Applications/MAMP/phpdoc/commentaires_post.php on line 16
Notice: Undefined index: id_billet in /Applications/MAMP/phpdoc/commentaires_post.php on line 16
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /Applications/MAMP/phpdoc/commentaires_post.php:16 Stack trace: #0 /Applications/MAMP/phpdoc/commentaires_post.php(16): PDOStatement->execute(Array) #1 {main} thrown in /Applications/MAMP/phpdoc/commentaires_post.php on line 16
Voici mes pages php :
index.php :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mon blog</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Mon super blog !</h1>
<p>Derniers billets du blog :</p>
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root');
}
catch(Exception $e)
{
die ('Erreur : ' .$e->getMessage());
}
// On récupère les billets par ordre de date.
$req = $bdd->query('SELECT id, titre, contenu, DATE_FORMAT(date_creation,\'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets ORDER BY date_creation DESC LIMIT 0,5');
while ($donnees = $req->fetch())
{
?>
<div class="news">
<h3>
<?php echo htmlspecialchars($donnees['titre']);?>
<em>le <?php echo htmlspecialchars($donnees['date_creation_fr']);?></em>
</h3>
<p>
<?php
echo nl2br(htmlspecialchars($donnees['contenu']));
?>
<br/>
<em><a href="commentaires.php?billet=<?php echo $donnees['id'];?>">Commentaires</a></em>
</p>
</div>
<?php
}
$req->CloseCursor();
?>
</body>
</html>
commentaires.php :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mon blog !</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Mon super blog !</h1>
<p><a href="index.php">Retour à la liste des billets</a></p>
<?php
// CONNEXION A LA BASE DE DONNEES
try
{
$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root');
}
catch(Exception $e)
{
die ('Erreur : ' .$e->getMessage());
}
//AFFICHAGE DES BILLETS
$req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imin%ss\') 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>
<p>
<form method="post" action="commentaires_post.php">
<input name="auteur" placeholder="Votre pseudo..." id="auteur" type="text" name="Auteur" required> <br/>
<textarea type="text" id="commentaire" name="commentaire" placeholder="Ajouter un commentaire..." required></textarea> <br/>
<input type="hidden" name="id_billet" value=<?php echo $_GET['billet']; ?> />
<input type="submit" name="Envoyer">
</p>
</form>
<?php
$req->closeCursor(); // ON LIBERE LE CURSEUR POUR LA PROCHAINE REQUETE
//AFFICHAGE DES COMMENTAIRES
$req = $bdd->prepare('SELECT auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') 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();
?>
</body>
</html>
et enfin commentaire_post.php :
<?php
// Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
// Insertion du message grâce a une requête préparée
$req = $bdd->prepare('INSERT INTO commentaires (id_billet, auteur, commentaire, date_commentaire) VALUES (:auteur, :commentaire, :id_billet, NOW())');
$req->execute(array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet']));
while ($donnees = $req->fetch())
// Redirection du visiteur vers la page des commentaires
header('Location: commentaires.php?billet='.$_POST['billet']);
?>
je suis débutant et je galère a apprendre je suis tout embrouyé alors soyez indulgent
Je souhaite te donner un conseil concernant le traitement des formulaires :
Avant d'écrire le code qui va traiter ton formulaire et en fait, avant même de te connecter à la base de donnée, la première chose à faire est de vérifier que tu reçois bien tes données de formulaires dans la page qui traite ton formulaire. Ce qui donne pour commentaires_post.php :
<?php
if( isset($_POST['auteur']) &&
isset($_POST['commentaire']) &&
isset($_POST['id_billet']))
{
//Toutes les données sont bien présentes...
// Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
// Insertion du message grâce a une requête préparée
$req = $bdd->prepare('INSERT INTO commentaires (id_billet, auteur, commentaire, date_commentaire) VALUES (:auteur, :commentaire, :id_billet, NOW())');
$req->execute(array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet']));
while ($donnees = $req->fetch())
}
else
{
//Il manque une donnée au formulaire
}
// Redirection du visiteur vers la page des commentaires
if(isset($_POST['billet']))
{
header('Location: commentaires.php?billet='.$_POST['billet']);
}
?>
Je prend note et j'essayerai merci bien :d, par contre dans la condition else ligne 27 , on ne met rien dans l'instruction? Cela veut dire que si le formulaire est incomplet qu'est ce qu'il se passe?
Je t'en prie. Justement ça, c'est à toi d'en décider >> comment ton site se comporte dans le cas d'une telle erreur ? :
- tu pourrais mettre une redirection vers la page du formulaire concerné
- tu pourrais mettre une redirection vers une page erreur de ton site
- tu pourrais afficher du texte disant à l'utilisateur qu'il n'a pas bien rempli le formulaire et lui demander de cliquer sur précédent pour revenir au formulaire.
- tu pourrais laisser une page blanche
- tu peux faire ce que tu veux en faite, l'objectif étant que le comportement de ton site corresponde au mieux à ce que tu souhaite
C'est normal, dans ta requête, tes paramètres sont nommés (syntaxe :nom) mais au bind (execute), ils ne sont pas repris (PHP cherche des paramètres positionnels - écrits avec ?).
Ou tu rajoutes les noms en clés du tableau d'execute ou tu remplaces les marqueurs de ta requête par des ? (déconseillé)
Merci beaucoup Kingfou et Julp! j'ai appliquer vos conseils, mais là je bute sur un nouvelle erreur SQLSTATE , je cherche sur le web l'éventualité du problème avec le message d'erreur qui est :
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error in /Applications/MAMP/phpdoc/commentaires_post.php:29 Stack trace: #0 /Applications/MAMP/phpdoc/commentaires_post.php(29): PDOStatement->fetch() #1 {main} thrown in /Applications/MAMP/phpdoc/commentaires_post.php on line 29
Mes recherches n'aboutissent à pas grand choses
mon code :
<?php
if( isset($_POST['auteur']) &&
isset($_POST['commentaire']) &&
isset($_POST['id_billet']))
// Si Toutes les données sont bien présentes...
{
// Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
// Insertion du message grâce a une requête préparée
$req = $bdd->prepare('INSERT INTO commentaires ( auteur, commentaire, id_billet, date_commentaire) VALUES ( :auteur, :commentaire, :id_billet, NOW())');
$req->execute(array('auteur' =>$_POST['auteur'],
'commentaire' =>$_POST['commentaire'],
'id_billet' =>$_POST['id_billet']));
while ($donnees = $req->fetch())
// Redirection du visiteur vers la page des commentaires
header('Location: commentaires.php?billet='.$_POST['id_billet']);
$req->CloseCursor();
}
else
{
echo "Le formulaire est incomplet, veuillez recommencer.";
}
?>
Pas de fetch après un INSERT ! Un INSERT ne renvoie jamais rien chez MySQL.
Je ne comprends même pas pourquoi tu as mis while ($donnees = $req->fetch()). Supprimes cette ligne, déplaces le closeCursor avant header tant qu'à faire (ou supprimes-le même, il n'est pas utile) et ajoutes un exit; après header, "normalement", ils vont toujours de pair.
Arf ça marche, je sais pas j'ai du faire un copier coller bêtement >< , c'est niquel merci Julp !
TP blog amélioré
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli