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.