8796 sujets

Développement web côté serveur, CMS

Bonjour à tous et à toutes,

J'ai encore un léger soucis avec mon minichat Smiley bawling .

Après l'anti-doublon, c'est maintenant la suppression du message le plus ancien qui coince.

Ce que je cherche à faire :

On demande à MySQL, par l'intermédiaire de PHP, de sélectionner le message le plus ancien dans la table concernée.
Ensuite, on supprime ce message avec une requête.

Fin du script.


Tout d'abord que pensez-vous de ce court raisonnement ?

Mon code :

Pour commence, j'effectue une requête qui va aller chercher le message le plus ancien dans ma table, jusque là, rien de compliqué :


// On récupère le message le plus ancien.
		
$ancien_message = mysql_query("SELECT message FROM minichat LIMIT 0, 1 ORDER BY id DESC") or die('Erreur : ' . 'mysql_error()');


Avec cette requête, je sélectionne bien le message le plus ancien dans ma table.

C'est après que ça se corse un poil Smiley confus .

Une fois que j'ai mon ancien message, j'aimerai le supprimer via une requête de ce genre :


mysql_query("DELETE message FROM minichat WHERE id = "l'id que j'ai récupéré") or die('Erreur : ' . 'mysql_error()');


Comment faire cela simplement ?

J'ai déjà tenté quelques morceaux de code, mais en vain, aucun n'a comblé mon problème.

Si un internaute pourrait m'amener progressivement vers une solution, cela serait sympathique.

Cordialement.
jQz.
Modifié par jQz (01 Aug 2009 - 00:32)
Salut,

pas sûr d'avoir compris mais si tu n'as pas besoin d'afficher l'enregistrement en question ou de validation tu peux faire tout simplement :
DELETE FROM minichat order by id LIMIT 1
A noter que quand on fait un DELETE on ne renseigne pas de champ (message) puisqu'on supprime tout l'enregistrement et qu'à priori ce n'est pas DESC puisque le message le plus ancien aura l'id le plus petit.

Faire un tour du côté de http://sqlpro.developpez.com/ Smiley cligne
Modifié par Heyoan (27 Jul 2009 - 20:01)
a écrit :
A noter que quand on fait un DELETE on ne renseigne pas de champ (message) puisqu'on supprime tout l'enregistrement et qu'à priori ce n'est pas DESC puisque le message le plus ancien aura l'id le plus petit.


Merci pour l'information à propos de DELETE Smiley cligne .

a écrit :
Faire un tour du côté de http://sqlpro.developpez.com/ Smiley cligne .


Merci beaucoup pour ce lien dont j'ai entamé la lecture.

a écrit :
pas sûr d'avoir compris[...]


Hum, je vais essayer d'être plus explicite dans l'explication de mon problème.

Actuellement, j'ai un minichat codé à l'aide des langages XHTML et PHP.
A l'aide d'une requête MySQL, je récupère et j'affiche 12 messages au maximum, néanmoins, si les internautes postent beaucoup de message, cela va remplir considérablement ma table d'une multitude de message.

Or, je voudrais éviter l'engendrement de cette situation, donc, j'aimerais créer un petit script qui supprimerai le dernier message envoyé par un internaute afin de ne pas encombrer ma table.

Néanmoins, je voudrais savoir quelle est la manière la plus efficace d'y parvenir ?
J'ai déjà essayé en faisiant une requête suivie d'un bloc d'instructions conditionnelles, mais ça n'a pas marché.

D'où ma question, quelqu'un pourrait-il me m'aider à surmonter ce problème ?

Voilà, en espérant que cela soit plus clair Smiley smile .
Modifié par jQz (27 Jul 2009 - 21:43)
Hum... ce n'est pas encore limpide :

jQz a écrit :
je récupère et j'affiche 12 messages au maximum
Est-ce que tu veux dire que tu ne veux garder que les 12 derniers messages dans ta table ? Si oui il suffit (par exemple) de récupérer après chaque INSERT le dernier id créé (qui devrait être à priori en autoincrement) grâce à mysql_insert_id et de supprimer tout de suite après tous les enregistrements ayant un id <= à cette valeur - 12 :
Delete from minichat where id < $last_id_moins_12
Ou encore d'utiliser la requête que je te donnais plus haut (qui supprime le plus vieux message) et de l'effectuer dès que id est supérieur à 12 après chaque INSERT.

jQz a écrit :
j'aimerais créer un petit script qui supprimerai le dernier message envoyé par un internaute afin de ne pas encombrer ma table.
Je suppose que tu veux plutôt parler du plus ancien et non pas du dernier qui est le plus récent ? D'ailleurs même dans ce cas ça n'est pas très clair : si 2 personnes discutent je suppose que tu ne souhaites pas supprimer après chaque nouveau message celui qu'elles avaient envoyé juste avant ? En clair : ce n'est pas très clair...

Quant au "petit script" de quoi veux-tu parler ? D'une requête exécutée après chaque insertion ou bien d'autre chose ?


Quoi qu'il en soit je pense que tu te compliques la vie pour rien : ce genre de petits messages n'est pas près d'encombrer ta table avant plusieurs années (bon, c'est vrai que je ne connais pas ton hébergement après tout mais quand même ! Smiley langue ) et si vraiment tu veux la "purger" de temps en temps il suffit, soit de faire une requête à la main, soit de te faire un "petit script" qui se contenterait de supprimer tous les enregs dont la date est dépassée depuis x jours :
Delete from minichat where TO_DAYS(NOW()) - TO_DAYS(madate) > 15

