Un cas réel : la boulette "ultra-conne" ;-)

Des paramètres #SET #GET non calculés ?

  dans une boucle avec partie conditionnelle ? pourquoi !!

TOUJOURS mettre au maximum les définitions de #SET en tout début de fichier…
(et surtout PAS dans une partie conditionnelle !! car elle est compilée après !)

Article publié le 20 novembre 2020, et actualisé en novembre 2020

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 On ne se moque pas ! cela peut même arriver aux meilleurs ; mais cela vous servira !

La question !

Pourquoi, dans ma boucle, le critère where avec un paramètre dynamique ne marche pas ?

C’est le cas classique d’une simple boucle avec un critère paramétré, habituellement valorisé ’en dur’ par un #SET{param,truc}, donc utilisé par exemple dans critère {where #GET{param}}, qui ne donne....
Alors que l’écriture ’en dur’ dans le même contexte de données
rajoute bien la clause WHERE au SQL résultant (et donc filtre correctement les données).

 La bonne syntaxe

Bon, d’accord ; les puristes SPIP 3 feront remarquer que la bonne syntaxe normalisée pour le compilateur devrait comporter tous les séparateurs d’une expression complète, crochets et parenthèses :
Dans l’absolu, ce devrait être {where [(#GET{truc})]} ?
En fait vous pourriez vérifier que/si l’autre écriture [{where [(#GET{truc})}] n’est pas validée !
Bizarre pourtant, l’utilisation simplifiée {where #GET{truc}} n’a jamais causé de problèmes pourtant ??

 L’explication

"oula je sens la coquille ultra conne" ;-)

mis le #SET juste avant la boucle, mais du coup dans sa partie conditionnelle [1] donc qui est compilée après

Pour mémoire, une boucle de balayage SQL peut avoir des parties conditionnelles affichées avant et après le corps de boucle, (en particulier souvenez-vous le #TOTAL_BOUCLE qui ne peut être calculé de façon optimisée qu’après exécution du SQL) :

  1. // schéma de principe d'une boucle SPIP
  2. #SET    // à mettre avant toute la boucle !
  3. <B_sql>
  4.     // partie conditionnelle avant  
  5. #PAGINATION{#TOTAL_BOUCLE}
  6. <BOUCLE_sql(){critères #GET}>
  7.    // corps de boucle
  8. </BOUCLE_sql>
  9.    //partie conditionnelle après
  10. </B_sql>
  11.    //partie conditionnelle alternative
  12. <//B_sql>

Télécharger

Que celui à qui cela n’est jamais arrivé.... Merci !


Merci de nous signaler les coquilles, imprécisions ou erreurs qui figureraient dans cette page.

[1Comme en programmation traditionnelle donc !


Liens A2A visibles seulement pour les inscrits.
Liens visibles seulement pour les inscrits.

Article publié le 20 novembre 2020, et actualisé en novembre 2020 .

Répondre à cet article