mettre une requete dans une boucle qui fonctionne

mettre une requete dans une boucle qui fonctionne - PHP - Programmation

Marsh Posté le 24-03-2009 à 11:19:38    

Voila j'ai une question un peu bizarre.
 
Voila le code PHP
 

Code :
  1. while ($cur_forum = $db->fetch_assoc($result))
  2. {
  3.     $moderators = '';
  4.  
  5.     if ($cur_forum['cid'] != $cur_category)    // A new category since last iteration?
  6.     {
  7.         if ($cur_category != 0)
  8.             echo "\t\t\t".'</tbody>'."\n\t\t\t".'</table>'."\n\t\t".'</div>'."\n\t".'</div>'."\n".'</div>'."\n\n";
  9.  
  10.         ++$cat_count;
  11.  
  12. ?>
  13. <div id="idx<?php echo $cat_count ?>" class="blocktable">
  14.     <h2><span><?php echo pun_htmlspecialchars($cur_forum['cat_name']) ?></span></h2>
  15.     <div class="box">
  16.         <div class="inbox">
  17.             <table cellspacing="0">
  18.             <thead>
  19.                 <tr>
  20.                     <th class="tcl" scope="col"><?php echo $lang_common['Forum'] ?></th>
  21.                     <th class="tc2" scope="col"><?php echo $lang_index['Topics'] ?></th>
  22.                     <th class="tc3" scope="col"><?php echo $lang_common['Posts'] ?></th>
  23.                     <th class="tcr" scope="col"><?php echo $lang_common['Last post'] ?></th>
  24.                 </tr>
  25.             </thead>
  26.             <tbody>
  27. <?php
  28.  
  29.         $cur_category = $cur_forum['cid'];
  30.     }
  31.  
  32.     $item_status = '';
  33.     $icon_text = $lang_common['Normal icon'];
  34.     $icon_type = 'icon';
  35.  
  36.     // Are there new posts?
  37.     if (!$pun_user['is_guest'] && $cur_forum['last_post'] > $pun_user['last_visit'])
  38.     {
  39.         $item_status = 'inew';
  40.         $icon_text = $lang_common['New icon'];
  41.         $icon_type = 'icon inew';
  42.     }
  43.  
  44.     // Is this a redirect forum?
  45.     if ($cur_forum['redirect_url'] != '')
  46.     {
  47.         $forum_field = '<h3><a href="'.pun_htmlspecialchars($cur_forum['redirect_url']).'" title="'.$lang_index['Link to'].' '.pun_htmlspecialchars($cur_forum['redirect_url']).'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a></h3>';
  48.         $num_topics = $num_posts = '&nbsp;';
  49.         $item_status = 'iredirect';
  50.         $icon_text = $lang_common['Redirect icon'];
  51.         $icon_type = 'icon';
  52.     }
  53.     else
  54.     {
  55.         $forum_field = '<h3><a href="viewforum.php?id='.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a></h3>';
  56.         $num_topics = $cur_forum['num_topics'];
  57.         $num_posts = $cur_forum['num_posts'];
  58.     }
  59.  
  60.     if ($cur_forum['forum_desc'] != '')
  61.         $forum_field .= "\n\t\t\t\t\t\t\t\t".$cur_forum['forum_desc'];
  62.  
  63.  
  64.     // If there is a last_post/last_poster.
  65.     if ($cur_forum['last_post'] != '')
  66.     {
  67.                
  68.                // modif alain
  69.  
  70.                $tout = $cur_forum['last_post_id'];
  71.  
  72.                $query_bibi= "SELECT *
  73.                              FROM Forum_topics
  74.                              WHERE last_post_id = ".$tout ;  
  75.                
  76. [#ff5500]// requete qui fait cesser la boucle while:[/#ff5500]
  77.                $result_bibi = mysql_query($query_bibi);
  78.                $val_bibi = mysql_fetch_array($result_bibi);
  79.  
  80.  
  81.                $last_post = '<a href="viewtopic.php?pid='.$cur_forum['last_post_id'].'#p'.$cur_forum['last_post_id'].'">'.format_time($cur_forum['last_post']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_forum['last_poster']).'</span>';
  82.  
  83.        }
  84.     else
  85.        {
  86.         $last_post = '&nbsp;';
  87.        }
  88.  
  89.     if ($cur_forum['moderators'] != '')
  90.     {
  91.         $mods_array = unserialize($cur_forum['moderators']);
  92.         $moderators = array();
  93.  
  94.         while (list($mod_username, $mod_id) = @each($mods_array))
  95.             $moderators[] = '<a href="profile.php?id='.$mod_id.'">'.pun_htmlspecialchars($mod_username).'</a>';
  96.  
  97.         $moderators = "\t\t\t\t\t\t\t\t".'<p><em>('.$lang_common['Moderated by'].'</em> '.implode(', ', $moderators).')</p>'."\n";
  98.     }
  99.  
  100. ?>
  101.                 <tr<?php if ($item_status != '') echo ' class="'.$item_status.'"'; ?>>
  102.                     <td class="tcl">
  103.                         <div class="intd">
  104.                             <div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo $icon_text ?></div></div>
  105.                             <div class="tclcon">
  106.                                 <?php echo $forum_field."\n".$moderators ?>
  107.                             </div>
  108.                         </div>
  109.                     </td>
  110.                     <td class="tc2"><?php echo $num_topics ?></td>
  111.                     <td class="tc3"><?php echo $num_posts ?></td>
  112.                     <td class="tcr"><?php echo $last_post ?></td>
  113.                 </tr>
  114. <?php
  115.  
  116. }

 
 
Il s'agit d'un bout de code de punbb qui j'essaye d'améliorer...
Dans une boucle while existante, je veux ajouter une requete pour chercher des champs supplémentaires.
J'ai tout vérifier... à savoir que la requete est juste (elle fonctionne mise dans un script toute seule).
 
Hors il me semble que le problème vient de la facon dont la page est codée:
 
Elle est codé de cette manière:
 

Citation :


 
while
{
?> du html
<?php
des tests
?>
du html
<?php
 
ma requete
 
?>
du html
<?php
}
?>
 
 


 
alors qu'elle aurait du etre fait de la manière suivante:
 

Citation :


<?php
while
{
echo "code html";
des tests
echo "code html";
requete dans la base de donnée
echo "code html";
}


 
serait-ce la source du problème?
 
J'avais déjà eu ce problème il y a longtemps sur un de mes programmes... la seules facon pour enlever le problème avait été d'enlever les  
?>code html
<?php
 
intempestifs par des echo... et du coup, tout fonctionnait... mais ici, si il faut faire ca, je change de crèmerie, car je vais pas réecrire tout le code...
 
Merci pour vos idées
a+


Message édité par alain1111 le 25-03-2009 à 14:46:43
Reply

Marsh Posté le 24-03-2009 à 11:19:38   

Reply

Marsh Posté le 24-03-2009 à 15:12:17    

Je ne pense pas que ça vienne de ça. Je le fais constamment et je n'ai jamais eu de problème.
Quand tu dis que tu as testé ta requête, c'est à l'aide de phpmyadmin ou d'un autre client MySQL ?
Tu dis que la boucle while cesse, est-ce dès la première itération ?
Est-ce que ce qu'il y a après est executé ?
Est-ce que tu as une erreur sur ta page ?


---------------
Mon Feedback !
Reply

Marsh Posté le 25-03-2009 à 09:08:55    

Bonjour Tirkyth
 
 
Je te remercie de ton aide.
J'ai pris la requete à part, avec phpmyadmin. J'ai aussi fait un essai sur la page... et le champ souhaité s'affiche (donc la requete a marché), sauf que la boucle s'arrete
 
La boucle while cesse dès la première itération.
Le suite de la page est executé normalement, donc la page s'affiche normalement, sauf qu'il n'y a qu'un seul forum (le premier) qui s'affiche (c'est la page index).
 