Modifié par Heyoan (27 Jul 2009 - 23:07)
a écrit :
Hum... ce n'est pas encore limpide :


Arf...

a écrit :
Ou encore d'utiliser la requête que je te donnais plus haut (qui supprime le plus vieux message) et de l'effectuer dès que id est supérieur à 12 après chaque INSERT.


J'ai déjà essayé cette méthode, effectuer une requête suivie d'un bloc d'instructions conditionnelles mais j'ai du mal m'y prendre car je n'ai pas réussi.

a écrit :
Je suppose que tu veux plutôt parler du plus ancien et non pas du dernier qui est le plus récent ?


Oui, tout à fait.

a écrit :
Quant au "petit script" de quoi veux-tu parler ? D'une requête exécutée après chaque insertion ou bien d'autre chose ?


Tout simplement d'un script qui permet de supprimer le message le plus ancien de la table.

a écrit :
Quoi qu'il en soit je pense que tu te compliques la vie pour rien : ce genre de petits messages n'est pas près d'encombrer ta table avant plusieurs années (bon, c'est vrai que je ne connais pas ton hébergement après tout mais quand même Smiley langue ) et si vraiment tu veux la "purger" de temps en temps il suffit, soit de faire une requête à la main, soit de te faire un "petit script" qui se contenterait de supprimer tous les enregs dont la date est dépassée depuis x jours :


Oui, il est vrai que je me complique un petit peu la vie mais bon, j'aimerais la purger de temps en temps.
Actuellement, mon hébergeur est Olympe-Network mais je vais bientôt prendre mon essor vers un autre hébergeur payant Smiley langue .

a écrit :
soit de te faire un "petit script" qui se contenterait de supprimer tous les enregs dont la date est dépassée depuis x jours :


"enregs", qu'est ce que tu as voulu signifier Smiley eek ?

Pourrais-tu m'en dire plus sur ton script qui purgerait tous les "enregs" dont la date est dépassée depuis x jours ?
Modifié par jQz (28 Jul 2009 - 00:47)
Tout d'abord au sujet des termes employés :

* enregs = enregistrements.
* script = liste de commandes destinée à effectuer une certaine tâche. Dans ton cas il me semble que tu veux plutôt parler d'une requête. Ce terme serait par contre le bon pour le traitement de purge dont je te parlais.


