[Résolu] Spip 4.4.9 - anomalie « image_reduire_par », division par 0

Bonjour,
Suite à la montée de version de SPIP vers la 4.4.9, notre site rencontre des soucis d’erreur, avec une division par zéro (0) au sein de la fonction « image_reduire_par ». Pour palier cela nous avons ajouté cette correction temporaire à la ligne 541 du modules « ecrire/inc/filtres_images_mini.php »

  if ($val == 0 || $val == '') 
  {
    $val = 1;
  }

Bien à vous,
VITALNET

peut tu fournir un code qui produit cela ?

Voici, notre modèle qui provoque cela :

                *<B_document>*
*                    <div class="vnet_image vnet_carte#ENV{id} [ spip_documents_(#ENV{align})]">*
*                        <BOUCLE_document (DOCUMENTS) {id_document=#ENV{id}} {mode?} {tout} >*
*                            [(#FICHIER|image_reduire_par{#ENV{reduire_par}})]*
*                        </BOUCLE_document>*
*                    </div>*
*                </B_document>*

Tu n’as pas de valeur par défaut, donc #ENV{reduire_par} retourne potentiellement null … Tu peux mettre #ENV{reduire_par, 2} par exemple

Hum. de ce que je vois du code, le problème se produit lorsque tu ne passe pas de valeur d’environnement reduire_par. A mon sens c’est plus à ton squelettes de s’adapter pour s’assuire que #ENV{reduire_par} ne soit pas égal à 0 que spip d’être modifié.

PAr exemple #ENV{reduire_par,1}

Cela fonctionnait en 4.3.
Avant de poster ma requête, j’ai ajouter la fonction :

                            #SET{reduire_par, 1}
                            [(#FICHIER|image_reduire_par{#ENV{reduire_par}})]

Mais cela n’a rien changer et j’ai toujours eu l’exception division par 0, jusqu’à ma modification indiquée au début de ma requête.

#SET n’affecte pas #ENV, mais #GET.

Je viens de tester en spip 4.3, et cela ne marchait pas plus en l’absence de paramètre reduire_par. Je ne vois pas du reste ce qui entree la 4.3 et la 4.4 aurai put changer le comportement.

Quoi qu’il en soit, la solution de passer une valeur par defaut à #ENV{reduire_par} me parait la meilleure.

Alors, soit c’est :

#SET{reduire_par, 1}
[(#FICHIER|image_reduire_par{#GET{reduire_par}})]

Soit :

[(#VAL{1}|setenv{reduire_par})] 
[(#FICHIER|image_reduire_par{#ENV{reduire_par}})]

Voir |setenv - SPIP

SOit beaucoup plus simple et comme dit depuis le début par marcimat et moi même

[(#FICHIER|image_reduire_par{#ENV{reduire_par,1}})]
1 « J'aime »

c’est fait pour

Nous avons apporté la modification ci-dessous à notre modèle et cela fonctionne.

                <B_document>

                    <div class="fgrcf_image fgrcf_carte#ENV{id} [ spip_documents_(#ENV{align})]">

                        <BOUCLE_document (DOCUMENTS) {id_document=#ENV{id}} {mode?} {tout} >

                            [(#FICHIER|image_reduire_par{#ENV{reduire_par, 1}})]

                        </BOUCLE_document>

                    </div>

                </B_document>

Mais nous vous assurons que dans les versions précédentes, cela fonctionnait sans cette adaptation, notre site existe et fonctionne depuis 2015 et le modèle date de cette époque.

bah moi je t’assure avoir testé ton modèle sur une 4.3 et cela ne fonctionne pas ^^

La version de PHP qui change déjà : PHP a moins de tolérances au choses au fur de ses évolutions. Dans SPIP aussi on cast en int l’entrée (on devait typer ces paramètres en SPIP 5 d’ailleurs)…

Mais le problème principal «c’est que doit-il se passer si tu envoies image_reduire_par{0} ou image_reduire_par(null)» : dans ces cas là il est plutôt logique que ça finisse en erreur car ça ne veut rien dire. On pourrait lever une erreur dans la fonction effectivement, mais ça reviendrait au même : ça serait tout de même une erreur…

Je ne sais pas ce qu’il se passait auparavant, mais j’imagine que ça ne faisait pas forcément ce qui pouvait être attendu du code.

Bonjour,

En fait cela provient que dans les versions précédentes nous utilisions PHP 7.2 puis 7.4. En migrant vers SPIP 4.4, nous avons aussi fait le choix de PHP 8.4. Donc, il y a un rapport entre cette anomalie de division par 0 et la version PHP utilisée sur la base de nos squelettes identiques dans tous les cas.