requête bdd - parent de la rubrique d'un article

Salut la compagnie,

Il me faut faire une requête à la bdd, mais je n'arrive pas à que ça
marche. En fait l'idée est de recuperer la id_parent de la rubrique où
se trouve l'article en cours. Comme il n'y a pas de champ id_parent
dans la table articles, j'ai imaginé cette soluce, mais je suis
preneur pour d'autres. Voici ce que j'essaye.

A l'interieur de mon squelette articles.html je mets:

<?php $rub=#ID_RUBRIQUE;
$query="SELECT id_parent FROM spip_rubriques WHERE id_rubrique='$rub'";
$par=spip_query_db($query); ?>

Si a cela j'ajoute un « echo $par » pour voir ce qui se passe, je
n'obtient que « Resource id #4 ». Alors, il me semble evident que ce
n'est pas comme ça que l'on fait une requête a la bdd, mais comment
donc ?

Je sais que c'est plutôt une question php/mysql que strictement Spip,
mais comme c'est une astuce pour resoudre une limitation que je trouve
en spip, je me permets de la poser ici. Merci d'avance pour vos
lumières.

Germán.

tu mets une boucle RUBRIQUES DANS ta boucle article et comme critère de selection tu mets id_rubrique.

<BOUCLE_article (ARTICLES) {id_article)>
<BOUCLE_rubrique (RUBRIQUES) {id_rubrique}>
<BOUCLE_parent (RUBRIQUES) {id_parent}>
#ID_RUBRIQUE
</BOUCLE_parent>
</BOUCLE_rubrique>
</BOUCLE_article>

L'idée est que l'article 'sait' dans quelle rubrique il est localisé, il fournit donc {id_rubrique}.
Et la rubrique 'sait' quel est son parent, elle fournit donc {id_parent}.

Olivier G.

German Guillot a écrit :

Salut la compagnie,

Il me faut faire une requête à la bdd, mais je n'arrive pas à que ça
marche. En fait l'idée est de recuperer la id_parent de la rubrique où
se trouve l'article en cours. Comme il n'y a pas de champ id_parent
dans la table articles, j'ai imaginé cette soluce, mais je suis
preneur pour d'autres. Voici ce que j'essaye.

A l'interieur de mon squelette articles.html je mets:

<?php $rub=#ID_RUBRIQUE;
$query="SELECT id_parent FROM spip_rubriques WHERE id_rubrique='$rub'";
$par=spip_query_db($query); ?>

Si a cela j'ajoute un « echo $par » pour voir ce qui se passe, je
n'obtient que « Resource id #4 ». Alors, il me semble evident que ce
n'est pas comme ça que l'on fait une requête a la bdd, mais comment
donc ?

Je sais que c'est plutôt une question php/mysql que strictement Spip,
mais comme c'est une astuce pour resoudre une limitation que je trouve
en spip, je me permets de la poser ici. Merci d'avance pour vos
lumières.

Germán.
_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.spip.net/
irc://irc.freenode.net/spip

On Mon, 07 Jun 2004 11:26:18 +0200, Olivier GENDRIN
<olivier.gendrin@free.fr> wrote:

<BOUCLE_article (ARTICLES) {id_article)>
<BOUCLE_rubrique (RUBRIQUES) {id_rubrique}>
<BOUCLE_parent (RUBRIQUES) {id_parent}>
#ID_RUBRIQUE
</BOUCLE_parent>
</BOUCLE_rubrique>
</BOUCLE_article>

Merci pour cette solution, qui semble plus évident que d'aller
chercher en dehors de la syntaxe Spip. Parfois je me complique trop la
vie. Malheureusement, j'essaye et je trouve qu'elle ne marche pas.
#ID_RUBRIQUE retourne bien un nombre de rubrique, mais un bizarre. En
fait, j'obtient une « cousine » de la rubrique où se trouve mon
article (rubX), c'est à dire, une rubrique qui depend d'une «soeur »
du parent de rubX. Compliqué, je sais, mais vous l'avez compris -
c'est n'importe quoi. Alors j'essaye avec {id_enfant} comme critère
dans la boucle _parent (ce qui me semble l'adequat selon la
description des critères dans la doc), mais comme ça #ID_RUBRIQUE ne
retourne rien (alors que oui, mon article est à profondeur suffisant
pour avoir tout un tas de rubriques dans son hierarchie).

