Carnet Wiki

Version 2 — Août 2018 YannX

En SPIP 3.1.6 (sur un WAMP/W7) j’ai rencontré quelques difficultés pour traiter la boucle suivante :

<blockquote class="spip">
<B_art_aut>
<H2>ARTICLES AUTEURS</h2>
<BOUCLE_art_aut(spip_articles spip_auteurs){id_auteur>0}>
#ID_ARTICLE : #TITRE => #ID_AUTEUR = #LOGIN : #NOM<br />
</BOUCLE_art_aut>
</blockquote>

Les difficultés portent sur la « bonne » identification de la table et de la jointure, en fonction de la casse !
-  les jointures ne sont forcées par SPIP que SI les noms de tables sont en minuscules (qu’il s’agisse du nom physique/avec préfixe/ ou logique/sans préfixe/

17:39:38 - YannX : Bonsoir.... suite a la relecture de https://contrib.spip.net/MOTS-DOCUMENTS-Lien-et-Jointure et http://marcimat.magraine.net/SPIP-3-Documents-Mots je croyais que (en SPIP 3.1 6)
17:40:11 - YannX : 0}> suffirait pour afficher correctement
17:40:11 - YannX : #ID_ARTICLE : #TITRE => #ID_AUTEUR = #LOGIN : #NOM
17:41:22 - YannX : que nenni ??? il faut que je précise 0}>
17:41:22 - YannX : sinon SPIP ne me fait pas la jointure avec la table d’auteurs ?
17:41:37 - YannX : une explication ? où fais-je erreur ? merci !
17:44:33 - YannX : (je suis obligé d’indiquer le nom « PHYSIQUE » -/avec préfixe/- de la seconde table !
17:47:01 - YannX : (vous me ferez remarquer que les exemples de https://programmer.spip.net/Forcer-des-jointures utilisent les tables suivantes en minuscule !! ? )
17:47:48 - YannX : et que dans ce CAS la jointure est bien extraite !!
17:48:31 - YannX : mais cela me parait générer une incohérence dans l’écriture de la cible FROM du SELECT ??
18:02:12 - YannX : (piste potentielle : il existait également un jeu de tables ’spip_’ dans la meme base MySQL, mais toutes comportent bien l’auteur n°1 !!)
18:06:18 - cy_altern : YannX : « 0}> suffirait pour afficher correctement »
18:06:18 - cy_altern : il me semble que cette syntaxe ne permet PAS la jointure... cf https://www.spip.net/fr_article4254.html
18:07:10 - cy_altern : tu ne peux pas avoir les 2 noms de tables en MAJUSCULES si tu veux la jointure
18:07:57 - YannX : bonsoir cy_altern (merci de me donner ton eclairage)
18:09:12 - YannX : effectivement, il semble qu’il faille donner les noms de tables en minuscules désormais !
18:09:25 - cy_altern : ça date déja d’il y a un moment ça
18:09:34 - cy_altern : (à vu de nez je dirais SPIP 3.0
18:10:15 - YannX : c’est vrai que j’ai tres rarement l’occasion de faire des jointures, mais je ne me souviens pas d’avoir jamais vu une remarque expliquant ce point
18:10:18 - cy_altern : classiquement tu donne le premier en majuscules et les suivants en minuscules
18:10:55 - YannX : ! 17:48:31 - YannX : mais cela me parait générer une incohérence dans l’écriture de la cible FROM du SELECT ??
18:11:37 - YannX : et j’etais en train d’imaginer quand on a une table auteurs a coté de la table spip_auteurs, comment peut-on faire ??
18:12:49 - cy_altern : à priori (auteurs spip_auteurs) devrait faire l’affaire
18:13:00 - cy_altern : mais là on est dans un cas bien limite
18:13:15 - cy_altern : à tester
18:13:59 - cy_altern : et ça reste quand même rare d’utiliser des tables non-préfixées en mélange avec des tables préfixées dans une base commune
18:18:03 - YannX : Euh... pas si sûr ! Quand on utilise plusieurs sites en mutualisé dans la meme base
18:18:16 - YannX : C’est ce que je viens de faire pour tester :
18:18:41 - cy_altern : plusieurs sites en mutualisés dans la même base entraîne que tu as *forcément* un préfixe différent pour chaque spip
18:18:58 - YannX : spip_ alr_ et prof_ dans la meme base ! sur un SPIP connecté sur prof_ !
18:19:18 - cy_altern : alors aucun problème : tu préfixe les noms de table
18:19:30 - cy_altern : (spip_auteurs prof_auteurs)
18:19:46 - cy_altern : ou (AUTEURS spip_auteurs)
18:20:01 - cy_altern : si tu es sur le spip profs_
18:20:10 - YannX : 0}> => OK_bis
18:20:32 - YannX : 0}> OK
18:21:19 - YannX : 0}> OK
18:22:18 - YannX : 0}> KO ???
18:23:08 - YannX : 0}> KO ???
18:23:45 - YannX : (Bon, d’accord je suis avec WAMP/W7 : PHP gérerait mal la CASSE des noms de fichiers ?? )
18:24:00 - YannX : Mais cela ne marche pas bien !!!
18:24:57 - cy_altern : (spip_articles spip_auteurs)
18:26:00 - YannX : celui-la a été incapable de me trouver :
18:26:01 - cy_altern : tu devrais faire un ?var_mode=debug pour voir ce qu’il se passe du côté des requêtes
18:26:02 - YannX : Erreur SQL 1054
18:26:02 - YannX : Champ ’L3.login’ inconnu dans field list
18:26:02 - YannX : SELECT articles.id_article, articles.titre, L1.id_auteur, L3.login, L3.nom FROM spip_articles AS articles INNER JOIN spip_auteurs_liens AS L1 ON ( L1.id_objet = articles.id_article AND L1.objet=’article’) WHERE (articles.statut = ’publie’) AND (L1.id_auteur > 0) GROUP BY articles.id_article,spip_articles.id_articl
18:26:33 - cy_altern : si tu regardes cette requête
18:26:49 - cy_altern : le code MySQL ne préfixe pas les tables
18:27:10 - cy_altern : SELECT articles.id_article, articles.titre, <= ça ne peut pas fonctionner
18:27:16 - cy_altern : il manque le préfixe
18:27:32 - cy_altern : tu dois tester avec le préfixe explicite dans le nom de la table
18:27:44 - cy_altern : *surtout* si tu as plusieurs SPIP dans la même base
18:28:50 - YannX : He bien non ! le code en erreur ci-dessu correspond à
18:28:50 - YannX : 0}>
18:29:05 - YannX : Et j’ai bien un jeu de tables spip_ !!!
18:29:31 - cy_altern : ah oui, je n’avais pas vu le spip_articles AS articles
18:29:39 - Minkar [ Minkar@190-37-92-39.dyn.dsl.cantv.net] est entré dans le canal.
18:29:43 - Minkar a quitté le canal (Quit : Killed (Unit193 (Spam is not permitted on freenode.))).
18:29:45 - YannX : étant connecté au second jeu de tables ’prof_ ...
18:30:37 - YannX : C’est particulièrement vicieux !
18:30:37 - YannX : Et les erreurs d’incohérence de syntaxe a ce niveau risquent de dégouter
18:30:37 - YannX : d’utiliser SPIP comme requetteur puissant automatique !
18:30:43 - cy_altern : le truc il est que là tu utilise la liaison implicite spip_articles <-> spip_auteurs
18:30:57 - cy_altern : qui elle passe par spip_auteurs_liens
18:31:02 - YannX : Il serait utile qu’un test soit fait de meme sur un serveur Linux
18:31:32 - YannX : Voila la boucle complete :
18:31:32 - YannX :
18:31:32 - YannX :

