Une petite explication ? Ok, mais c'est bien parce que vous insistez.
J'utilisais le code PHP suivant :
// suppression du captcha $query = 'delete from ' . $core->prefix . self::$table_hash . " where hash = '" . $con->escape($hash) . "'"; // et on en profite pour enlever les anciens $current_datetime = date('Y-m-d H:i:s'); $query .= " or timestamp + interval '" . self::$hash_ttl_min . " min' < '" . $con->escape($current_datetime) . "'";
$hash
contient le hash qui correspond à la référence du captcha à supprimer, self::$table_hash
contient le nom de la table, $core->prefix
est un DCism qui retourne le préfixe des tables Dotclear, $con->escape
est un autre DCism qui permet d'avoir des données sécurisées, et enfin self::$hash_ttl_min
est le temps en minutes avant l'expiration d'un captcha.
Ça génère une requête SQL qui ressemble à ça :
DELETE FROM dc_captcha_hash WHERE hash = 'XXX' OR timestamp + interval '60 min' < '2011-05-09 09:14:14'
Ce qui marche pas dans MySQL, c'est la partie timestamp + interval '60 min'
.
Dans MySQL, il faudrait la requête suivante :
DELETE FROM dc_captcha_hash WHERE hash = 'XXX' OR timestamp + interval 60 minute < '2011-05-09 09:14:14'
On remarque : l'intervalle n'est pas mis dans une chaîne de caractères, et on utilise minute
au lieu de min
.
Comme je n'avais pas envie de faire un gros @@if@ qui tâche pour créer une requête ou l'autre, j'ai décidé de refaire le calcul en PHP. À partir de PHP 5.3, il y a la classe DateTime très pratique pour faire ce genre de choses, mais je voulais être compatible avec les versions plus vieilles[1]. J'y suis donc allé à l'ancienne !
// suppression du captcha $query = 'delete from ' . $core->prefix . self::$table_hash . " where hash = '" . $con->escape($hash) . "'"; // et on en profite pour enlever les anciens $expired_timestamp = gmmktime(gmdate('H'), gmdate('i') - self::$hash_ttl_min); $expired_datetime = gmdate('Y-m-d H:i:s', $expired_timestamp); $query .= " or timestamp < '" . $con->escape($expired_datetime) . "'";
C'est beau comme du PHP un lundi matin.
Notes
[1] car tout simplement mon blog tourne sur une version plus vieille.
6 réactions
1 De Osku - 09/05/2011, 10:26
Hello,
Merci pour cette nouvelle version.
Dis, pourquoi tu ne fermes pas tes fichiers PHP par
?>
?2 De JulienW - 09/05/2011, 10:33
Parce que c'est une pratique déconseillée aujourd'hui :-)
Vois par exemple : http://www.memorandom.fr/php/astuce...
3 De Clément - 23/05/2012, 15:10
Bonjour et bravo pour ce plugin, il m'est très pratique et m'évite les nombreux spams de bots
En revanche, je trouve qu'il alourdit considérablement la base de données, en moins d'un mois elle fait plus de 10 Mo :s
Y'a-t-il moyen de paramétrer cela afin de réduire l'espace de BDD à ce plugin ?
Merci et bravo.
4 De Julien Wajsberg - 23/05/2012, 15:50
Est-ce 10mo de données vraiment dans la table, ou 10mo "perdus" par MySQL ? PHPMyAdmin te permet d'afficher cette information.
"normalement", le plugin a une fonction de nettoyage (c'est de ça dont je parle dans mon article sur la mise-à-jour d'ailleurs). Peut-être faut-il optimiser la table de temps en temps pour récupérer l'espace perdu ?
5 De Clément - 23/05/2012, 17:07
Ce sont vraiment 10Mo dans la table.
Effectivement; d'après ce que je vois, le plugin nettoie les données au-delà des 15 derniers jours. Optimiser la table n'encourt aucun risque ?
Merci pour votre rapidité de réponse ;-)
6 De JulienW - 23/05/2012, 17:31
Optimiser la table n'encourt aucun risque :-)
Il me semble que j'ai mis 1h, et pas 15 jours (c'est la valeur $hash_ttl_min de la classe) ?