PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 04-03-2010 15:55:22

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Requête pour afficher menu ?

Bonjour à tous,

je suis en train de developper une boutique en PHP/mySQL et j'ai dû mal à faire la requête pour afficher mon menu coorectement.

Voici un apercu de mes 2 tables:

table groupe_article

(
Champ Type  Null  Défaut
numgroupe int(11) Oui NULL
nomgroupe varchar(40) Oui NULL

Contenu de la table groupe_article

numgroupe - nomgroupe

1 Portable
2 Ordinateur
3 Disque Dur Externe
4 Boitier PC
5 Boitier Externe
6 Alimentation
7 Disque Dur
8 Mémoire
9 Carte Mère
10  Processeur
11  Carte Graphique
12  Lecteur
13  Carte PCI
14  Moniteur
15  Réseau
16  Périphérique
17  Logiciel
18  Encaissement)

table s_groupe_article



Structure de la table s_groupe_article

(
Champ Type  Null  Défaut
numssgroupe int(11) Oui NULL
nomssgroupe varchar(40) Oui NULL
numgroupe int(11) Oui NULL

Contenu de la table s_groupe_article

numssgroupe - nomssgroupe - numgroupe

1 PC Portable 1
2 Accessoire portable 1
3 Bureautique 2
4 Familliale  2
5 Gamer 2
6 Mini PC 2
7 Disque Dur Externe 3.5  3
8 Disque Dur Externe 2.5  3
9 Disque Dur multimédia  3
10  NAS 3
11  Boitier PC  4
12  Boitier Externe 5
13  Alimentation  6
14  Disque dur SATA 7
15  Disque dur IDE  7
16  Disque dur 2.5\"  7
17  DDR3  8
18  DDR2  8
19  DDR 8
20  SODIMM  8
21  Intel 9
22  AMD 9
23  Intel 10
24  AMD 10
25  Nvidia  11
26  Ati 11
27  Graveur DVD 12
28  Graveur Externe 12
29  Lecteur de carte  12
30  Carte son 13
31  Tuner TV  13
32  Contrôleur 13
33  Ecran PC  14
34  TV  14
35  Wifi  15
36  Camera IP 15
37  Modem / Routeur / Switch  15
38  CPL 15
39  Souris / Clavier  16
40  Enceinte  16
41  Imprimante  16
42  Clé USB  16
43  Système  17
44  Bureautique 17
45  Gestion 17
46  Encaissement  17
47  Ecran 18
48  Imprimante  18
49  Solution complète  18)

Je voudrai que chaque "nomssgroupe" aille dans le "nomgroupe" adequat...
J'ai fait pas mal de test, mais aucun ne m'affiche ce que je veux vraiment.
Merci pour votre aide

Hors ligne

#2 04-03-2010 16:03:26

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Requête pour afficher menu ?

quaresma a écrit :

Je voudrai que chaque "nomssgroupe" aille dans le "nomgroupe" adequat...
J'ai fait pas mal de test, mais aucun ne m'affiche ce que je veux vraiment.
Merci pour votre aide

Saluton,
Tu pourrais être un poil plus clair ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 04-03-2010 16:22:19

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

Une sélection des deux tables et un "ORDER BY numgroupe ASC" devrait suffire si j'ai bien compris la question.
A la limite un autre champs pour l'order by (numssgroupe ou nomssgroupe) pour ranger les sous menus et l'affaire est réglée.

Hors ligne

#4 05-03-2010 16:28:51

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

hey!

j'ai testé, voici ma requête :

