Virgule dans l'argument texte d'un critère (ex {where}) #5606

Open
opened 4 months ago by maieul · 6 comments
Collaborator
<BOUCLE_agenda(EVENEMENTS){where date_debut < DATE_ADD(NOW(),INTERVAL 1 HOUR)}>

génère

SELECT evenements.date_debut, evenements.timezone_affiche, evenements.id_evenement FROM spip_evenements AS `evenements` WHERE (evenements.statut = 'publie') AND date_debut < DATE_ADD(NOW()

en squissant la virgule et le reste donc -> ca bug :)

contournement

<BOUCLE_agenda(EVENEMENTS){where date_debut < DATE_ADD(NOW()#VAL{','}INTERVAL 1 HOUR)}>

Testé en SPIP 5 dev.

``` <BOUCLE_agenda(EVENEMENTS){where date_debut < DATE_ADD(NOW(),INTERVAL 1 HOUR)}> ``` génère ``` SELECT evenements.date_debut, evenements.timezone_affiche, evenements.id_evenement FROM spip_evenements AS `evenements` WHERE (evenements.statut = 'publie') AND date_debut < DATE_ADD(NOW() ``` en squissant la virgule et le reste donc -> ca bug :) contournement ``` <BOUCLE_agenda(EVENEMENTS){where date_debut < DATE_ADD(NOW()#VAL{','}INTERVAL 1 HOUR)}> ``` Testé en SPIP 5 dev.
maieul added the
compilo
label 4 months ago
Owner

C'est déjà le cas depuis toujours non ? Une virgule dans un critère est obligatoirement un séparateur d'arguments, donc si t'as besoin d'une virgule faut forcément faire ton where dans un SET avant pour lui donner une chaine déjà fabriquée (et c'est souvent ce qui est fait dans la plupart des squelettes qui utilisent where)

C'est déjà le cas depuis toujours non ? Une virgule dans un critère est obligatoirement un séparateur d'arguments, donc si t'as besoin d'une virgule faut forcément faire ton where dans un SET avant pour lui donner une chaine déjà fabriquée (et c'est souvent ce qui est fait dans la plupart des squelettes qui utilisent where)
Poster
Collaborator

oui cas depuis toujours. Mais cela me paraît une limite. Il me semble en tout cas qu'on devrait a minima pouvoir faire

{where "date_debut < DATE_ADD(NOW(),INTERVAL 1 HOUR)"}

parce que là je trouve cela assez contre intuitif de mettre du #VAL ou #GET après le where...

oui cas depuis toujours. Mais cela me paraît une limite. Il me semble en tout cas qu'on devrait a minima pouvoir faire `{where "date_debut < DATE_ADD(NOW(),INTERVAL 1 HOUR)"}` parce que là je trouve cela assez contre intuitif de mettre du `#VAL` ou `#GET` après le where...
b_b commented 4 months ago
Owner

En tout cas c'est bien documenté cf "Préparation de la condition" dans https://www.spip.net/fr_article6396.html#where :)

En tout cas c'est bien documenté cf "Préparation de la condition" dans https://www.spip.net/fr_article6396.html#where :)
b_b added the
amélioration
label 4 months ago
b_b added this to the 5.0 milestone 4 months ago
JLuc commented 2 weeks ago

Le rôle de la virgule semble assez incontournable... Ou alors avec un échappement ? {where date_debut < DATE_ADD(NOW()\,INTERVAL 1 HOUR)}

C'est un cas particulier des contraintes de la syntaxe SPIP dans le passage des arguments. Selon les moments, d'autres contraintes sont frustrantes, comme par exemple la limitation dans l'emploi de balises en argument d'un filtre ou d'un critère.
Là tu as de la chance de n'avoir pas de balises dans ton critère de base, sinon il aurait fallu passer par un |concat.

Le rôle de la virgule semble assez incontournable... Ou alors avec un échappement ? `{where date_debut < DATE_ADD(NOW()\,INTERVAL 1 HOUR)}` C'est un cas particulier des contraintes de la syntaxe SPIP dans le passage des arguments. Selon les moments, d'autres contraintes sont frustrantes, comme par exemple la limitation dans l'emploi de balises en argument d'un filtre ou d'un critère. Là tu as de la chance de n'avoir pas de balises dans ton critère de base, sinon il aurait fallu passer par un `|concat`.
maieul commented 2 weeks ago
Poster
Collaborator

peut être oui qu'un échappement serait plus pertinent.

peut être oui qu'un échappement serait plus pertinent.
cerdic commented 1 week ago
Owner

C'est le parsing des critères qui est défaillant, une virgule étant considéré comme un séparateur d'argument, qu'elle soit dans des guillemets ou non.
Et l'échappement des virgules n'est pas prévu non plus.

Sur la boucle

<BOUCLE(ARTICLES){where date < DATE_ADD(NOW(),INTERVAL 1 HOUR)}{0,10}>
<li>#ID_ARTICLE #TITRE</li>
</BOUCLE>

Le $crit->param vaut

array(2) {
  [0]=>
  array(1) {
    [0]=>
    object(Spip\Compilateur\Noeud\Texte)#8 (5) {
      ["type"]=>
      string(5) "texte"
      ["texte"]=>
      string(21) "date < DATE_ADD(NOW()"
      ["avant"]=>
      string(0) ""
      ["apres"]=>
      string(0) ""
      ["ligne"]=>
      int(0)
    }
  }
  [1]=>
  array(1) {
    [0]=>
    object(Spip\Compilateur\Noeud\Texte)#10 (5) {
      ["type"]=>
      string(5) "texte"
      ["texte"]=>
      string(16) "INTERVAL 1 HOUR)"
      ["avant"]=>
      string(0) ""
      ["apres"]=>
      string(0) ""
      ["ligne"]=>
      int(0)
    }
  }
}

On pourrait y concaténer plusieurs texte successifs avec une virgule entre chaque, mais ça risque de casser d'autres trucs...

C'est le parsing des critères qui est défaillant, une virgule étant considéré comme un séparateur d'argument, qu'elle soit dans des guillemets ou non. Et l'échappement des virgules n'est pas prévu non plus. Sur la boucle ``` <BOUCLE(ARTICLES){where date < DATE_ADD(NOW(),INTERVAL 1 HOUR)}{0,10}> <li>#ID_ARTICLE #TITRE</li> </BOUCLE> ``` Le `$crit->param` vaut ```php array(2) { [0]=> array(1) { [0]=> object(Spip\Compilateur\Noeud\Texte)#8 (5) { ["type"]=> string(5) "texte" ["texte"]=> string(21) "date < DATE_ADD(NOW()" ["avant"]=> string(0) "" ["apres"]=> string(0) "" ["ligne"]=> int(0) } } [1]=> array(1) { [0]=> object(Spip\Compilateur\Noeud\Texte)#10 (5) { ["type"]=> string(5) "texte" ["texte"]=> string(16) "INTERVAL 1 HOUR)" ["avant"]=> string(0) "" ["apres"]=> string(0) "" ["ligne"]=> int(0) } } } ``` On pourrait y concaténer plusieurs texte successifs avec une virgule entre chaque, mais ça risque de casser d'autres trucs...
cerdic changed title from Virgule dans critère `{where}` to Virgule dans l'argument texte d'un critère (ex `{where}`) 1 week ago
Sign in to join this conversation.
No Milestone
No project
No Assignees
5 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: spip/spip#5606
Loading…
There is no content yet.