Problème : boucle dans une boucle...

Mammouth du PHP | 531 Messages

18 déc. 2006, 13:03

Bonjour a tous. Me revoilà avec un autre problème et c'est pas le dernier je pense.
Voilà le topo : J'ai une table contenant des nom de logiciel ainsi qu'un entier correspondant a leur categorie. J'ai une deuxieme table qui regroupe justement les categories. L'id d'un categorie correspond donc avec l'entier de la table logiciel. J'espere que vous me suivez...

Je veut donc obtenir le resultat suivant :
Le titre de la categorie, les logiciels qui y sont associés, et ainsi dessuite. J'ai donc fait ceci :

Code : Tout sélectionner

<?php // SELECTION CATEGORIE LOGICIEL $sql= "SELECT id_categ, nom_categ FROM logiciels_categ ORDER BY order_categ"; $req= mysql_query($sql) or die ('Erreur : '.$sql.'<br .>'.mysql_error()); // SELECTION LOGICIEL $sql2= "SELECT id_logiciel, nom_logiciel, categ_logiciel FROM logiciels_logiciels ORDER BY nom_logiciel"; $req2= mysql_query($sql2) or die ('Erreur : '.$sql2.'<br .>'.mysql_error()); // BOUCLE while ($data= mysql_fetch_assoc($req)) { echo '<h2>'.$data['nom_categ'].'</h2>'; // AFFICHAGE CATEGORIE while ($data2= mysql_fetch_assoc($req2)) { // BOUCLE 2 if ($data['id_categ'] == $data2['categ_logiciel']) { // SI VARIABLE CATEGORIE EGAL VARIABLE CATEGORIE LOGICIEL echo '<h3>'.$data2['nom_logiciel'].'</h3>'; } } } ?>
Je pense que je n'ai pas encore du saisir le fonctionement de while puisque mon code affiche la premiere catégorie et ses logiciels, il affiche la deuxieme mais il n'affiche pas les logiciels de la deuxieme... il stoppe. Détail qui ets peut être important ? il n'y a pour l'instant que deux catégories dans ma table. et 3 logiciels.

Voilà j'espere que vous pourrez m'aider :roll:

ViPHP
ViPHP | 1961 Messages

18 déc. 2006, 13:35

Bonjour,

Essaie ceci en direct pour voir si ça correspond à ce que tu cherches.
SELECT id_categ, nom_categ, id_logiciel, nom_logiciel 
FROM  logiciels_categ, logiciels_logiciels
WHERE categ_logiciel = id_categ ORDER BY nom_categ, nom_logicel;
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 531 Messages

18 déc. 2006, 14:17

Intéressant cette requete je n'imaginais pas que l'on pouvais faire quelque chose de ce genre...
Mais du coup j'arrive pas a adapter ma boucle pour obtenir le resultat voulu :cry:

ViPHP
ViPHP | 1961 Messages

18 déc. 2006, 14:23

Re,

Dis ce que tu veux obtenir, on va essayer de l'obtenir.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 531 Messages

18 déc. 2006, 14:34

hum je vais essayer d'expliquer ça simplement.

J'ai une table qui contient des categorie. Genre 1,2,3 etc... ça c'est l'id
Une autre qui contient des données sans importances pour le problème et un champ categ_logiciel contenant en fait la copie de l'd de l'autre table.

Voilà un exemple du resultat :

Nom categorie
logiciel 1
logiciel 2
Autre nom categorie
logiciel 5
logiciel 3
Encore un autre
logiciel 4

ViPHP
ViPHP | 1961 Messages

18 déc. 2006, 15:17

Re,
Voici QQ chose qui devrait correspondre à ce que cherches.
Ne recopie pas le code bêtement, essaie de comprendre ce qui se passe.
Si tu as des soucis, n'hésite pas à poser des questions.
<?php
// ICI la connexion à la base

// Construction de la requête
$qry = 'SELECT nom_categ, nom_logiciel 
FROM  logiciels_categ, logiciels_logiciels
WHERE categ_logiciel = id_categ ORDER BY nom_categ, nom_logicel';
// Exécution de la requête
$result = mysql_query($qry) or die('ERR_SQL :<br />' . $qry . '<br />' . mysql_error());
// Exploitation des résultats
$catEnCours = '';
while($row = mysql_fetch_array($result)){
   // Si changement de catégorie
   if($row['nom_categ'] != $catEnCours){
      // Affichage de la catégorie
      echo '<strong>' . $row['nom_categ'] . '</strong><br />';
      // Affectation de la nouvelle catégorie à la catégorie en cours
      $catEnCours = $row['nom_categ'];
   }
   // Affichage du nom du logiciel
   echo $row['nom_logiciel'] . '<br />';
}
ATTENTION : J'ai pas testé ce code, mais il devrait fonctionner.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 531 Messages

18 déc. 2006, 16:43

C'est effectivement ça que je cherchais.
Je vais etudier le code dés que j'ai un peu de temps et je repasse sans doute demain pour une ou deux questions :wink:

Mammouth du PHP | 531 Messages

19 déc. 2006, 11:49

Je comprend le système de la boucle.
en fait je crois que c'ets la requete que je comprends pas.

Exemple :
Select bidule Where age = 12, ça veut dire que l'on va recuperer les bidules agés de 12 ans. Et l'on ignore les autres.

Dans mon cas je comprends pas :
WHERE categ_logiciel = id_categ

Ici l'on recupere bien tous les champs pourtant, puisque lla totalité s'affiche. Si je comprend bien on fait !une sorte de tableau ? Mais on ignore aucun des champs, on les classes juste ensemble ?

Désolé si ma question est pas trés clair, j'éspère que vous arriverrez a comprendre.

:?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2006, 12:14

C'est ce que l'on appelle une jointure entre deux tables.

Plutôt que de faire tes deux requêtes :

Code : Tout sélectionner

- SELECT id_categ, nom_categ FROM logiciels_categ ORDER BY order_categ - SELECT id_logiciel, nom_logiciel, categ_logiciel FROM logiciels_logiciels ORDER BY nom_logiciel
et de regrouper ensuite les logiciels en fonction de leurs catégories en php, on va faire ce regroupement directement dans sql.

Si tu te contentes d'ajouter la seconde table sans donner de critère de jointure :

Code : Tout sélectionner

SELECT nom_categ, nom_logiciel FROM logiciels_categ, logiciels_logiciels
Il va croiser les enregistrements de chaque table. Ainsi tu vas avoir une ligne de résultat pour chaque association distincte, c'est à dire que dans la première catégorie tu vas retrouver tous les logiciels de l'autre table, idem dans la deuxième, la troisième, etc.

Si en revanche tu spécifies une condition sur ta jointure (en l'occurence, uniquement les lignes pour lesquelles l'id_categ correspond à la categ_logiciel),

Code : Tout sélectionner

SELECT nom_categ, nom_logiciel FROM logiciels_categ, logiciels_logiciels WHERE categ_logiciel = id_categ
il ne va ramener que les lignes qui respectent cette contrainte. Tu n'auras donc pour la première catégorie que les logiciels dont l'id_categ correspond à celle-ci, idem pour la seconde, etc.

C'est y plus clair ? :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

19 déc. 2006, 12:24

Oui ça va un peu mieux :D
Tan qu'a faire j'ai une autre question ou plutot une erreur, je vais la mettre là :
J'essaye de creer une fonction pour rajouter des slashs. histoire ne pas être obligé de la réécrire a chaques fois que j'en ai besoin :

Code : Tout sélectionner

function ajout_slash($var_traitement) { $var= addslashes($var_traitement); }

Code : Tout sélectionner

$var= ajout_slash($nom); echo $var;
Il y a surement une erreur puisque rien ne se passe.
Pourtant je me suis aidé d'exemple pour faire ça...

ViPHP
ViPHP | 1961 Messages

19 déc. 2006, 12:26

Bonjour,

En complément de ce que t'a dit Ryle
Une requête "SELECT" est composée de trois parties pricipales.

1 - Les données que tu veux extraire "SELECT".
2 - La (les) table(s) où se trouvent les données à extraire "FROM"
3 - La (les) condition(s) que les données doivent remplir "WHERE"

Dans nôtre cas:
1 - On veux "nom_categ" et "nom_logiciel"
2 - Qui se trouvent dans les tables "logiciels_categ" et "logiciels_logiciels"
3 - Mais je ne veux que les lignes qui remplissent la condition : l'identifiant des deux catégories doit être le même.

On lui demande en supplément de les classer par le nom de la catégorie et ensuite par le nom du logiciel.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 531 Messages

19 déc. 2006, 12:40

Merci pour votre aide ça commence a rentrer :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2006, 12:51

C'est ce qui est bien avec le SQL, on le code comme on le parle :)

Concernant ton problème de fonction, je suis pas certain qu'il soit judicieux de faire une fonction qui appelle juste une fonction avec les mêmes arguments (et dont le nom est plus court qui plus est ;))

autant directement faire addslashes() que ajout_slash() à mon avis...

Quoi qu'il en soit, ta fonction se contente de créer une variable $var (interne à la fonction) et de lui affecter la valeur résultat de addslashes(). A aucun moment elle ne retourne de résultat (c'est ce qu'on appelle une fonction de type void, car elle ne retourne rien et se contente d'exécuter un traitement).
Le problème, c'est que tu récupères le résultat retourné (bien qu'il n'y en ait pas) dans une autre variable $var ...

Pour corriger cela, il y a deux façon de procéder. La plus simple (et la plus adaptée) est de modifier ta fonction pour qu'elle retourne un résultat en ajoutant simplement un "return $var;" à la fin :)

L'autre solution est un peu plus compliquée, mais peut t'être utile un jour, il s'agit de dire que la variable $var contenue dans la fonction est une variable globale, c'est à dire que sa portée ne se limite pas à la fonction (en temps normal, une fois la fonction exécuté, cette $var est détruite), mais provient d'une variable extérieure... bon le mieux étant d'avoir un exemple :
$var = 1;
function toto() {
  $var = 2; // cette variable est différente de la première, son périmètre se limite à la fonction
  return $var; // retourne la valeur
}
$var = toto(); // affecte la valeur au premier $var
echo $var; // affiche 2, le résultat de la fonction est placé dans la variable
$var = 1;
function toto() {
  $var = 2; 
}
toto(); // appel simplement la fonction
echo $var; // affiche 1, la fonction n'impacte pas la variable
$var = 1;
function toto() {
  global $var; // la variable est globale, elle n'est pas juste propre à la fonction
  $var = 2; // affecte la variable à l'extérieur de la fonction
}
toto(); // appel simplement la fonction
echo $var; // affiche 2, la fonction n'impacte pas la variable
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2006, 12:52

Merci pour votre aide ça commence a rentrer :D
"C'est encore une grande victoire de canard !" :)
(désolé, depuis le temps que j'avais envie de la faire celle là, je pouvais pas me retenir plus longtemps ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

20 déc. 2006, 13:36

Merci pour votre aide ça commence a rentrer :D
"C'est encore une grande victoire de canard !" :)
(désolé, depuis le temps que j'avais envie de la faire celle là, je pouvais pas me retenir plus longtemps ;))
:lol:

merci a tous pour votre aide :)