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

Petit nouveau ! | 8 Messages

05 mars 2008, 16:29

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]

d0m
Mammouth du PHP | 1141 Messages

05 mars 2008, 16:49

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.

Petit nouveau ! | 8 Messages

05 mars 2008, 18:45

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.

d0m
Mammouth du PHP | 1141 Messages

06 mars 2008, 10:17

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?

Petit nouveau ! | 8 Messages

06 mars 2008, 12:50

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(); ?>

ViPHP
ViPHP | 2144 Messages

06 mars 2008, 13:01

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.

Petit nouveau ! | 8 Messages

06 mars 2008, 13:10

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?

ViPHP
ViPHP | 2144 Messages

06 mars 2008, 13:54

- 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 ?

Petit nouveau ! | 8 Messages

06 mars 2008, 14:04

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é ...

d0m
Mammouth du PHP | 1141 Messages

06 mars 2008, 14:23

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();

?>

Petit nouveau ! | 8 Messages

06 mars 2008, 14:46

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?

d0m
Mammouth du PHP | 1141 Messages

06 mars 2008, 15:03

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.

Petit nouveau ! | 8 Messages

06 mars 2008, 15:08

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é

d0m
Mammouth du PHP | 1141 Messages

06 mars 2008, 15:33

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.