Page 1 sur 1

supprimer messages d'un livre d'or...

Posté : 05 mars 2008, 16:29
par outlawing
Bonjour je me suis lancé dans l'élaboration d'un livre d'or, les pages ajout et affichage des messages ne mont pas posé de problèmes sauf que je n'arrive pas à supprimer un message de mon livre d'or :s

voici le code :

Code : Tout sélectionner

$reponse = mysql_query('SELECT * FROM guestbook ORDER BY id DESC LIMIT ' . $first . ', ' . $nb)or die (mysql_error()); while ($data = mysql_fetch_array($reponse) ) { $id = $_GET['id']; $length = 65; $text = $data['msg']; if(strlen($text) > $length) { $text = substr($text,0,$length).'[...]'; } echo "<form name='del' method='post' action='delete.php'><table width=100%>"; echo "<tr><td width=90%><p class='Style3'>De <b>".$data['nick']."</b> le ".$data['date']."</p></td>"; echo "<td></td>"; echo "<td></td></tr>"; echo "<tr><td colspan=3><p class='Style3'>".$text."</p></td></tr>"; echo "<tr><td><input name='del' type='image' src='../images/web/del.png'><input name='delete' type='hidden' value='".$id."'></td></tr>"; echo "</table></form>"; } mysql_close();
(ne faites pas attention à la varible first qui sert à la pagination)
Je pense que le problème vient de la récupération de l'id du message, j'ai cherché tous les moyens sur le net, mais je n'ai pas trouvé.

le code du delete.php est basique:

Code : Tout sélectionner

<? include('../_connexion.php'); $id = $_GET['id']; $delete = mysql_query("DELETE * FROM guestbook WHERE id='".$id."'"); mysql_close(); ?>
Je me demande si la fonction while n'y serait pas pour quelques chose aussi ?

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 05 mars 2008, 16:49
par d0m
Salut,

te casse pas trop la tête dans le code pur, ton formulaire est en méthode POST et tu tentes de récupérer l'identifiant avec la variable $_GET.

Essaie avec $_POST plutôt.

Posté : 05 mars 2008, 18:45
par outlawing
euh en fait cest par ce que jai tenté quelques trucs mais normalement il est en $_POST. Le probleme cest que quand je cliques sur l'image rien ne se passe.

