L’épicerie a un nouveau toit. Nous pensons revendre la maison qui nous coûte trop cher, trouver un appartement, peut-être dans Vienne. Pas de tristesse. Avoir un projet tient. Nous avons commencé à nous projeter. Les toiles rangées dans l’atelier. Les meubles. Les livres de mon père à l’étage et au grenier. Toutes ces choses dont il faudra se défaire. Repartir sur une nouvelle tranche de vie. Ce ne sera pas la première fois. Il me faudra une solution pour les livres. Personne ne nous aidera à déménager. A. et L. ont prévenu : « Ne comptez pas sur nous. » Sur la route, en longeant la Saône, je me suis dit qu’il y avait plus de morts que de vivants. Vertige. Puis la concession que S. a achetée à Caluire. J’essaie d’imaginer ma tombe, S. venant déposer un pot de fleurs de temps à autre. J’ai toujours pensé partir le premier. Ce serait trop triste autrement. Les silhouettes sur les trottoirs marchent vers leur fin, et moi, déjà un peu mort, je regarde sans rien dire. La route grésille. Klaxons, appels de phares, nervosité. Un 4x4 arrive par la gauche, plaque boueuse, antenne tordue, clignotant oublié, il se rabat au dernier moment sous les flèches du rétrécissement. À Feyzin, palissades et tags criards sur ciel gris. Plus haut, Arkema. À Pierre-Bénite, on évite les œufs. On dit que les femmes enceintes s’inquiètent. Produits partout : air, sols, bouffe, jusque dans le lait maternel. On continue, parce que la chaîne tourne et que certains y tiennent leur mesure. La colère baisse. À Caluire, je revois la dalle vide et, posé de travers, un pot de chrysanthèmes.


Livraison d’un toit en pièces détachées


La colline qui prie


La colline qui travaille


Sinon, en rentrant j’ai pu régler le bug de la mise à jour 4.4.6 de SPIP. J’ai crée un patch, envoyé au forum spip dev ( Patrick.B.)

Titre : [statistiques] table_objet_sql() reçoit un array dans referenceurs.php → fatal PHP 8

Contexte

SPIP : x.y.z (prod)
PHP : 8.x
Plugins noyau : statistiques (version livrée avec x.y.z)
Plugins : statsobjets 2.1.0, referer_spam 1.2.1
Hébergeur/OS : …
Reproduction

Activer Statistiques et StatsObjets.
Aller dans : Activités → Statistiques → Liens entrants.
Avec certains objets passés par l’interface, l’erreur survient.
Résultat obtenu

table_objet_sql() : Argument #1 ($type) must be of type string, array given
…/ecrire/base/objets.php:1074
appelé depuis …/plugins-dist/statistiques/inc/referenceurs.php:191
Résultat attendu
Affichage normal des référents.

Analyse
referenceurs.php::referes() peut recevoir $objets sous forme de tableau (extraction depuis spip_referers_objets ou appels externes). La boucle foreach ($objets as $objet) envoie ensuite un élément potentiellement tableau à table_objet_sql($objet), qui attend une chaîne.

Correctif proposé (défensif)

Extraire proprement la colonne objet depuis sql_allfetsel.
Aplatir/normaliser $objets en tableau de chaînes.
Passer chaque $objet par objet_type() avant table_objet_sql().
Diff minimal sur plugins-dist/statistiques/inc/referenceurs.php :

--- a/plugins-dist/statistiques/inc/referenceurs.php
+++ b/plugins-dist/statistiques/inc/referenceurs.php
@@ function referes(string $referermd5, $objets = null, string $serveur = ’’) : string

  •   if ($stats_objets) {
  • if ($objets = sql_allfetsel(’DISTINCT objet’, ’spip_referers_objets’))

  • $objets_par_defaut = array_values($objets) ;

  •   if ($stats_objets) {
  • if ($tmp = sql_allfetsel(’DISTINCT objet’, ’spip_referers_objets’))

  • // extraire colonne ’objet’, nettoyer et dédupliquer

  • $liste = array_column($tmp, ’objet’) ;

  • $liste = array_filter(array_map(’strval’, $liste)) ;

  • $liste = array_values(array_unique($liste)) ;

  • $objets_par_defaut = $liste ;


  • if (sql_fetsel(’*’, ’spip_visites_articles’, ’’, ’’, ’’, ’0,1’))
    $objets_par_defaut[] = ’article’ ;

  •           // (pas de déduplication ici)
  •           $objets_par_defaut = array_values(array_unique($objets_par_defaut)) ;
      }

    @@

  • elseif (is_array($objets))

  • // laisser tel quel

  • elseif (is_array($objets))

  • // aplatir d’éventuels sous-tableaux

  • $flat = [] ;

  • foreach ($objets as $o)

  • $flat[] = is_array($o) ? reset($o) : $o ;

  • $objets = array_values(array_unique(array_filter(array_map(’strval’, $flat)))) ;


  • @@

  • foreach ($objets as $objet)

  • $table_objet_sql = table_objet_sql($objet) ;

  • foreach ($objets as $objet)

  • if (is_array($objet))

  • $objet = reset($objet) ;

  • $objet = objet_type($objet) ;

  • $table_objet_sql = table_objet_sql($objet) ;
    $id_table_objet = id_table_objet($objet) ;
    Remarque front/squelettes (optionnel)
    Dans prive/squelettes/contenu/stats_referers.html, on peut aussi normaliser côté gabarit pour éviter de passer un tableau :

#SETobjet_norm,#ENVobjet|table_valeur0,#ENVobjet

… utiliser #GETobjet_norm à la place de #ENVobjet
Mais le correctif robuste est côté PHP.