Problème avec la boucle for

Résolu
Chabanus Messages postés 978 Date d'inscription   Statut Membre Dernière intervention   -  
 toto -
Bonsoir,
Je voudrais incrémenter le i mais il reste toujours à 1, s'il vous plait, pouvez-vous m'aider merci.

$sql2 = "SELECT titre,jour,mois,annee,type FROM news WHERE module='sye' ORDER BY id";
$result2 = mysql_query($sql2,$link);

$nb_total2 = "SELECT COUNT(*) AS nb_total2 FROM news WHERE module='sye'";
$nb_total2 = mysql_query($nb_total2,$link);

for ($i = 1 ; $i <= mysql_fetch_array($nb_total2) ; $i++)
	{
          while($row = mysql_fetch_array($result2))
             {       
	         if(($row['type']=='cours') || ($row['type']=='TD') || ($row['type']=='TP'))
{
echo "<div class='special'><a href='systeme.php?page=".$i."'><strong>".$row[titre]."</stron></a><strong> ( ".$row['type']." du ".$row['jour']. "-" .$row['mois']. "-" .$row['annee']." )</strong></div>";
}

else 
{
echo "<div class='special'><strong>".$row[titre]." ( ".$row['type']." )</strong></div>";
}
	     }
        }




Cordialement
A voir également:

7 réponses

toto
 
Bonjour

C'est un petit peu beaucoup n'importe quoi, ton script ;-)
Si j'y comprends quelque chose, ton $nb_total2 te sert à savoir combien il y avait de réponses à la requête $sql2. Tu sais que tu l'as directement avec mysql_num_rows($result2) ?
D'autre part, tu imbriques deux boucles, ça n'a aucun sens ici : si tu as trouvé , disons 10 réponses, tu vas faire ton for(s'il était écrit correctement, ce qui n'est pas le cas) 10 fois, et à chaque fois tu ferais le while qui lui-même balayerait toute la table des résultats. Ça te ferait 100 boucles au total (sauf que la ressource result2 serait épuisée mais bon...)
Tu n'as besoin que du while

Enfn, tu testes dans ta boucle si le champ type obtenu est 'cours' ou 'TD' ou 'TP' : pourquoi ne pas avoir mis ce test directement dans ta requête ?
2
Chabanus Messages postés 978 Date d'inscription   Statut Membre Dernière intervention   70
 
Merci pour ta réponse.
Sql2 pour sélectionner les titres des news et nb_tatal2 pour compter le nombre de news c'est différent.
La boucle for je l'ai besoin pour incrémenter le i qui est le numéro de la page qui contient l'article et la boucle while pour afficher les titres de ses articles.
Je voudrais faire cela:
<a href="systeme.php?page=1>titre1</a>
<a href="systeme.php?page=2>titre2</a>
<a href="systeme.php?page=3>titre3</a>
<a href="systeme.php?page=4>titre4</a>
.
.
.
.
Merci

Voici le code en entier
function pagination($current_page, $nb_pages, $link='?page=%d', $around=3, $firstlast=1)
{
    $pagination = '';
    if ( !ereg('%d', $link) ) $link .= '%d';
    if ( $nb_pages > 1 ) {


        if ( $current_page > 1 )
            $pagination .= '<a class="prevnext" href="'.sprintf($link, $current_page-1).'" title="Page précédente">&laquo; Précédent</a>';
        else
            $pagination .= '<span class="prevnext disabled">&laquo; Précédent</span>';


        for ( $i=1 ; $i<=$firstlast ; $i++ ) {
            $pagination .= ' ';
            $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
        }


        if ( ($current_page-$around) > $firstlast+1 )
            $pagination .= ' &hellip;';


        $start = ($current_page-$around)>$firstlast ? $current_page-$around : $firstlast+1;
        $end = ($current_page+$around)<=($nb_pages-$firstlast) ? $current_page+$around : $nb_pages-$firstlast;
        for ( $i=$start ; $i<=$end ; $i++ ) {
            $pagination .= ' ';
            if ( $i==$current_page )
                $pagination .= '<span class="current">'.$i.'</span>';
            else
                $pagination .= '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
        }


        if ( ($current_page+$around) < $nb_pages-$firstlast )
            $pagination .= ' &hellip;';


        $start = $nb_pages-$firstlast+1;
        if( $start <= $firstlast ) $start = $firstlast+1;
        for ( $i=$start ; $i<=$nb_pages ; $i++ ) {
            $pagination .= ' ';
            $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
        }


        if ( $current_page < $nb_pages )
            $pagination .= ' <a class="prevnext" href="'.sprintf($link, ($current_page+1)).'" title="Page suivante">Suivant &raquo;</a>';
        else
            $pagination .= ' <span class="prevnext disabled">Suivant &raquo;</span>';
    }
    return $pagination;
}
if( isset($_GET['page']) && is_numeric($_GET['page']) )
  $page = $_GET['page'];
