Page 1 sur 2
Eliminer les vieux messages automatiquement dans ma bd
Posté : 24 sept. 2005, 08:24
par olivebcn
Bonjour,
J'ai un petit script de chat et je désirerai éliminer les vieux messages, c'est à dire tous ceux dépassant les 100 entrées.
Quelle serait la bonne requête?
Merci beaucoup pour votre aide.
Posté : 24 sept. 2005, 08:28
par HD
quelle est la structure de ta bd ?
Posté : 24 sept. 2005, 08:34
par olivebcn
la voici:
CREATE TABLE `minichat` (
`id` int(11) NOT NULL auto_increment,
`login` varchar(255) NOT NULL default '',
`message` varchar(255) NOT NULL default '',
Merci à toi.
Posté : 24 sept. 2005, 08:57
par HD
// connexion à la bd à ajouter
$query="select count(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$nbr_mssg = mysql_fetch_assoc($result);
if ($nbr_mssg > 100) {
$query="select min(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$min = mysql_fetch_assoc($result);
$query="select max(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$max = mysql_fetch_assoc($result);
$laisser = $min +100 ;
$id=$max ;
while ($id > $laisser) {
$query="DELETE FROM minichat WHERE id=$id";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$id = $id -1 ;
}
}
je n'ai pas testé le code et il peut etre optimisé bien sur
Posté : 24 sept. 2005, 09:10
par olivebcn
Desole mais j'ai un message d'erreur, voici le code avec l'ajout de la connexion et la deconnexion de la bd:
<?
// connexion à la bd à ajouter
mysql_connect ('localhost','root','');
mysql_select_db ('test');
$query="select count(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$nbr_mssg = mysql_fetch_assoc($result);
if ($nbr_mssg > 100) {
$query="select min(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$min = mysql_fetch_assoc($result);
$query="select max(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$max = mysql_fetch_assoc($result);
$laisser = $min +100 ;
$id=$max ;
while ($id > $laisser) {
$query="DELETE FROM minichat WHERE id=$id";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$id = $id -1 ;
// on ferme la base
mysql_close();
}
}
?>
Fatal error: Unsupported operand types in
l'erreur selon lui provient de cette ligne :
$laisser = $min +100 ;
Posté : 24 sept. 2005, 09:17
par HD
1- met ton code entre les balises php comme je l'ai fait pour qu'il soit clair
2- mysql_close() devrait etre juste avant le ?>
3- essaie ce code et colle ici ce qui TOUT ce qui va s'afficher à l'ecran :
<?
mysql_connect ('localhost','root','');
mysql_select_db ('test');
$query="select count(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$nbr_mssg = mysql_fetch_assoc($result);
echo "$nbr_mssg <br>" ;
if ($nbr_mssg > 100) {
$query="select min(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$min = mysql_fetch_assoc($result);
echo "min : $min <br>" ;
$query="select max(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$max = mysql_fetch_assoc($result);
echo "max : $max <br>" ;
$laisser = $min +100 ;
$id=$max ;
echo "laisser : $laisser<br>" ;
while ($id > $laisser) {
$query="DELETE FROM minichat WHERE id=$id";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
echo "supprimé numero : $id <br>" ;
$id = $id -1 ;
}
}
mysql_close();
?>
Posté : 24 sept. 2005, 09:35
par HD
il y avait une petite erreur : ce code va supprimer les messages les plus recents (et non les plus anciens)
nouveau code :
<?
mysql_connect ('localhost','root','');
mysql_select_db ('test');
$query="select count(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$nbr_mssg = mysql_fetch_assoc($result);
echo "$nbr_mssg <br>" ;
if ($nbr_mssg > 100) {
$query="select min(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$min = mysql_fetch_assoc($result);
echo "min : $min <br>" ;
$query="select max(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$max = mysql_fetch_assoc($result);
echo "max : $max <br>" ;
$laisser = $max - 100 ;
$id=$min ;
echo "laisser : $laisser<br>" ;
while ($id < $laisser) {
$query="DELETE FROM minichat WHERE id=$id";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
echo "supprimé numero : $id <br>" ;
$id = $id + 1 ;
}
}
mysql_close();
?>
voila, s'il y a des erreurs colle ici
tout ca que va t'afficher le navigateur
Posté : 24 sept. 2005, 10:05
par smarties
As tu un datetime dans ta table ???
Posté : 24 sept. 2005, 10:25
par olivebcn
<?
mysql_connect ('localhost','root','');
mysql_select_db ('test');
$query="select count(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$nbr_mssg = mysql_fetch_assoc($result);
echo "$nbr_mssg <br>" ;
if ($nbr_mssg > 100) {
$query="select min(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$min = mysql_fetch_assoc($result);
echo "min : $min <br>" ;
$query="select max(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$max = mysql_fetch_assoc($result);
echo "max : $max <br>" ;
$laisser = $max - 100 ;
$id=$min ;
echo "laisser : $laisser<br>" ;
while ($id < $laisser) {
$query="DELETE FROM minichat WHERE id=$id";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
echo "supprimé numero : $id <br>" ;
$id = $id + 1 ;
}
}
mysql_close();
?>
Le message d'erreur est le même:
Array
min : Array
max : Array
Fatal error: Unsupported operand types in c:\archivos de programa\easyphp1-7\www\minichat.php on line 73
Pour Smarties, non je n'ai pas de datetime.
Posté : 24 sept. 2005, 10:34
par HD
il ne supporte pas requetes imbriquées (min, max...)

Posté : 24 sept. 2005, 10:39
par Cyrano
C'est normal que tu récupères cet affichage, mysql_fetch_assoc retourne un tableau associatif. Proposition de corrigé :
<?php
mysql_connect ('localhost','root','');
mysql_select_db ('test');
$query="select count(id) from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$nbr_mssg = mysql_fetch_assoc($result);
echo "$nbr_mssg <br>" ;
if ($nbr_mssg > 100)
{
$query="SELECT MIN(id) as mini FROM minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$min = mysql_fetch_assoc($result);
echo "min : ". $min['mini'] ."<br>\n" ;
$query="SELECT MAX(id) as maxi FROM minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$max = mysql_fetch_assoc($result);
echo "max : ". $max['maxi'] ."<br>\n" ;
$laisser = $max['maxi'] - 100 ;
$id = $min['mini'] ;
echo "Laissé : ". $laisser ."<br>\n" ;
while ($id < $laisser)
{
$query="DELETE FROM minichat WHERE id = ". $id .";";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
echo "Supprimé numero : ". $id ."<br>\n" ;
$id++;
}
}
mysql_close();
?>
Posté : 24 sept. 2005, 10:44
par HD
tu as modifié quoi ?
Posté : 24 sept. 2005, 10:46
par Cyrano
J'ai mis en autres
echo "min : ". $min['mini'] ."<br>\n" ;
au lieu de
echo "min : ". $min ."<br>\n" ;
en rajoutant un alias dans les requêtes SQL, pareil pour $max
Posté : 24 sept. 2005, 10:47
par olivebcn
Parfait je n'ai plus de message d'erreur
Par contre à chaque ajout de message, il me colle cela dans le navigateur
Array
min : 2
max : 8
Laissé : 3
Supprimé numero : 2
et il s'incrémente pour chaque ajout de message.
Posté : 24 sept. 2005, 10:50
par Cyrano
Je viens de m'apercevoir que j'en avais oublié un :
<?php
mysql_connect ('localhost','root','');
mysql_select_db ('test');
$query="select count(id) as nombres from minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$nbr_mssg = mysql_fetch_assoc($result);
echo $nbr_mssg['nombres'] ."<br>\n" ;
if ($nbr_mssg > 100)
{
$query="SELECT MIN(id) as mini FROM minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$min = mysql_fetch_assoc($result);
echo "min : ". $min['mini'] ."<br>\n" ;
$query="SELECT MAX(id) as maxi FROM minichat";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
$max = mysql_fetch_assoc($result);
echo "max : ". $max['maxi'] ."<br>\n" ;
$laisser = $max['maxi'] - 100 ;
$id = $min['mini'] ;
echo "Laissé : ". $laisser ."<br>\n" ;
while ($id < $laisser)
{
$query="DELETE FROM minichat WHERE id = ". $id .";";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
echo "Supprimé numero : ". $id ."<br>\n" ;
$id++;
}
}
mysql_close();
?>
Maintenant, est-ce que ton nombre de message reste correct indépendament de ce que ça t'affiche ? L'incrémentation est normale puisque ce n'est pas un nombre mais un numéro d'identifiant qui est inscrit.