Posté : 06 mars 2008, 10:17
par d0m
euh en fait cest par ce que jai tenté quelques trucs mais normalement il est en $_POST. Le probleme cest que quand je cliques sur l'image rien ne se passe.
cette ligne là dans le while est aussi un test d'autre chose?
<?php
while ($data = mysql_fetch_array($reponse) ){ 
  $id = $_GET['id'];
   ...
?>
parce que ça serait plutôt
<?php
while ($data = mysql_fetch_array($reponse) ){ 
  $id = $data['id'];
   ...
?>
Tu pourrais nous donner le code initial, avant tous ces testage de trucs?

Posté : 06 mars 2008, 12:50
par outlawing
Salut, merci de ta réponse. En fait le code initial affiche uniquement les messages. J'ai tenté de rajouté un formulaire avec une balise hidden pour retrouver l'id et un bouton image qui est sensé supprimer le message lié à l'id:

Code : Tout sélectionner

while ($data = mysql_fetch_array($reponse) ) { $length = 65; $text = $data['msg']; if(strlen($text) > $length) { $text = substr($text,0,$length).'[...]'; } echo "<table width=100%>"; echo "<tr><td width=90%><p class='Style3'>De <b>".$data['nick']."</b> le ".$data['date']."</p></td>"; echo "<td></td>"; echo "<td></td></tr>"; echo "<tr><td colspan=3><p class='Style3'>".$text."</p></td></tr>"; echo "<tr><td></td></tr>"; echo "</table>; }
lorsque j'associe $id à $data['id'] et que je cliques sur le bouton supprimer cela lance la page delete.php mais cela ne supprime pas le message.

voici le code de delete.php:

Code : Tout sélectionner

<? include('../_connexion.php'); if(isset($_POST['del'])) { $delete = mysql_query("DELETE * FROM guestbook WHERE id='".$id."'"); } mysql_close(); ?>

Posté : 06 mars 2008, 13:01
par iclo
Salut,

Le mieux, ce serait d'abord de bien nous préciser ce qui ne fonctionne pas : la liste des messages, avec les formulaires pour les supprimer, est-elle correctement généré et affichée ?
Si oui, dans ton script de suppression, commence par afficher l'id de message que tu récupère. Est-il le bon ? si oui, teste plus loin, par exemple en affichant ton query sql et vérifie qu'il est bien correcte.

Posté : 06 mars 2008, 13:10
par outlawing
salut iclo, comme je le disais la page affiche correctement la liste des messages de la table. Par contre ce que jessaie de faire cest de supprimer un message en cliquant sur sur une icone. Jai rajouté un else dans la page delete.php qui affiche "erreur" lorsque la requete naboutie pas et lorsque jappuie sur mon icone la page affiche "erreur"...

vous pouvez voir mon livre d'or ici :http://hetsi.free.fr/pages/guestbook.php

La version admin rajoute une icone en derniere ligne dans le but de supprimer le message.
Peut-etre que le formulaire est inutile? Mais peut on utiliser des balises hidden et images sans le formulaire?

Posté : 06 mars 2008, 13:54
par iclo
- La liste des messages s'affiche, mais est-ce que le code html du formulaire, est bien correcte (l'id du message est correcte ?

- Récupère-tu bien l'id du message dans la page de suppression ? Que donne un affichage du query sql ?

Posté : 06 mars 2008, 14:04
par outlawing
jai mis dans une colonne l'affichage de l'id des messages et elles sont correctes. Par contre, je crois que non elle ne recupere pas lid dans la page delete.php

Code : Tout sélectionner

<? include('../_connexion.php'); if($_POST['delete']) { $delete = mysql_query("DELETE * FROM guestbook WHERE id=".$_POST['delete'].""); header('location:admin_guestbook.php'); } else { echo 'erreur'; } mysql_close(); ?>
j'ai tjs laffichage 'erreur'...

je dois mal my prendre pr la balise hidden ou celle de submit ...

edit jai essayé avec un bouton submit a la place dune balise image:

Code : Tout sélectionner

while ($data = mysql_fetch_array($reponse) ) { $id = $data['id']; $length = 65; $text = $data['msg']; if(strlen($text) > $length) { $text = substr($text,0,$length).'[...]'; } echo "<form name='delform' method='post' action='delete.php'><table width=100%>"; echo "<tr><td width=90%><p class='Style3'>De <b>".$data['nick']."</b> le ".$data['date']."</p></td>"; echo "<td>".$id."<input name='delete' type='hidden' value=".$id."></td>"; echo "<td></td></tr>"; echo "<tr><td colspan=3><p class='Style3'>".$text."</p></td></tr>"; echo "<tr><td><input name='Supprimer' type='submit' value='Supprimer'></td></tr>"; //echo "<tr><td><input name='del' type='image' src='../images/web/del.png'><input name='delete' type='hidden' value='".$id."'></td></tr>"; echo "</table>"; echo "</form>"; }
voici le delete.php associé :

Code : Tout sélectionner

<? include('../_connexion.php'); if($_POST['Supprimer']) { $delete = mysql_query("DELETE * FROM guestbook WHERE id=".$_POST['delete'].""); header('location:admin_guestbook.php'); } else { echo 'erreur'; } mysql_close(); ?>
je n'ai plus l'affichage de 'erreur' mais le message n'est pas supprimé ...

Posté : 06 mars 2008, 14:23
par d0m
Premièrement ton test pour voir si le bouton supprimer a été cliqué ou si l'id est bien passé n'est pas bon.
if($_POST['Supprimer/delete'])
a pour but de vérifier si $_POST['Supprimer/delete'] est égale à vrai c'est à dire 1.

Il faut plutôt vérifier si la variable existe en utilisant isset

Ensuite c'est peut être ta requête qui ne fonctionne pas, affiche les erreurs SQL
(et au passage le ."" à la fin de la requête ne sert à rien)

et pour finir, il faut mettre un espace après le double point de Location dans la redirection.
<?
include('../_connexion.php');

if( isset($_POST['Supprimer']) && isset($_POST['delete']) )
{
  $delete = mysql_query("DELETE * FROM guestbook WHERE id=".$_POST['delete']) or die ('erreur sql : '.mysql_error());
  header('location: admin_guestbook.php');
}
else
{
echo 'erreur';
}
mysql_close();

?>

Posté : 06 mars 2008, 14:46
par outlawing
jai ecrit comme ca

Code : Tout sélectionner

$delete = mysql_query("DELETE * FROM guestbook WHERE id=".$_POST['delete'] or die ('erreur sql : '.mysql_error()));
et je n'ai plus de message d'erreur par contre le message nest tjs pas supprimé :cry:

peut etre que jai mal placé la balise hidden? Doit elle se trouver en fin de formulaire?

Posté : 06 mars 2008, 15:03
par d0m
c'est parce que c'est pas la bonne façon d'utiliser or die()
regarde bien ce que j'ai écrit, l'appel à la fonction or die se place après mysql_query et pas dedans.

Posté : 06 mars 2008, 15:08
par outlawing
jai rectifié jobtient :

erreur sql : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM guestbook WHERE id=10' at line 1

EDIT:

j'ai trouvé, voici la synthaxe correcte dans ce cas-ci, il faut juste supprimer * :
$delete = mysql_query("DELETE FROM guestbook WHERE id=".$_POST['delete']) or die ('erreur sql : '.mysql_error());
testé et vérifé, ca marche ;)

merci à vous 2 pour m'avoir aidé

Posté : 06 mars 2008, 15:33
par d0m
on y arrive,

les erreurs sql donnent la partie de la requête juste après l'erreur.
Dans ton cas :

Code : Tout sélectionner

to use near '* FROM guestbook WHERE id=10'
veux dire que le problème se trouve au niveau de

Code : Tout sélectionner

DELETE *
C'est tout simplement parce que la commande SQL DELETE FROM ne s'utilise pas comme ceci.
On ne précise pas les champs qu'on efface car tout l'enregistrement est effacé.
Donc pas d' * . mode d'emploi de DELETE.