else
  $page=1;


$pagination = 1;

$limit_start = ($page - 1) * $pagination;

$sql2 = "SELECT titre,jour,mois,annee,type FROM news WHERE module='sye' ORDER BY id";
$result2 = mysql_query($sql2,$link);

$nb_total2 = "SELECT COUNT(*) AS nb_total2 FROM news WHERE module='sye'";
$nb_total2 = mysql_query($nb_total2,$link);

for ($i = 1 ; $i <= mysql_fetch_array($nb_total2) ; $i++)
	{
          while($row = mysql_fetch_array($result2))
             {       
	         if(($row['type']=='cours') || ($row['type']=='TD') || ($row['type']=='TP'))
{
echo "<div class='special'><a href='systeme.php?page=".$i."'><strong>".$row[titre]."</stron></a><strong> ( ".$row['type']." du ".$row['jour']. "-" .$row['mois']. "-" .$row['annee']." )</strong></div>";
}

else 
{
echo "<div class='special'><strong>".$row[titre]." ( ".$row['type']." )</strong></div>";
}
	     }
        }

		<?php
        $sql = "SELECT titre,text,auteur,module,date,validation,jour,mois,annee,type FROM news WHERE module='sye' AND validation='oui' ORDER BY id DESC LIMIT $limit_start,$pagination";
        $result = mysql_query($sql,$link);
        while($row = mysql_fetch_array($result))
        {       
                $date = date('d/m/Y \à H\hi', $row['date']);
                echo"<div class='news'>
                <div class='titre'>$row[titre]&nbsp; postée le $date</div>
                <div class='text_news'>";
				if(($row['type']=='cours') || ($row['type']=='TD') || ($row['type']=='TP'))
				{
				echo"<div class='titresp'> <strong><h3>A propos du " . $row['type'] . " du " .$row['jour']. "-" .$row['mois']. "-" .$row['annee']."</strong></h3></div><br/>";
				}
				elseif(($row['type']=='Programmation') || ($row['type']=='Documentation') || ($row['type']=='Webmastering') || ($row['type']=='Aide') || ($row['type']=='Recherche'))
				{
				echo"<div class='titresp'> <strong><h3>Description/Propostion d'un Site de " . $row['type'] . "</strong></h3></div><br/>";
				}
					elseif(($row['type']=='web') || ($row['type']=='perso') || ($row['livre']=='Webmastering'))
				{
				echo"<div class='titresp'> <strong><h3>Description/Propostion d'un Document " . $row['type'] . "</strong></h3></div><br/>";
				}
				else echo"";
                bbcode($row['text']);
		
				
                echo"<div class='posteur'>Ajouter par: $row[auteur]</div>
                <br /></div></div><br/>";
				
        }?>
		<strong>
	<a href="afficher3.php">Commentaires</a>
		</strong><br/>
<?php
       $nb_total = mysql_query('SELECT COUNT(*) AS nb_total FROM news WHERE module="sye"');
$nb_total = mysql_fetch_array($nb_total);
$nb_total = $nb_total['nb_total'];

/* Pagination */
$nb_pages = ceil($nb_total / $pagination);

/* Affichage */
echo '<div class="pagination">' . pagination($page, $nb_pages) . '</div>';