<?php
require("identification/connexion_sql.php");
$db = mysql_connect($host_db,$login_db,$password_db) or die ("impossible de se connecter a la base".mysql_error());
mysql_select_db($name_db,$db) or die ("base inexistante".mysql_error());
$req = mysql_query("SELECT * FROM groupe_article, s_groupe_article WHERE s_groupe_article.numgroupe = groupe_article.numgroupe ORDER BY groupe_article.numgroupe ASC") or die ("impossible d'effectuer la requête");
while($shopone = mysql_fetch_array($req)){
$nomdugroupe = stripslashes($shopone['nomgroupe']);
$nomsousgroupe = stripslashes($shopone['nomssgroupe']);

print'<table width="100%" border="0" cellspacing="1" cellpadding="1">
      <tr>
        <th width="14%" scope="col"> </th>
        <th width="86%" scope="col"><a href="formation.php"><strong>
        <div align="left">'.$nomdugroupe.'</div></strong></a></th>
      </tr>
      <tr>
        <th width="14%" scope="col"> </th>
        <th width="86%" scope="col"><div align="left"><a href="maintenance.php" class="textessmenuleft">'.$nomsousgroupe.'</a></div></th>
      </tr>
    </table>';}
mysql_close();
?>

Mais, comme vous pourrez le voir ci-desous, il y a un problème d'affichage que vous pourrez largement constater par vous même :calim2:

Portable
  PC Portable
  Portable
  Accessoire portable
  Ordinateur
  Familliale
  Ordinateur
  Gamer
  Ordinateur
  Bureautique
  Ordinateur
  Mini PC
  Disque Dur Externe
  Disque Dur multimdia
  Disque Dur Externe
  Disque Dur Externe 3.5
  Disque Dur Externe
  NAS
Disque Dur Externe
  Disque Dur Externe 2.5 , etc...

Merci pour votre aide smile

Hors ligne

#5 05-03-2010 20:16:53

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

Il s'agit d'un problème que tu peux résoudre avec le PHP.
Voici un message de Kris qui pourrait peut être t'aider : http://forum.phpdebutant.org/viewtopic.php?id=6182 (réponse n°4 du topic)

Sinon il faut agir avec un tableau où tu "coches" les éléments qui ont déjà été affichés afin de ne pas les réafficher.

Hors ligne

#6 06-03-2010 06:51:20

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

salut,
merci pour ta reponse.

j'ai bien regardé la solution de chris, et j'ai fait pas mal de test, mais je ne doit pas bien comprendre la fonction array_unique() car elle ne change rien à l'affichage neutral

merci pour votre aide...

Hors ligne

#7 06-03-2010 09:30:57

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

Le but de la solution de Kris était de rendre un tableau sans doublons. Si l'affiche reste le même c'est que forcement tes champs ne sont pas pareil.
Mais je dois bien avouer que je suis déjà moins sûr de l'ordre respecté après passage dans cette fonction. Vu que je ne sais pas quelles sont les occurrences qui sont supprimées.

Voilà ce que j'ai déjà recommandé pour ma part :

$monArray = array(......); // Mes données
$arrayFlag = array(); // Array drapeau
foreach( $monArray as $valeur )
{
  if( !isSet($arrayFlag[$valeur['id_cat']]) ) // On vérifie que le champ n'a pas été déjà affiché
  {
    echo $valeur['nom_cat']; // On l'affiche
    $arrayFlag[$valeur['id_cat']] = true; // On signale qu'on a affiché cette catégorie au moins une fois
  }
}

Cela permet de faire un affichage unique des noms des catégories tout en conservant l'ordre renvoyé par la requête.

Hors ligne

#8 06-03-2010 09:42:19

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

et dans mon code, où dois-je insérer ton exemple ?

comment faire pour ensuite ne plus afficher le nom une seconde fois pour ne pas avoir de doublons ou de "triplons" ?

merci beaucoup

Hors ligne

#9 06-03-2010 12:15:55

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

Je pensais avoir bien commenté mais apparemment cela n'a pas suffit. hmm
Le code que je t'ai donné est à adapté pour tes champs.
C'est ce code qui permet de ne pas afficher de doublons, il utilise le tableau renvoyé par la requête et affiche les résultats.

En bref il n'est en aucun cas utilisable tel qu'il l'est pour ton script. A toi de le comprendre et de l'adapter.
Je reste là pour toute question.

Hors ligne

#10 06-03-2010 13:55:54

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

Merci pour ta réponse xTG.

Je ne comprend pas à quoi correspond "Array drapeau" et "foreach" ?

Et que sont "$valeur['id_cat']" et "$valeur['nom_cat']" ?

Désolé pour ces questions, mais j'ai du mal à comprendre.

Comment dois-je placer ce code (une fois compris et modifier) dans le mien ?

Merci pour ton aide dans tous les cas !

Hors ligne

#11 06-03-2010 14:13:05

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

La variable arrayDrapeau permet d'enregistrer les valeurs que tu as déjà affiché.
La boucle foreach permet de parcourir tous les résultats de ta requête. Je suppose que tu utilises un while, cela fait la même chose.
L'index "id_cat" est l'identifiant unique de la catégorie, "nom_cat" est le nom à afficher.

Hors ligne

#12 06-03-2010 14:23:03

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

OK
merci je comprend mieux le "arrayDrapeau" et le "foreach" wink

Le "$valeur['id_cat']" correspond a l'id 1 de ordinateur, a l'id 2 de DDexterne, etc. ?


Et dans "$monArray = array(......);" Je dois mettre des données, mais lesquelles ? (boulet hein ? smile )

Et donc, ensuite ce code je dois l'insérer sur chaque ligne pour toute les "grandes" categories ?

Merci encore smile

Dernière modification par quaresma (06-03-2010 14:23:57)

Hors ligne

#13 06-03-2010 16:19:17

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

Tu as compris pour les valeur des IDs.

Par contre $monArray était mon exemple. Dans ton cas c'est la variable dans laquelle tu stockes le retour de la requête SQL : $shopone (ma boucle foreach correspond à ton while avec cette variable)

Et ce code est à utiliser une seule fois. Car tu n'as qu'une seule requête.

Hors ligne

#14 06-03-2010 17:52:27

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

Merci pour te réponse.

Je viens juste de rentrer. Je vais faire des essais et je te tiens au courant si ca fonctionne ou pas wink

MERCI!

Hors ligne

#15 06-03-2010 21:44:20

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

Hey!
j'ai effectué beaucoup de test mais sans grand succès j'ai toujours des erreurs...

Voici la dernière erreur que mon code affiche:

Warning: Cannot use a scalar value as an array in /homez.33/ifmicro/www/v2/boutique/index_boutique2.php on line 42
Portable
Warning: Cannot use a scalar value as an array in /homez.33/ifmicro/www/v2/boutique/index_boutique2.php on line 42
Ordinateur
Warning: Cannot use a scalar value as an array in /homez.33/ifmicro/www/v2/boutique/index_boutique2.php on line 42
Ordinateur
Warning: Cannot use a scalar value as an array in /homez.33/ifmicro/www/v2/boutique/index_boutique2.php on line 42
Ordinateur
Warning: Cannot use a scalar value as an array in /homez.33/ifmicro/www/v2/boutique/index_boutique2.php on line 42
Ordinateur
Warning: Cannot use a scalar value as an array in /homez.33/ifmicro/www/v2/boutique/index_boutique2.php on line 42
Disque Dur Externe
Warning: Cannot use a scalar value as an array in /homez.33/ifmicro/www/v2/boutique/index_boutique2.php on line 42
Disque Dur Externe

Mon code modifié est le suivant : (ligne 42 indiquée) mais il y a surement d'autre erreurs :\


<?php
require("identification/connexion_sql.php");
$db = mysql_connect($host_db,$login_db,$password_db) or die ("impossible de se connecter a la base".mysql_error());
mysql_select_db($name_db,$db) or die ("base inexistante".mysql_error());
$req = mysql_query("SELECT * FROM groupe_article, s_groupe_article WHERE s_groupe_article.numgroupe = groupe_article.numgroupe ORDER BY groupe_article.numgroupe ASC") or die ("impossible d'effectuer la requête");
$arrayFlag = $req;
while($shopone = mysql_fetch_array($req)){
$nomdugroupe = stripslashes($shopone['nomgroupe']);
$nomsousgroupe = stripslashes($shopone['nomssgroupe']);

if( !isset($arrayFlag[$shopone['numgroupe']])) // On vérifie que le champ n'a pas été déjà affiché
{
    echo $shopone['nomgroupe']; // On l'affiche
    $arrayFlag[$shopone['numgroupe']] = true; // <<<-------LIGNE 42--------------
  }
}


print'<table width="100%" border="0" cellspacing="1" cellpadding="1">
      <tr>
        <th width="14%" scope="col"> </th>
        <th width="86%" scope="col"><a href="formation.php"><strong>
        <div align="left">'.$nomdugroupe.'</div></strong></a></th>
      </tr>
      <tr>
        <th width="14%" scope="col"> </th>
        <th width="86%" scope="col"><div align="left"><a href="maintenance.php" class="textessmenuleft">'.$nomsousgroupe.'</a></div></th>
      </tr>
    </table>';
mysql_close();
?>

Dernière modification par quaresma (06-03-2010 21:46:11)

Hors ligne

#16 06-03-2010 22:32:24

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

$arrayFlag = $req;

Nan c'est pas ça. ^^

L'initialisation doit être à vide et non au résultat du mysql_query qui est une ressource MySQL.

$arrayFlag = array();

C'est un tableau que l'on va remplir, donc s'il n'est pas déjà vide au lancement du script cela pose soucis.

Il ne faudra pas oublier de rajouter l'affichage du nom du sous-groupe. Ce dernier ne pose pas de problème vu qu'il est unique.

Hors ligne

#17 06-03-2010 23:09:50

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

cc!

OK j'ai fait la modification et ca à l'air de fonctionner. MERCI BEAUCOUP.

Cependant, l'affichage n'est pas terrible lorsqu'il y a plusieurs sous-categories dans une catégorie principale.

Comme tu peux le constater : image menu


Voici mon nouveau code des fois que tu pourrais m'aider à améliorer le design wink

<?php
require("identification/connexion_sql.php");
$db = mysql_connect($host_db,$login_db,$password_db) or die ("impossible de se connecter a la base".mysql_error());
mysql_select_db($name_db,$db) or die ("base inexistante".mysql_error());
$req = mysql_query("SELECT * FROM groupe_article, s_groupe_article WHERE s_groupe_article.numgroupe = groupe_article.numgroupe ORDER BY groupe_article.numgroupe ASC") or die ("impossible d'effectuer la requête");

$arrayFlag = array();
while($shopone = mysql_fetch_array($req)){
$nomdugroupe = stripslashes($shopone['nomgroupe']);
$nomsousgroupe = stripslashes($shopone['nomssgroupe']);

if( !isset($arrayFlag[$shopone['numgroupe']])) // On vérifie que le champ n'a pas été déjà affiché
{
    print'<table width="100%" border="0" cellspacing="1" cellpadding="1">
      <tr>
        <th width="14%" scope="col"> </th>
        <th width="86%" scope="col"><a href="formation.php"><strong>
        <div align="left">'.$nomdugroupe.'</div></strong></a></th>
      </tr>';

$arrayFlag[$shopone['numgroupe']] = true;} // On signale qu'on a affiché cette catégorie au moins une fois
   
    print'<tr>
        <th width="14%" scope="col"> </th>
        <th width="86%" scope="col"><div align="left"><a href="maintenance.php" class="textessmenuleft">'.$nomsousgroupe.'</a></div></th>
      </tr>
    </table>';  
 }
mysql_close();
?>

MERKI

Hors ligne

#18 07-03-2010 10:14:02

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

Cela vient du fait que tu fais plusieurs table je pense.
Ton table doit s'ouvrir au dessus de la boucle while et se fermer en dessous. Tu n'auras donc plus que des tr et des td à l'intérieur.
Ainsi tout sera aligné.

Hors ligne

#19 07-03-2010 10:37:38

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

Salut,

un GRAND GRAND MERCI, sans toi je n'y serai pas arrivé! Tout est pafait !

A une prochaine fois sûrement car la boutique n'est pas finie smile

Je te souhaite une bonne continuation et un bon dimanche wink

Hors ligne

#20 07-03-2010 11:33:52

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Requête pour afficher menu ?

Oh non c'est loin d'être parfait. ^^

Niveua requête il y a à revoir, mais je ne suis pas expert là dedans.
Ce que je pourrais te faire remarquer c'est :
- SELECT * => à remplacer par tous les champs que tu prends et ce même s'ils te les faut tous
- la jointure doit se faire avec JOIN depuis plusieurs années

Hors ligne

#21 07-03-2010 11:53:17

quaresma
Membre
Inscription : 10-05-2009
Messages : 42

Re : Requête pour afficher menu ?

Je n'ai pas une formation de dev, je suis responsable technique.

Mais en ce moment, je suis sur la boutique de notre agence smile

dur dur ^^
Je fais ce que je peux wink

Hors ligne

Pied de page des forums