Voila...
a+

Reply

Marsh Posté le 25-03-2009 à 09:51:21    

1. Pour rendre ton code plus lisible, plus facile à maintenir et la mise en page plus facilement modifiable, je te conseille d'éviter de trop mélanger la partie récupération de données et la partie affichage...
donc, oui, si tu peux séparer le php du html c'est toujours mieux...
 
Sinon, question bête :
Si la boucle s'arrête, c'est peut-être que la condition n'est plus vérifiée.

Code :
  1. while ($cur_forum = $db->fetch_assoc($result))


Tu es sensé récupérer quoi ?
Un coup de var_dump sur les différents éléments de ton test pourrait te donner quelques indications...

Reply

Marsh Posté le 25-03-2009 à 13:03:45    

à part çà, pour tout le monde, merci d'utiliser les bonnes balises de code :
[code=php][/code] pour PHP par exemple.

Reply

Marsh Posté le 25-03-2009 à 13:52:48    


Il y a un bouton pour [cpp][/cpp], pas pour les autres... :o  
 
...
 
Pour rester dans le HS : on peut trouver la liste des balises "cachées" quelque part ?

Reply

Marsh Posté le 25-03-2009 à 13:56:37    

elle a déjà été donnée plusieurs fois mais tous les langages n'y sont pas.
Et [cpp] ne sert à rien en plus, il ne colorise pas comme il faut il faut utiliser [code=cpp] [:sadnoir]

