boucle data sql génère une 404

Noisettes à vous peuple du spip,

Dans un squelette, je fais des essais avec la boucle #DATA et une requête sql comme source.

Si je fais un truc simple, ça fonctionne et je suis content. Du genre:

[(#SET{requete,"SELECT COUNT(*) AS soncompte FROM spip_auteurs"})]

<BOUCLE_d2(DATA){source sql, #GET{requete}}>
        La bas : #VALEUR{soncompte}   <br>
</BOUCLE_d2>

Si je fais un truc moins simple, ça fait une 404. Du genre:

[(#SET{requete,"SELECT sau.nom AS lauteur, COUNT(sau.id_auteur) AS soncompte FROM spip_articles sar
        INNER JOIN spip_auteurs_liens saul ON saul.id_objet = sar.id_article
        INNER JOIN spip_mots_liens smol ON smol.id_objet = sar.id_article
        INNER JOIN spip_auteurs sau ON sau.id_auteur = saul.id_auteur
        INNER JOIN spip_mots smo USING(id_mot)
        WHERE smol.id_mot LIKE 22
        GROUP BY sau.nom 
        ORDER BY soncompte DESC"})]


<BOUCLE_d1(DATA){source sql, #GET{requete}}>
        Ici : #VALEUR{lauteur} &nbsp; et #VALEUR{soncompte}   <br>
</BOUCLE_d1>

Pourtant la requête sql est bonne et pour la petite histoire, elle me renvoie bien le nombre d’articles écrit par auteur pour un mot clé donné. Les mots clés étant associés aux articles et non aux auteurs.

Une idée ?

En vous remerciant chaleureusement, c’est de saison :sun_with_face:

Noisette aussi,

C’est peut-être le compilateur qui s’emmêle les pinceaux en présence des parenthèses dans le #SET : ça peut parfois amener à tronquer le texte ou supprimer des espaces.

Est-ce que [(#GET{requete}|var_dump)] retourne le texte complet ?

Oui si je mets le [(#GET{requete}|var_dump)] avant ou après la boucle.
Non si je le mets dans la boucle.

Ha… si je mets la requête sur une seule ligne dans le #SET ça fonctionne.

1 « J'aime »

Mmmm… par contre, je ne vois pas comment passer #ENV{id_mot} à cette requête.

Ça fonctionne parce que pour mes essais id_mot (22 dans l’exemple ci-dessus) était écrit dans la requête.

J’ai trouvé, il faut des guillemets …LIKE "#ENV{id_mot}" AND_ et voila donc ce qui fonctionne pour moi.

[(#SET{requete,"SELECT sau.nom AS lauteur, COUNT(sau.id_auteur) AS soncompte FROM spip_articles sar INNER JOIN spip_auteurs_liens saul ON saul.id_objet = sar.id_article INNER JOIN spip_mots_liens smol ON smol.id_objet = sar.id_article INNER JOIN spip_auteurs sau ON sau.id_auteur = saul.id_auteur INNER JOIN spip_mots smo USING(id_mot) WHERE smol.id_mot LIKE "#ENV{id_mot}" AND sar.statut LIKE 'publie' GROUP BY sau.nom ORDER BY soncompte DESC"})]


<BOUCLE_d1(DATA){source sql, #GET{requete}}>
        <h3>#VALEUR{soncompte} &nbsp; article(s) pour #VALEUR{lauteur}</h3>
</BOUCLE_d1>

Si ce n’est que c’est pas très lisible d’avoir la requête en une ligne, je suis content.
Merci pour la discussion.

Je suppose qu’il y a d’autres moyens pour faire la même chose, comme utiliser mes_fonctions.php mais je manque de connaissances en PHP.

Le filtre |concat est pratique pour construire des expressions complexes comme ça.
Il peut recevoir plusieurs arguments qu’il concatene.
Et a priori pour la lisibilité tu peux aller à la ligne pour chaque argument.