jQz a écrit :
J'ai déjà essayé cette méthode, effectuer une requête suivie d'un bloc d'instructions conditionnelles mais j'ai du mal m'y prendre car je n'ai pas réussi.
Je ne vois pas pourquoi il y aurait besoin d'instructions conditionnelles :
mysql_query("Insert into minichat ... ") // Insertion d'1 enregistrement
$last_id_moins_12 = mysql_insert_id() - 12;
mysql_query("Delete from minichat where id < $last_id_moins_12"); // Suppression des enregistrements sauf des 12 derniers


jQz a écrit :
Tout simplement d'un script qui permet de supprimer le message le plus ancien de la table.
Je ne reviens pas sur le fait qu'il s'agit plutôt d'une requête. Celle qui permet de faire ça je te l'ai donnée dans ma première réponse... et ce n'est en fait pas ce qu'il faut faire puisque ça ne laisse pas 12 enregs dans la table.

jQz a écrit :
Oui, il est vrai que je me complique un petit peu la vie mais bon, j'aimerais la purger de temps en temps.
...
Pourrais-tu m'en dire plus sur ton script qui purgerait tous les "enregs" dont la date est dépassée depuis x jours ?
Euh... Ben je t'ai déjà donné la requête :
Delete from minichat where TO_DAYS(NOW()) - TO_DAYS(madate) > 15 // Supprime tous les enregistrements dont la date est dépassée de 15 jours
Bien sûr cela implique de rajouter un champ madate de type DATE qui sera tout simplement alimentée au moment de l'insertion avec NOW() :
INSERT into minichat set message="...", ..., madate = NOW()
a écrit :

Tout d'abord au sujet des termes employés :

* enregs = enregistrements.
* script = liste de commandes destinée à effectuer une certaine tâche. Dans ton cas il me semble que tu veux plutôt parler d'une requête. Ce terme serait par contre le bon pour le traitement de purge dont je te parlais.


Merci pour le vocabulaire Smiley cligne .

a écrit :
Je ne vois pas pourquoi il y aurait besoin d'instructions conditionnelles :


Eh bien au début, quand j'essayais de coder mon script tout seul, je commençais pas introduire une requête qui comptais le nombre d'entrées dans la table.
Ensuite, je mettais en place un bloc d'instructions conditionnelles qui, à la base, devait me permettre de supprimer le message le plus ancien, quand il y en avait plus de 12 qui étaient affichés, par l'intermédiaire d'une requête.

Malheureusement pour moi, ça n'a pas marché X).

a écrit :
Bien sûr cela implique de rajouter un champ madate de type DATE qui sera tout simplement alimentée au moment de l'insertion avec NOW()


Oui, je pense que je vais adopter cette méthode qui, comme tu l'a dis, supprime tous les enregistrements dont la date est dépassée de 15 jours.

Merci à toi, Heyoan.
Modifié par jQz (28 Jul 2009 - 14:39)
a écrit :
De rien Smiley smile !
Si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre. Smiley cligne


Ne t'en fait pas, j'y penserai Smiley cligne !

a écrit :
Bien sûr cela implique de rajouter un champ madate de type DATE qui sera tout simplement alimentée au moment de l'insertion avec NOW() :


D'accord, mais pourrais-tu être un poil plus explicite ?

Dois-je lui attribuer une valeur, un interclassement, un attribut, une ou plusieurs action(s) ?
jQz a écrit :
Dois-je lui attribuer une valeur, un interclassement, un attribut, une ou plusieurs action(s) ?
Ben non... Est-ce qu'il faut en conclure que tu n'as pas essayé ? Smiley confuse
Modifié par Heyoan (31 Jul 2009 - 22:29)
Non, je n'ai pas encore essayé pour la simple raison que je voulais savoir si il y avait des valeurs à attribuer au champ.