?>

		?><br/>

0
U_Gk Messages postés 445 Date d'inscription   Statut Membre Dernière intervention   78
 
heu je me rappel pu trop mes cour de prog. mais t'a pas oublier de fermer ton for"" avant le "else" . Pardon a tout les programmateur si je me suis planter, mois et la prog ça fait 2 xD. Et pour résoudre un PB fait quelque "print" pour voir ce qui ne s'effectue pas ...
0
Chabanus Messages postés 978 Date d'inscription   Statut Membre Dernière intervention   70
 
Le for c'est pour toute l'instruction qui vient après celle-ci
0
U_Gk Messages postés 445 Date d'inscription   Statut Membre Dernière intervention   78
 
-_-' pas vu ............... dsl
0

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

Posez votre question
toto
 
Sql2 pour sélectionner les titres des news et nb_tatal2 pour compter le nombre de news c'est différent.
Je sais bien que la liste des titres des news et le nombre de news ce n'est pas la même chose. Ce que je dis, c'est que si tu as déjà le résultat d'une requête dans $sql2, tu n'as pas besoin d'une autre requête pour compter le nombre de lignes de ce résultat. Tu as le fonction mysql_num_rows.
Tu pourrais remplacer
$nb_total2 = "SELECT COUNT(*) AS nb_total2 FROM news WHERE module='sye'";
$nb_total2 = mysql_query($nb_total2,$link);

par
$nb_total2 = mysql_num_rows($sql2,$link);

De plus, tu utilises mal le $nb_total2 que tu utilises :
tu fais $i <= mysql_fetch_array($nb_total2) alors que mysql_fetch_array($nb_total2) te rend un tableau, pas un nombre. Tu ne peux pas comparer une variable ($i) à un tableau !

De plus, ta boucle for est non seulement inutile, mais nuisible au bon fonctionnement de ton script. Tu veux afficher tes résultats, le while($row = mysql_fetch_array($result2))est suffisant. En mettant ce while à l'intérieur du for, tu vas essayer de recommencer de traiter la totalité de la liste des réponses plusieurs fois, ce qui est absurde et ne va pas marcher. Si tu as besoin d'un compteur les lignes, tu initialises $i=1; avant la boucle, et tu incrémentes $i++; à chaque boucle.
Mais je ne crois pas que tu aies besoin de ce compteur. Ne crois tu pas que dans ton lien<a href='systeme.php?page=".$i, $i devrait être l'id de la ligne trouvée, plutôt qu'un numéro d'ordre qui ne veut rien dire ?

Remarque : tu pourrais garder le for mais supprimer le while et faire simplement $row = mysql_fetch_array($result2). Ce qu'il ne FAUT PAS (dans ton cas), c'est avoir les deux. On préfère traditionnellement la solution avec le while.
0
Chabanus Messages postés 978 Date d'inscription   Statut Membre Dernière intervention   70
 
Merci pour ton aide, voici ce que j'ai fais :

	$sql2 = "SELECT titre,jour,mois,annee,type FROM news WHERE module='sye' ORDER BY id DESC";
        $result2 = mysql_query($sql2,$link);
		 $i=0;   
        while($row = mysql_fetch_array($result2) AND ($i=$i+1))
        {       
	if(($row['type']=='cours') || ($row['type']=='TD') || ($row['type']=='TP'))
	{
echo"<table border='0' cellpadding='0' cellspacing='0'><tr>";
echo "<td><div class='special'>".$i."- <a href='systeme.php?page=".$i."'><strong>".$row[titre]."</strong></a></div></td><td><div class='special'>( ".$row['type']." du ".$row['jour']. "-" .$row['mois']. "-" .$row['annee']." )</div></td>";
echo"</tr></table>";
}
		}
		?>
		


0
toto
 
Ton AND ($i=$i+1) fonctionne, mais c'est un coup de chance. Conceptuellement, c'est une absurdité : tu ne cherches absolument pas à faire un ET entre deux conditions. Il vaut mieux écrire :
while($row = mysql_fetch_array($result2))
{ $i++;
0