Reply

Marsh Posté le 25-03-2009 à 14:50:35    

Bonjour  :ouch:  
 
 
C'est mieux maintenant?
 
Par contre je suis assez décu...
Voila les résultats de mes essais:
 
juste avant la fin de boucle (ligne 115 sur mon 1er post) j'ai mis un  
 

Code :
  1. echo "fin de boucle";


 
 
 
Sans ma requete perso...  ca boucle normalement...
Avec ma requete perso, "fin de boucle" s'affiche, et la ca boucle plus, la fin de la page s'execute.
 
J'ai fait un var_dump avant et après ma requete sur $cur_forum.
J'ai constater que le fait de faire ma requete ne change pas ma variable (tabelau?) $cur_forum.  
 
En fait je suis quasi-certain que le fait de faire ma requete perso fait descendre le pointeur utilisé dans la requete du while après la dernière ligne du résultat de cette requete... donc forcément... on sort de la boucle... Pourquoi... je sais pas...
 
enfin voila ou j'en suis... sachant que le je suis à la limite de mes connaissances...
 
Sinon , je voulais faire ma requete, pour faire un système d'url cohérents... perso je connais pas un forum libre qui en natif soit satisfaisant à ce niveau...
 
Bref, ici je sais plus trop quoi faire...
a+


Message édité par alain1111 le 25-03-2009 à 15:00:56
Reply

Marsh Posté le 25-03-2009 à 14:54:36    

tu peux pas écrire ton post d'un coup, comme tout le monde ?

Reply

Marsh Posté le 25-03-2009 à 15:01:21    

:(  j'essaye...

Reply

Marsh Posté le 25-03-2009 à 15:01:21   

Reply

Marsh Posté le 25-03-2009 à 15:07:53    

autre question : pourquoi utilises-tu un objet pour gérer les requêtes SQL (voir ton while) et puis les fonctions du module mysql après :??:

Reply

Marsh Posté le 25-03-2009 à 15:15:44    

J'en sais rien...
C'est le programme qui est comme ca...
D'ailleurs , pour moi les objets c'est pas ma tasse de thé...

Reply

Marsh Posté le 25-03-2009 à 15:23:54    

d'après les commentaires çà vient de tes modifications...

Reply

Marsh Posté le 25-03-2009 à 15:34:21    

Lignes 77 et 78 (celles que tu as rajoutées) :
Rajoute or die (mysql_error()); et donne-nous le résultat...

Reply

Marsh Posté le 25-03-2009 à 17:07:32    

Hello,  
 
j'ai trouvé une alternative en modifiant la 1ère requete et en incluant dès le départ les champs que je cherche par le suite...
En tout cas merci beaucoup....

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed