Petit problème avec des boucles...

Eléphant du PHP | 82 Messages

19 nov. 2005, 12:56

Salut, à tous.

J'ai un petit problème avec les boucles.. en fait c'est surtout une vérification que j'arrive pas trouver comment faire, qui me casse mon affichage. Je sens que c'est un truc tout bête mais je vois vraiment pas.

Voilà le code. J'ai anoté la partie qui pose problème.
else{

	$sql = "SELECT id,nserie,caract,type FROM kah_basses WHERE type='1'";
	$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

	while($data = mysql_fetch_array($req)){
		
		$mini_desc = substr($data['caract'], 0, 100);
		
		$ligne_galerie .= '<tr>';

		$sql_vign_1 = "SELECT pid,url,bass_id,comment,nature FROM kah_img WHERE bass_id='".$data['id']."' AND nature='1' LIMIT 1";
		$req_vign_1 = mysql_query($sql_vign_1) or die('Erreur SQL !<br>'.$sql_vign_1.'<br>'.mysql_error());

// La boucle qui pose problème.

		while($data_vign_1 = mysql_fetch_array($req_vign_1)){

			$vignette = '<img src="'.$chemin_dossier.''.$data_vign_1['bass_id'].'/'.$data_vign_1['url'].'" border="0" alt="">';
			$ligne_galerie .= '<td align="justify"><a href="?No='.$data['id'].'">'.$vignette.'</a><br><br><br></td>';

		}

/*
Ce que je veux faire : 

Une vérification pour que, si il n'y a pas d'enregistrement retourné par la boucle (car pas d'entrée correspondante aux conditions) alors on a la balise vignette telle que :

$vignette = '<img src="'.$chemin_dossier.'/noimg.jpg" border="0" alt="">'; 

Le problème : peut importe ce que j'ai essayé j'ai deux résultats :

1. La variable ne retourne rien et ca me décalle mon tableau.
2. Affichage de l'enregistrement correspondant à "bass_id - 1" (exemple : si j'ai pas d'enregistrement en bass_id=3 avec type=1, ce qui s'affiche c'est les données correspondante à bass_id=2..)
*/

		
		$ligne_galerie .= '<td><font face="verdana" size="2" color="#E7CFB4">';
		$ligne_galerie .= $mini_desc;
		$ligne_galerie .= ' ... <i>(Lire la suite en cliquant sur l\'image)</i></font><br><br></td>';
		$ligne_galerie .= '</tr>';
	}

	$page = template("pages_".$rub."_in.html");
	eval("echo stripslashes(\"$page\");");

}
Je sais pas si j'ai été très clair..

Merci d'avance si quelqu'un a une idée de comment faire. :oops:
Sébastien.

Eléphant du PHP | 82 Messages

19 nov. 2005, 22:36

Bon j'ai eu beau passer l'après midi sur mon bout de code, je vois vraiment. Vraiment personne pourrait me filer un coup de pouce ?
Sébastien.

Mammouth du PHP | 983 Messages

19 nov. 2005, 22:49

D'une part, pourquoi faire une boucle sur le résultat de ta requete puisqu'il y a une clause LIMIT 1 (donc au maximum 1 résultat). D'autre part, s'il n y a pas de résultat, tu ne crée pas de cellule, d'où ton décalage.
Je te propose ca:
 $sql = "SELECT id,nserie,caract,type FROM kah_basses WHERE type='1'";
  $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

    while($data = mysql_fetch_array($req))
    {
        
        $mini_desc = substr($data['caract'], 0, 100);
        
        $ligne_galerie .= '<tr>';

        $sql_vign_1 = "SELECT pid,url,bass_id,comment,nature FROM kah_img WHERE bass_id='".$data['id']."' AND nature='1' LIMIT 1";
        $req_vign_1 = mysql_query($sql_vign_1) or die('Erreur SQL !<br>'.$sql_vign_1.'<br>'.mysql_error());

		// La boucle qui pose problème.
		if($req_vign_1 and mysql_num_rows($req_vign_1) >0)
		{
        	$data_vign_1 = mysql_fetch_array($req_vign_1);
            $vignette = '<img src="'.$chemin_dossier.''.$data_vign_1['bass_id'].'/'.$data_vign_1['url'].'" border="0" alt="">';
            $ligne_galerie .= '<td align="justify"><a href="?No='.$data['id'].'">'.$vignette.'</a><br><br><br></td>';
        }
        else
        {
        	$vignette = '<img src="'.$chemin_dossier.'/noimg.jpg" border="0" alt="">'; 
        	$ligne_galerie .= '<td align="justify">'.$vignette.'</td>';
        }
        $ligne_galerie .= '<td><font face="verdana" size="2" color="#E7CFB4">';
        $ligne_galerie .= $mini_desc;
        $ligne_galerie .= ' ... <i>(Lire la suite en cliquant sur l\'image)</i></font><br><br></td>';
        $ligne_galerie .= '</tr>';
    }

    $page = template("pages_".$rub."_in.html");
    eval("echo stripslashes(\"$page\");"); 

Eléphant du PHP | 82 Messages

19 nov. 2005, 23:15

Déjà merci de la réponse, ca marche parfaitement.

En ce qui concerne la boucle, c'est que j'ai rajouté la condition LIMIT 1 après, sans penser que while me servait plus à grand chose en fait. :oops:

Par contre y'a une ligne du code que je comprends pas trop :
if($req_vign_1 and mysql_num_rows($req_vign_1) >0)
Pour "mysql_num_rows($req_vign_1) >0" ca renvoie le nombre de ligne correspondant à la requete $req_vign_1. Donc si dans la base ca trouve une image bass_id=$data[id] et nature=1, la condition est remplie. Ca je comprends, mais à quoi sert "$req_vign_1" tout seul ?
Sébastien.

Mammouth du PHP | 983 Messages

19 nov. 2005, 23:36

Si mysql_query() n'arrive pas à exécuter la requête, il renvoie FALSE. Donc la première condition permet de s'assurer que la requête a été exécutée correctement. Car si ce n'est pas le cas et qu'on utilise mysql_num_rows() dessus, ca pètera.

Eléphant du PHP | 82 Messages

19 nov. 2005, 23:57

Merci pour ces précisions, c'est bien ce que je pensais.

Hop résolu :D
Sébastien.