Page 1 of 1

1.57.00 — erreur fatale sur le planning après mise à jour depuis la 1.54 (cookies de filtres)

Posted: 21 Oct 2026, 07:06
by thierry.courosse
Bonjour,

Si ça peut être utile à la communauté... Après une mise à jour 1.54.00 → 1.57.00, certains utilisateurs obtiennent une erreur fatale en ouvrant le planning, :

Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given
dans www/planning_data.php ligne 146
appelé depuis www/planning.php ligne 47

Cause
-----
En 1.54, le cookie de filtre était écrit en JSON simple, et relu ainsi dans www/planning_param.php :
$_SESSION['filtreStatutTache'] = json_decode($_COOKIE['filtreStatutTache']);

En 1.57, la lecture passe par base64 :
$_SESSION['filtreStatutTache'] = json_decode(base64_decode($_COOKIE['filtreStatutTache']));

Un navigateur qui porte encore l'ancien cookie (durée de vie 500 jours) fournit donc une valeur que base64_decode puis json_decode ramènent à null. La variable de session vaut null, et www/planning_data.php l'utilise sans contrôle :
ligne 146 : if(count($_SESSION['filtreStatutTache']) > 0) {
ligne 150 : if(count($_SESSION['filtreStatutProjet']) > 0) {

D'où l'erreur fatale, sous PHP 8. Deux filtres sont concernés :
filtreStatutTache et filtreStatutProjet.

Seuls les utilisateurs connectés avant la mise à jour rencontrent le problème, une seule fois par navigateur. Vider les cookies du site suffit à s'en sortir, mais chaque utilisateur doit le faire lui-même, et l'écran d'erreur n'explique rien.

Reproduction
------------
1. Installer une 1.54, se connecter, afficher le planning (le cookie filtreStatutTache est alors écrit en JSON simple).
2. Mettre à jour en 1.57 sans toucher au navigateur.
3. Rouvrir le planning : erreur fatale.

Correctif appliqué chez nous
----------------------------
Dans www/planning_param.php, aux deux endroits concernés
(lignes 223 et 236) :
$_SESSION['filtreStatutTache'] = (array) json_decode(base64_decode($_COOKIE['filtreStatutTache']));
$_SESSION['filtreStatutProjet'] = (array) json_decode(base64_decode($_COOKIE['filtreStatutProjet']));

Un cookie illisible devient ainsi un filtre vide, ce qui correspond au comportement par défaut. Vérifié sur une copie de notre installation : ancien cookie, nouveau cookie, cookie vide et cookie abîmé passent tous, et le filtrage par statut continue de fonctionner normalement.

Merci pour votre travail sur cette version, la mise à jour s'est bien passée par ailleurs.