Bref, je n'ai toujours pas de solution. En revenant sur ma stratégie
de requerir la bdd, s'il y en a qui savent comment faire une requête
pour obtenir une donnée quelconque, j'en serais reconnaissant. Puis
qu'on et là, j'imagine que cette solution est plus lourde pour la bdd
car elle ne profite pas du système de caché - est-ce comme ça ? Et
encore une question - j'imagine qu'il est possible de faire la requête
en MySQL pûr, càd, en utilisant une fonctionne gènerique
(mysql_query() ?), mais je pense qu'il y a peut être des avantages à
utiliser une fonctionne définie dans Spip (spip_query_db() ? Je suis
sur 1.7.2). A quelqu'un(e) un avis sur ça ?

Merci encore,
Germán.

On Mon, 7 Jun 2004 16:23:36 +0200, yorghos.remvikos
<yremvikos@wanadoo.fr> wrote:

Bonjour,
Moi je dirais que ta première solution était la bonne. La syntaxe de la
requête est bonne. Je ferais un echo $rub puis deux lignes de code pour
récupérer la bonne valeur :
$row=spip_fetc_array($par);
$id_parent=$row[id_parent];

Ça marche comme il faut. Merci beaucoup!

//////////////////////////////////////////////////////////////////////////////////////
Pour ceux qui seraient interesés, voici le code qui fonctionne:

<?php $rub=#ID_RUBRIQUE;
$query="SELECT id_parent FROM spip_rubriques WHERE id_rubrique='$rub'";
$result=spip_query_db($query);
$row=spip_fetch_array($result);
$par=$row[id_parent];
echo "parent=$par, rubrique=$rub";
?>
/////////////////////////////////////////////////////////////////////////////////////

Cela me permet maintenant de me compliquer la vie avec des conditions
php pour afficher mon menu de navigation. Sans doute qu'il y a des
solutions plus simples, mais où est donc l'amusement ? :wink:

Un grand merci. À plus,
Germán.

On Mon, 7 Jun 2004 16:50:14 +0200, German Guillot <guillot@gmail.com> wrote:

//////////////////////////////////////////////////////////////////////////////////////
Pour ceux qui seraient interesés, voici le code qui fonctionne:

<?php $rub=#ID_RUBRIQUE;
$query="SELECT id_parent FROM spip_rubriques WHERE id_rubrique='$rub'";
$result=spip_query_db($query);
$row=spip_fetch_array($result);
$par=$row[id_parent];
echo "parent=$par, rubrique=$rub";
?>
/////////////////////////////////////////////////////////////////////////////////////

Ach ! Pas de bonheur. Cela marchait très bien au debut, mais dès que
je fait un « refresh » cela commence a ne marcher plus. D'abord pour
certains articles, maintenant pour touts. J'ai vidé le caché, rien.
J'ai essayé de mettre la requête dans article.php3 au lieu de .html,
pareil. Voici l'erreur:

Fatal error: Call to undefined function: spip_query_db() in
/var/www/html/spip/CACHE/f/spip-article-27.1c4d85 on line 68

La ligne 68 contient bien la fonctionne spip_query_db(), mais le
message n'est evidantement pas vrai, puisque cette fonctionne est
belle et bien définie dans ecrire/inc_db_mysql.php3, et evidentement
Spip s'en sert couramment. Que se passe-t-il ? Est-ce que cela a
quelque chose à voir avec le fait que inc_db_mysql.php3 est un fichier
qui « ne sera execute qu'une fois » ? Mais non, ça serait absurde,
puisque Spip fait des requêtes à mysql aussi souvent que nécessaire.

Moi comprends pas. Moi y en a perdu. Au secours !

Germán.

Si la requête se trouve à l'intérieur d'une boucle :
  if (spip_num_rows($result) != 0) {
    while ($row=spip_fetch_array($result)){
    $texte=$row[texte];
    $auteur=$row[auteur];
    $statut=$row[statut];
    $parent=$row[id_parent];
    }
  }
a adapter aux besoins bien sûr.
@+
Le 7 juin 04, à 18:14, German Guillot a écrit :

On Mon, 7 Jun 2004 16:50:14 +0200, German Guillot <guillot@gmail.com> wrote:

//////////////////////////////////////////////////////////////////////////////////////
Pour ceux qui seraient interesés, voici le code qui fonctionne:

<?php $rub=#ID_RUBRIQUE;
$query="SELECT id_parent FROM spip_rubriques WHERE id_rubrique='$rub'";
$result=spip_query_db($query);
$row=spip_fetch_array($result);
$par=$row[id_parent];
echo "parent=$par, rubrique=$rub";
?>
/////////////////////////////////////////////////////////////////////////////////////

Ach ! Pas de bonheur. Cela marchait très bien au debut, mais dès que
je fait un « refresh » cela commence a ne marcher plus. D'abord pour
certains articles, maintenant pour touts. J'ai vidé le caché, rien.
J'ai essayé de mettre la requête dans article.php3 au lieu de .html,
pareil. Voici l'erreur:

Fatal error: Call to undefined function: spip_query_db() in
/var/www/html/spip/CACHE/f/spip-article-27.1c4d85 on line 68

La ligne 68 contient bien la fonctionne spip_query_db(), mais le
message n'est evidantement pas vrai, puisque cette fonctionne est
belle et bien définie dans ecrire/inc_db_mysql.php3, et evidentement
Spip s'en sert couramment. Que se passe-t-il ? Est-ce que cela a
quelque chose à voir avec le fait que inc_db_mysql.php3 est un fichier
qui « ne sera execute qu'une fois » ? Mais non, ça serait absurde,
puisque Spip fait des requêtes à mysql aussi souvent que nécessaire.

Moi comprends pas. Moi y en a perdu. Au secours !

Germán.
_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.spip.net/
irc://irc.freenode.net/spip

Yorghos Remvikos
4bis, chemin du Val des Vignes
95450 AVERNES
tél : 01 30 39 23 88
por : 06 07 60 01 01

On Mon, 7 Jun 2004 18:47:02 +0200, yorghos.remvikos
<yremvikos@wanadoo.fr> wrote:

Si la requête se trouve à l'intérieur d'une boucle :
        if (spip_num_rows($result) != 0) {
                while ($row=spip_fetch_array($result)){
                $texte=$row[texte];
                $auteur=$row[auteur];
                $statut=$row[statut];
                $parent=$row[id_parent];
                }
        }
a adapter aux besoins bien sûr.

Merci Yorghos. La requête n'est pas à l'interieur de la boucle, mais
avant, pour récuperer les variables que j'utilise en suite pour fair
tourner une boucle suelement si certains conditions sont « true ». En
tout cas j'ai essayé ta nouvelle proposition, je vide le caché, et ça
marche. Mais ! Seulement la premier fois que je visite un article.

Je visite un article, ça marche. Je visite un autre, ça marche. Je
revisite le premier, « undefined function: spip_query_db() ». Je
visite un troisième article, ça marche. Etc. C'est à dire, tout
fonctionne comme prévu, mais seulement la première fois qu'on visite
un article. Les fois suivantes j'ai toujours cette erreur. Si je vide
le cache encore, le jeu recommence.

Il se peut que Spip ne tolère pas un requête MySQL dans le caché -
alors la première fois, lors du calcule du caché, la requête est
envoyée à la bdd. La seconde fois, à partir non pas du fichier
article.html mais du fichier caché, il n'y a pas de lecture des
fichiers qui definent les fonctionnes, donc on obtient un erreur type
« undefined function ». Pour tester ça, j'ai changé les fonctionnes
Spip par des fonctions MySQL, qui j'imaginait sont toujours définies,
puisque c'est externe à Spip.

Pas de bonheur non plus, mais je suis nouveau en bdd et il se peut que
je ne fasse ça comme il faut. En tout cas l'erreur est toujous
«undefined function », ce qui m'étonne un peu. Surement ce sont des
fonctions définis dans le serveur MySQL par défaut, non ? Comment ça
se fait que je soit toujours là ?

N'y a-t-il pas une façon de forcer Spip a reconnaitre ces fonctionnes,
peut être en les plaçant dans un fichier .php3 independent que l'on
inclu dans le squelette ? J'avois que je suis un peu dépassé, ça fait
des jours que je me prends la tête et je ne suis même pas
informaticien. J'apprends en cours de route, mais c'est à devenir
dingue !

Merde des ordinateurs, on était bien avec du parchemin ! :wink:

Bof. Excuse moi des exabruptes. Je vais faire un café et me reposer un
peu, et je revient à la breche après.

Salut,
Germán.

Les solutions les plus simples sont toujours les meilleurs. Ça
m'apprendra a chercher des trucs compliqués. Heh !

Dans article.html:

<?php $art=#ID_ARTICLE; ?>
<BOUCLE_cherche_parent(RUBRIQUES) {id_rubrique}>
<?php $rub=#ID_RUBRIQUE; $par=#ID_PARENT; ?>
</BOUCLE_cherche_parent>
<?php echo "article=$art, rubrique=$rub, parent=$par"; ?>

Et ça marche sur des roulettes. Merci à tous qui m'ont aidé, on
apprend toujours.

Je suis toujours interesé pour les requêtes à la bdd, néanmois.
Pourquoi ne marchent elles pas ? Si on veut faire ces requêtes (j'en
envisage, par example, un script qui prendra les articles de plus d'un
mois des diverses rubriques et les mettra dans une rubrique « archives
»), comment faire pour que ça ne donne pas des erreurs ? Est-ce
impossible à l'interieur d'un squelette ? Si quelqu'un les utilise
avec succès, j'aimerai bien savoir comment ils font.

Merci encore a tous.
Germán.