Php suppression resultat SQL de plusieurs lignes

Petit nouveau ! | 7 Messages

29 juin 2012, 00:46

Bonsoir,

Je suis nouveau sur le forum.
Je créé actuellement un site internet.
Celui-ci a une partir administrateur, sur laquelle l'administrateur peut (via un textarea) envoyer des messages à la base de données qui sont ensuite affichés aux visiteurs du site.
L'administrateur doit avoir la possibilité de supprimer ces messages via un formulaire.

Mon problème est le suivant :

Si le message inséré ne compte pas de saut de ligne, alors il est possible de supprimer le message sans soucis.
Cependant, à partir du moment ou il y a un "saut de ligne" alors lorsque je clique sur le lien de suppression, cela ne fait rien...

J'ai fais de multiples recherches depuis déjà un certaines nombre de semaines... mais sans succès... j'ai testé pleins de choses qui ne m'ont pour l'instant menées à rien...
Donc j'ai décidé de solliciter votre aide afin de réussir à solutionner enfin ce problème si possible...

Je vous remercie BEAUCOUP d'avance !

Bonne soirée.

Eléphanteau du PHP | 33 Messages

29 juin 2012, 05:20

Quand tu supprime ton message, tu utilise un indice comme référence ou le message lui même ?
Un requête dans le genre:

DELETE FROM `table_name` WHERE `id` = 1

ViPHP
ViPHP | 2577 Messages

29 juin 2012, 09:10

Il faudrait afficher les informations recu par la page qui traite la suppression et afficher la requete SQL pour essayer de comprendre ce qui se passe.

Le plus important est de contrôler la bonne exécution de la requete en testant les codes erreurs après la requete.

Petit nouveau ! | 7 Messages

03 juil. 2012, 09:56

Xartrick : J'utilise le message lui-même
Comme ceci :
$sql = "DELETE FROM texte WHERE zone_texte = '".$message."' ";



Voici ma page php de suppression :

<html>
<head></head>
<body>

<?php

$cnx = mysql_connect( "xxxxxxxxxx", "xxxxxxxxx", "xxxxxxxxx" );

$db = mysql_select_db( "xxxxxxxxx" );

$message = $_GET["zone_texte"];

$sql = "DELETE FROM texte WHERE zone_texte = '".$message."' ";

$requete = mysql_query($sql, $cnx);

if($requete)
{
echo("<br/>La suppression à été correctement effectuée<br/><a href='xxxxxx'>Retour</a>");
}
else
{
echo("<br/>La suppression à échouée");
}
?>
</body>
</html>

ET VOICI UNE PARTIE DU CODE DE LA PAGE ADMIN QUI PERMET DONC A L'ADMINISTRATEUR DE SUPPRIMER LES TEXTES :

<b><u><h2>Textes</h2></u>

<?php
$cnx = mysql_connect("xxxxxxxx", "xxxxxxxx", "xxxxxxxx") ;


$db = mysql_select_db( "xxxxxxxx" ) ;

$sql = "SELECT zone_texte
FROM texte" ;

$requete = mysql_query( $sql, $cnx ) ;
?>
<table class="titre" align="center">
<?
//affichage des données:
while( $result = mysql_fetch_object( $requete ) )
{
echo("<tr><td class='titre'><div align=\"center\">".$result->zone_texte."<br/><a href=\"#\" onClick=\"confirme('".$result->zone_texte."')\" >Supprimer</a></td><br>\n") ;
}
?>
</table>


J'ai insérer un petit code Java au début de la page afin de demander à l'admin lorsqu'il veut supprimer quelque chose, s'il est bien sûr de vouloir le supprimer.

ViPHP
xTG
ViPHP | 7331 Messages

03 juil. 2012, 13:13

Utilises la clé primaire de la table plutôt que le message lui même (ce dernier peut occasionner selon le code et la configuration du serveur des résultats de comparaisons inattendues : encodage, échappement, ect).

ViPHP
ViPHP | 2577 Messages

03 juil. 2012, 13:18

Je laisse mon message pour la partie en gras au moins.

Mysql et html font des choses sur les chaines pour leur traitement. Manifestement la chaine est transformée entre ce que transmet le navigateur et ce qu'enregistre musql. Peut être un problème \n\r (au lieu de \n)ou d'autres ajouts invisible de \.
Au passage, fait un test avec une quote dans le texte.

Le plus simple serait d'utiliser un id numérique pour tes messages. Ca te permettrai d'avoir 2 fois le même message sans problème.

Petit nouveau ! | 7 Messages

10 juil. 2012, 12:09

Bonjour !

Merci beaucoup pour les réponses.

