[Résolu] Syntaxe SQL de boucle DATA sur plusieurs lignes

Bonjour,

Y a-t-il une syntaxe Spip qui permet de fournir à une boucle DATA SQL une chaine sur plusieurs lignes ?

#SET{sqlCouples, "SELECT id_membre, mb_no, mb_epoux_se 
FROM membres"}

<BOUCLE_couples(DATA){source sql,#GET{sqlCouples}}>
#MB_NO, 
</BOUCLE_couples>

Si je mets le FROM en nouvelle ligne, la requête ne renvoie rien.

Merci

A défaut de syntaxe , j’ai trouvé un contournement avec |replace{\n} :

#SET{sqlCouples, "
SELECT id_membre, mb_no, mb_epoux_se 
FROM membres
"}

<BOUCLE_couples(DATA){source sql,#GET{sqlCouples}|replace{\n}}>

À ma connaissance ça n’est pas possible, on peut marquer comme résolu ?

Je ne sais pas si c’est exactement ce que tu recherches, mais de mon côté je fais comme ça :

#SET{req,"SELECT o.id_oeuvre "
		" FROM spip_oeuvres AS o "
		" WHERE 1"
}

Un autre exemple plus compliqué avec des GET à l’intérieur :

#SET{req,"SELECT o.id_oeuvre "
		" FROM spip_oeuvres AS o "
		#GET{join}
		" WHERE o.statut = 'publie' "#GET{where_musee}#GET{where}#GET{where_numinventaire}#GET{where_visuel_hd}#GET{where_recherche}
		" GROUP BY o.id_oeuvre ORDER BY "#GET{order}
}

Merci pour vos propositions.
Je trouve mon |replace encore plus élégant.
Vous pouvez le marquer « sans attente de nouvelle réponse ».

Ne peut-on pas proposer cette amélioration dans SPIP ? Que les itérateurs SQL acceptent une requête sur plusieurs lignes (ce que tout interpréteur SQL admet) ?

Merci

Pour continuer le sujet :

si j’écris la requête dans un fichier distinct que j’appelle comme ça :

#SET{sqlMembres, "[(#INCLURE{fond=gaut.sql})]"}
#GET{sqlMembres}
<BOUCLE_membres(DATA){source sql,#GET{sqlMembres}|replace{\n}}>

rien n’est retourné par le INCLURE.

J’ai bien mis un #FILTRE{trim} à la fin de mon gaut.sql.html
Y a-t-il quelque chose à rajouter ?

Merci

Là c’est quand même tordre SPIP dans tous les sens.
Le plus simple serait un filtre (une fonction PHP perso).

Je partage aussi l’avis de Nicod_

Mais de toute façon, si \n n’est pas accepté lorsque la requête est fabriquée dans le squelette lui même, peu importe la manière de le fabriquer, et il n’y a pas de raison que ça soit mieux accepté lorsque c’est fabriqué par une inclusion.
Donc dans ton fichier inclu, #FILTRE{trim} ne suffit pas puisque c’est le \n en milieu de chaine qu’il faut retirer.

Ah et sinon il y a le critère where peut être plus sympa que la boucle DATA sql.

<BOUCLE_x(matable){where #GET{where}}>

Bonjour,

Meilleurs voeux de production de services SPIPiens pour la nouvelle année.

En fait, cette deuxième question n’est pas pour le problème de gestion du \n (que j’ai résolu par le replace) , mais :

  • d’une part pour rédiger le plus proprement possible une requête, sans les guillemets et autres syntaxes de commandes hors SQL,
  • et ensuite pourquoi pas faire de la requête un squelette indépendant qui pourrait recevoir des paramètres.

Merci

Ah c’est intéressant, et le #GET{where} peut intégrer les LEFT OUTER JOIN … ON … et ORDER BY, et rapatrie les champs joints ?

Je n’avais pas l’impression de tordre plus que lorsque l’on inclut des squelettes CSS paramétrés par l’environnement.

Alors ce problème est un banal problème SPIP indépendant de la thématique sql.

Tu le précises pas donc au cas où, pour #INCLURE{fond=gaut.sql} , le squelette doit être gaut.sql.html :slight_smile:

Bonsoir,

En fait le inclure renvoyait bien le bon contenu, mais c’est l’affection #SET qui ne fonctionnait pas, le simple #GET renvoyant une chaîne comme « %##3@ »…
Il ne faut pas mettre de guillemets dans l’argument de #SET :

Donc :

[(#SET{sqlMembres, [(#INCLURE{fond=gaut.sql})]})]
#GET{sqlMembres}
<BOUCLE_membres(DATA){source sql,#GET{sqlMembres}|replace{\n}}>

est OK.
Merci pour votre suivi.