[PHP] Problème add-on dans viewforum phpbb !

Résolu/Fermé
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014 - 26 déc. 2007 à 11:18
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014 - 27 déc. 2007 à 20:41
Bonjour,

J'explique :

J'ai un MOD (le MOD "Thank You") qui fonctionne très bien : quand un membre juge, dans un des sujets de mon forum, que celui-ci lui plait, il peut en remercier l'auteur via un bouton placé en haut du topic.
A ce moment, dans la BD, la modification de la table "Thanks" s'opère ainsi : il y est indiqué le topic_id et le user_id ! Jusque là, tout est logique !
Mon but est d'apporter un petit plus à ce MOD : je voudrais que, quand on voit tous les sujets (topics) dans viewforum, les topics qui ont fait l'objet de remerciements disposent d'un petit coeur à côté de leur titre ! Il me faut donc placer une requête dans viewforum :
ainsi, j'ai trouvé un endroit où il y a déjà une boucle présente, reprenant tous les topics d'une catégorie (d'un forum).

lignes 491-495 de mon viewforum :
for($i = 0; $i < $total_topics; $i++)
{
$topic_id = $topic_rowset[$i]['topic_id'];

$topic_title = ( count($orig_word) ) ? preg_replace($orig_word, $replacement_word, $topic_rowset[$i]['topic_title']) : $topic_rowset[$i]['topic_title'];


C'est donc ici que je place mon add-on :

// Thanks viewforum pottepei début
// Ma requête ci-dessous consiste à ne détecter que les topic_id qui ont fait l'objet d'un remerciement

$result = mysql_query("SELECT topic_id
FROM " . THANKS_TABLE . "
WHERE topic_id > 0");


// à ce stade-ci, si je fais un echo $topic_id, j'ai les topic_id de tous les topics! Pour n'avoir que ceux qui ont été remerciés, je dois créer une variable ($gag['i'] qui, elle, ne reprendra que les topic_id concernés. Mais voilà, si je ne fais pas un 'while', je me retrouve avec un ($gag['i'] qui ne prend que le tout premier de mes enregistrements.

while($row = mysql_fetch_row($result)){
$gag['i'] = intval($row[0]);
}


// ici le $gag['i'] donne les bons topic_id concernés, mais à la ligne qui suit, ce sont les $topic_id qui restent tjrs à la même valeur !!!
Mon but est donc de séparer les topic_id concernés et de leur donner une image via la variable $folder_thanks_viewforum['topic_id']
Dans le cas contraire, cette variable est vide !


if ($gag['i'] = $topic_id)
{
$folder_thanks_viewforum['topic_id'] = '<img src="' . $images['folder_thanks_viewforum'] . '" alt="' . $lang['thanks_viewforum'] . '" title="' . $lang['thanks_viewforum'] . '" border="0" />';
}
else
{
$folder_thanks_viewforum['topic_id'] = '';
}

// en faisant un echo du $folder_thanks_viewforum['topic_id'], je constate qu'hélas, il n'a pas séparé les topics concernés, et me met les petits coeurs à tous les topics !!!

//echo $folder_thanks_viewforum['topic_id'];
// Thanks viewforum pottepei fin

N'étant pas du tout un Pro du PHP, j'essaie tous les jours d'apprendre, et, surtout de comprendre, si des erreurs ont commises, le pourquoi de celles-ci. Merci donc aux spécialistes qui pourraient me dépanner !
A voir également:

11 réponses

Bonjour

Je n'ai pas compris grand chose à la logique de ton traitement, surtout parce qu'on ne sait pas où est la fin de la boucle.

Il faudrait aussi que tu dises ce que signifient exactement les champs user_id (utilisé où ?) et topic_id de ta table THANKS

Il y a des points qui sont visiblement des erreurs :
$gag["i"] je suppose que tu voulais mettre $gag[$i]

if ($gag['i'] = $topic_id) : if ($gag['i'] == $topic_id). Tu connais la différence entre = et == en PHP (comme en C, java, javascript aussi, d'ailleurs)
0
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014
26 déc. 2007 à 14:49
Merci de t'intéresser à mon (gros) pb !

Donc, comme je l'ai écrit, à chaque fois que quelqu'un remercie un topic, le topic_id du topic et le user_id de celui qui remercie sont placés dans la table "Thanks" !

Pour mon pb, je n'ai pas besoin d'aller rechercher le user_id, car il ne me servira pas !

Pour la boucle, si tu veux, je pourrais mettre la totalité, mais cela risque d'être long, et, ici, dans ce forum, on ne peut mettre de balises [CODE] comme dans le BBCode !

Maintenant $gag[$i] signale erreur de syntaxe : est-ce le phpbb qui veut cela, je l'ignore... et il doit être remplacé par $gag['i'], donc ' i ' et non " i " !

Oui, j'aurais pu mettre == au lieu de =, mais cela ne change rien au pb ! Si je ne me trompe = signifie égal, et == signifie strictement égal !

Merci de ton aide,
0
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014
26 déc. 2007 à 18:57
Voilà, j'ai refait le script, en dehors de toute boucle, totalement indépendant :

// Thanks viewforum ziever
for($i = 0; $i < $total_topics; $i++)
{
$topic_id = $topic_rowset[$i]['topic_id'];
$result = mysql_query("SELECT topic_id
FROM " . THANKS_TABLE . "
WHERE topic_id > 0");
while($row = mysql_fetch_row($result))
{
$gag[$i] = intval($row[0]);
if ($gag[$i] == $topic_id)
{
$folder_thanks_viewforum['topic_id'] = '<img src="' . $images['folder_thanks_viewforum'] . '" alt="' . $lang['thanks_viewforum'] . '" title="' . $lang['thanks_viewforum'] . '" border="0" />';
}
else
{
$folder_thanks_viewforum['topic_id'] = '';
}
echo $folder_thanks_viewforum['topic_id'];
}
}
// Thanks viewforum ziever


Ainsi, cela fonctionne, mais dès que je sors du "while", je reviens avec juste la première valeur de ma base de données, et si, dans le while, je mets une variable, style $probleme = $folder_thanks_viewforum['topic_id'], dès que je sors du while, tout en restant dans la boucle, le $probleme n'affiche rien !

Merci d'avance,
0
Bonjour

Oui, j'aurais pu mettre == au lieu de =, mais cela ne change rien au pb ! Si je ne me trompe = signifie égal, et == signifie strictement égal !
Attention, = ne signifie pas égal, == ne signifie pas strictement égal (d'ailleurs c'est quoi la différence entre égal et strictement égal ?)
= signifie : caculer la valeur de ce qui est à droite et mettre le résultat dans la variable dont le nom est à gauche
== sert à tester si deux expressions sont égales, éventuellement en adaptant les types
=== sert à tester si deux expressions sont égales et de même type
Donc, aucun rapport entre = et ==

Pour en revenir à ce que fait ton script, il y a plusieurs choses que je ne comprends pas.

Tu fais une boucle "for" qui semble servir à parcourir tous les topics d' un tableau $topic_rowset (sorti on ne sait d'où, mais peu importe). Dans cette boucle tu fais une requête qui extrait tous les topic_id >0 , indépendamment du $topic_id courant. Autrement dit, s'il y a 100 topics dans ton $topic_rowset, tu referas 100 fois exactement la même requête. Je ne crois pas que ce soit ce que tu voulais faire, ou alors explique moi à quoi ça sert. Tu ne voulais pas plutôt faire ( mais là j'imagine ) :
"SELECT topic_id FROM " . THANKS_TABLE . " WHERE topic_id =$topic_id");

D'autre part, dans cette boucle dont l'indice est $i, tu fais une boucle while. Tant qu'on tourne à l'intérieur de cette boucle while, $i ne change pas puisqu'on ne repasse pas par le for. donc la variable $gag[$i] est toujours la même. Donc elle est écrasée d'une fois sur l'autre quand tu boucles à l'intérieur du while. Mais comme elle ne semble servir nulle part ailleurs, tu aurais sans doute pu l'appeler $gag tout simplement.

Enfin tu utilises $folder_thanks_viewforum['topic_id'] très probablement à la place de $folder_thanks_viewforum[$topic_id]. Es-tu conscient de la différence très importante qu'il y a entre les deux ? Et pas de réponse "j'ai essayé, ça marche comme ça" ou "ça ne change rien".
'topic_id' est une chaine constante et $folder_thanks_viewforum['topic_id'] c'est toujours $folder_thanks_viewforum['topic_id']
$topic_id est une variable et selon qu'elle vaut 1,2 ou "cheval",$folder_thanks_viewforum[$topic_id] représente $folder_thanks_viewforum[1], $folder_thanks_viewforum[2] ou $folder_thanks_viewforum"'cheval"]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014
26 déc. 2007 à 23:20
Bonsoir,

Sorry, mais je ne suis pas un expert ! J'essaie juste de créer un Add-On à ce MOD. J'ai eu beau - entretemps parcourir tous les forums via Gopgle - je n'ai pas trouvé réponse à ce while et ses conséquences...

Tu me dis : "Tu fais une boucle "for" qui semble servir à parcourir tous les topics d' un tableau $topic_rowset (sorti on ne sait d'où, mais peu importe)"

Oui, elle est nécessaire, car elle me permet de retrouver tous les $topic_id avant d'effectuer ma requête !

Tu me dis : "Dans cette boucle tu fais une requête qui extrait tous les topic_id >0 "

Oui, pour ne tirer que, de la table "Thanks", les enregistrements du champ "topic_id", ceux ayant fait l'objet d'un remerciement.

Tu me dis = "Tu ne voulais pas plutôt faire ( mais là j'imagine ) :
"SELECT topic_id FROM " . THANKS_TABLE . " WHERE topic_id =$topic_id"); "


Oui, bien sûr, c'est le principe ! J'ai utilisé le >0 car je n'y parvenais pas !

Tu me dis : Tant qu'on tourne à l'intérieur de cette boucle while, $i ne change pas puisqu'on ne repasse pas par le for. donc la variable $gag[$i] est toujours la même. Donc elle est écrasée d'une fois sur l'autre quand tu boucles à l'intérieur du while. Mais comme elle ne semble servir nulle part ailleurs, tu aurais sans doute pu l'appeler $gag tout simplement.

Effectivement, tu cernes bien mon pb !

Tu me dis : Enfin tu utilises $folder_thanks_viewforum['topic_id'] très probablement à la place de $folder_thanks_viewforum[$topic_id]. Es-tu conscient de la différence très importante qu'il y a entre les deux ? Et pas de réponse "j'ai essayé, ça marche comme ça" ou "ça ne change rien".
'topic_id' est une chaine constante et $folder_thanks_viewforum['topic_id'] c'est toujours $folder_thanks_viewforum['topic_id']
$topic_id est une variable et selon qu'elle vaut 1,2 ou "cheval",$folder_thanks_viewforum[$topic_id] représente $folder_thanks_viewforum[1], $folder_thanks_viewforum[2] ou $folder_thanks_viewforum"'cheval"]


J'en prends bonne note, sorry ! Perso, sur tous les forums que j'ai analisés jusque maintenant, je n'avais jamais vu une telle explication... et vraiment merci !

Aurais-tu une soluce pour mon script si tu as bien cerné ce à quoi je veux arriver ? Car après, dans le viewforum.php, je devrai repartir avec une instruction du style :

$template->assign_block_vars('topicrow', array('TOPIC_THANKS_VIEWFORUM' => $folder_thanks_viewforum));

afin de pouvoir l'inclure dans mon template...

Merci,
0
Bonsoir
Sorry, mais je ne suis pas un expert
Ne t'excuse pas, il n'y a pas d'offense !

Oui, elle est nécessaire Je n'en ai jamais douté !

Maintenant, je continue à ne pas comprendre :
Donc, comme je l'ai écrit, à chaque fois que quelqu'un remercie un topic, le topic_id du topic et le user_id de celui qui remercie sont placés dans la table "Thanks" ! ce qui veut dire que dans la table thanks il n'y a que des topic_id ayant fait l'objet de remerciements, non ?
Oui, pour ne tirer que, de la table "Thanks", les enregistrements du champ "topic_id", ceux ayant fait l'objet d'un remerciement. ce qui veut dire qu'il peut y avoir des topic_id qui n'ont fait l'objet d'aucun remerciement
Je fais deux interprétations contradictoires de ce que tu écris, peux-tu me dire laquelle des deux est la bonne ?
0
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014
27 déc. 2007 à 10:22
Effectivement, tu as raison ! Dans "thanks", il n'y a que les topic_id des remerciements ! (point 1)

Mais je suis quand même obligé d'utiliser la boucle pour qu'il puisse comparer le résultat avec tous les $topic_id, et je suis aussi obligé d'utiliser while pour qu'il cherche plus loin que le tout premier enregistrement contenu dans le ($row[0]) !

Et c'est là que je patauge...
0
Bonjour

Je pense que je commence à comprendre ce que tu veux faire. Alors je vais essayer de te le faire dire clairement.

1- Que cherches-tu à faire avec ta requête ? à extraire tous les topics ayant fait l'objet d'un remerciement, ou un seul ? Et si c'est un seul, lequel ?

2- Que cherches-tu à faire avec ta boucle while ? A comparer chaque topic_id ayant fait l'objet d'un remerciement avec le topic_id énuméré dans la boucle for, pour savoir s'il faut l'afficher ou non avec une image ?
0
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014
27 déc. 2007 à 17:32
Une fois de plus, je te remercie pour ta patience !

1- Que cherches-tu à faire avec ta requête ? à extraire tous les topics ayant fait l'objet d'un remerciement, ou un seul ? Et si c'est un seul, lequel ?

Je cherche, lorqu'on voit dans mon forums tous les topics (viewforum) d'une catégorie, que ceux qui ont eu un remerciement (et donc uniquement ceux-là) aient une petite image (un coeur) à côté de leur titre ! Donc, je dois avoir une variable qui ne contient que les id de topics où il y a eu un remerciement. Chaque fois que ce sera le cas, (c'était dans le script plus haut) le fameux " $folder_thanks_viewforum['topic_id']" doit être l'image aussi non, il est vide.

2- Que cherches-tu à faire avec ta boucle while ? A comparer chaque topic_id ayant fait l'objet d'un remerciement avec le topic_id énuméré dans la boucle for, pour savoir s'il faut l'afficher ou non avec une image ?

Ceci reprend un peu ce que je viens d'écrire : pour arriver à avoir ce recensement des seuls topics remerciés, je suis obligé d'utiliser le "$row[0])" : or, dans la boucle, il ne donne toujours que le premier enregistrement des topic_id de la table Thanks : j'ai lu à ce moment que, pour pouvoir avoir tous les enregistrements de ces fameux topic_id de la table Thanks, j'étais obligé d'utiliser la fonction while : quand je l'utilise, très bien, j'ai bien tous les topic_id, mais dès que je sors de while, je reviens à nouveau au seul premier enregistrement !

J'avais déjà indiqué le but de mon script dans les toutes premières lignes du 1er post : peut-être ne me suis-je pas bien fait comprendre ?
0
Ah la la les problèmes de communication !
J'arrête de jouer le prof, je n'ai pas les talents nécessaires. Voici la solution, peut-être à quelques fautes de frappe près. N'hésite pas à poser des question

for($i = 0; $i < $total_topics; $i++) { 
  $topic_id = $topic_rowset[$i]['topic_id']; 
// on recherche si ce topic déjà remercié
  $result = mysql_query("SELECT topic_id FROM " . THANKS_TABLE . " WHERE topic_id = '$topic_id'"); 
  if ($row = mysql_fetch_row($result))   {  // oui
    $folder_thanks_viewforum['topic_id'] = '<img src="' . $images['folder_thanks_viewforum'] . '" alt="' . $lang['thanks_viewforum'] . '" title="' . $lang['thanks_viewforum'] . '" border="0" />'; 
  } else { // non, topic pas déjà remerci
    $folder_thanks_viewforum['topic_id'] = ''; 
  } 
  echo $folder_thanks_viewforum['topic_id']; 
} 
0
pottepei Messages postés 19 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 2 février 2014
27 déc. 2007 à 20:41
Alors là, je reçois une bonne leçon !!! Je suis honteux... J'ai vraiment été chercher de midi à quatorze heures.....

C'était effectivement si simple ! Pourquoi faire compliquer quand on peut effectivement remplacer toute la procédure du while par un simple if ($row = mysql_fetch_row($result)) !!!

Evidemment, tout fonctionne nickel maintenant !!!

Voilà 2 fois que vous me sauvez et quelles leçons vous m'avez données : vous avez très bien fait de me laisser chercher, car c'est comme cela que l'on comprend ses erreurs et qu'on les retient dans son "computer" !!!

Chapeau et tout grand merci,

J'ai encore pas mal à apprendre dans ce domaine, et, sans jeu de mots, vous êtes vraiment un "Père" pour moi !!!

Merci et bonne soirée,
Gégé

PS : La solution est dans le post précédent !
0