Mazarini, j'ai essayé avec une quote, et en effet, cela me fait la même chose (impossible de supprimer...).
Alors donc oui, il faudrait peut-être que je supprime l'id numérique (qui serait clé primaire) ce qui supprimerait donc le message.

Par contre, comment je peux faire pour que l'id numérique s'ajoute automatiquement dans la table ? Y aurait-il une fonction (comme la fonction date) pour qu'elle se rentre automatiquement, et s'incrémente toute seule ?

Merci beaucoup d'avance!

ViPHP
xTG
ViPHP | 7331 Messages

10 juil. 2012, 14:20

AUTO_INCREMENT sur le champ. ;)

ViPHP
ViPHP | 2577 Messages

10 juil. 2012, 16:15

Avec une quote, ca ne supprime pas, mais en plus il y a une erreur à controler avec mysql_error()

Lorsque tu vois le message "La suppression à échouée" c'est qu'il y a une erreur dans ton ordre sql, pas que le message n'a pas été trouvé (cf problème de quote).

Pour voir si tu as bien supprimé une ligne : mysql_affected_rows()

Petit nouveau ! | 7 Messages

10 juil. 2012, 20:50

Donc tout est bon concernant l'auto incrémentation...

Par contre, pour la requête de suppression :

Donc au lieu de faire ceci :
$sql = "DELETE FROM texte WHERE zone_texte = '".$message."' ";

Il faut que je fasse quelque chose dans ce genre (en supprimant le numéro qui est clé primaire) :
$sql = "DELETE FROM texte WHERE numero = numero;"

Mais donc évidemment ça ne fonctionne pas...
Je ne sais pas trop quoi mettre exactement après "WHERE numero = ?" En général on y met des variables, mais étant donné que je ne demande pas à l'admin de rentrer de numéro dans le formulaire (vu qu'il y a l'auto incrémentation), je ne vois pas quelle "variable" y mettre...

Mazarini, après avoir réussi cette suppression, je mettrai tout le code qui permet l'affichage des erreurs, et à l'avenir, je le ferai automatiquement, car je me rends compte que c'est vraiment bien important ^^

Encore merci d'avance...!

ViPHP
ViPHP | 2577 Messages

10 juil. 2012, 20:55

Parce que pour effacer un message, il faut le saisir ?

Petit nouveau ! | 7 Messages

10 juil. 2012, 23:35

L'administrateur saisie un message oui... (dans un textarea...)
Mais il ne saisie pas l'id du message... et donc du coup, je ne sais pas comment faire une requete permettant la suppression de l'ID et non du MESSAGE...
C'est bien ce que vous me conseillez plus haut non ? D'ajouter un ID avec chaque message, afin de supprimer cette ID et non de supprimer le message en lui-même...

ViPHP
xTG
ViPHP | 7331 Messages

11 juil. 2012, 09:10

Oui mais on t'a aussi dit de lister les différents message et de faire un lien pour chaque message pour passer l'id à la page de suppression.

Petit nouveau ! | 7 Messages

14 juil. 2012, 14:49

Oui et bien c'est ce que je fais dans la page d'admin...
Il y a la page que voit les visiteurs, ou on trouve donc les messages.
Et lorsque l'administrateur se connecte, il a une page qui lui affiche aussi les messages qu'il a saisie précédemment, avec un petit "lien" sous chaque message permettant la suppression...

Mon problème est que, lors de la requête de suppression, il faut bien que je supprime l'ID du message (qui s'insère automatiquement dans la BDD lors de la saisie d'un message) et non le message lui-même non ?
Donc, je ne sais pas quoi mettre exactement dans ma requête...
Lorsque je supprimais le message lui-même auparavant, et bien je mettais la variable du message, mais étant donné que maintenant c'est l'ID qu'il faut supprimer, je ne vois pas quoi mettre...

Vous voyez ce que je veux dire ?

Encore merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 juil. 2012, 12:18

tu a déjà indiqué un requete fonctionnelle de suppression (delete from message where id=412 par exemple).

A partir de la il faut que tu fournisse l'id (le 412 de ma requete) au script, soit pas un formulaire soit directement dans l'url, tu utilisera quelque chose comme $_POST['id'] ou $_GET['id'] (par exemple) que tu concaténera à la requete (par exemple $sql = 'delete from message where id='.$_GET['id']; attention cette requete n'est pas utiliser ainsi, il s'agit d'un trou de sécurité. Il faut protéger les données avec des fonctions comme [url=http://www.php.net/mysql_real_escape_string]mysql_real_escape_string[/url si tu utilise mysql ou équivalent).



@+
Il en faut peu pour être heureux ......