ARTICLES AUTEURS

18:31:32 - YannX : 0}>
18:31:32 - YannX : #ID_ARTICLE : #TITRE => #ID_AUTEUR = #LOGIN : #NOM
18:31:32 - YannX :
18:32:04 - YannX : J’utilise toujours une liaison implicite AUTEURS_LIENS

18:37:36 - cy_altern : mais non !
18:37:48 - cy_altern : #ID_ARTICLE : #TITRE => #ID_AUTEUR = #LOGIN : #NOM
18:38:27 - cy_altern : => il me semble que tu ne peux appeler de noms de champs en #BALISE que sur la *première* table de ton appel
18:39:34 - cy_altern : là tu appelle #ID_ARTICLE et #TITRE qui viennent de spip_articles et #LOGIN et #NOM qui viennent de spip_auteurs
18:42:18 - cy_altern : 0}>
18:42:19 - cy_altern : #LOGIN : #NOM / #ID_AUTEUR
18:42:19 - cy_altern :
18:42:19 - cy_altern : ou
18:42:19 - cy_altern : 0}>
18:42:19 - cy_altern : #ID_ARTICLE : #TITRE
18:42:19 - cy_altern :
18:42:38 - cy_altern : mais pas un mix des deux je pense
18:43:01 - YannX : non : https://www.spip.net/fr_article4254.html
18:43:18 - YannX : à partir de cette boucle, donc, nous avons alors accès à tous les champs de spip_documents_liens et tous ceux de spip_rubriques :
18:43:18 - YannX : #ID_DOCUMENT
18:43:18 - YannX : #ID_OBJET
18:43:18 - YannX : #OBJET
18:43:18 - YannX : #VU
18:43:18 - YannX : #ID_RUBRIQUE
18:43:18 - YannX : #ID_PARENT
18:43:18 - YannX : #TITRE
18:43:18 - YannX : #DESCRIPTIF
18:43:18 - YannX : #TEXTE
18:43:18 - YannX : #ID_SECTEUR
18:43:18 - YannX : ...
18:43:20 - YannX : <BOUCLE_d(spip_documents_liens rubriques)...