IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

problème de requête


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    546
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 546
    Par défaut problème de requête
    Bonjour à toutes et tous,

    J'ai deux tables menus et contenus :

    CREATE TABLE menus (id_menu INT not null AUTO_INCREMENT, lib_menu VARCHAR (100) NOT NULL, id_parent INT, image_menu VARCHAR (100), url_page VARCHAR (100), ordre_menu INT, PRIMARY KEY (id_menu));

    CREATE TABLE contenu (id_contenu INT not null AUTO_INCREMENT, categorie VARCHAR (100) NOT NULL, nom_lien VARCHAR (40), photo_contenu VARCHAR (40), lieu VARCHAR (40), titre VARCHAR (40), dateetnbrepage VARCHAR (20), editeur VARCHAR (40), texte TEXT, ordre_contenu INT, PRIMARY KEY (id_contenu));


    Sur mon site, j'ai un menu à gauche qui correspond à la table menus, dont voici le code PHP/SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <div id="menu">
    <?php
    require("identification/connexion_sql.php");
    // on attaque le php ici
    // dans un premier temps on recupere les menus de niveau 1 donc ceux qui ont l'id_parent egal a 0
    $req1 = "SELECT id_menu, lib_menu FROM menus WHERE id_parent='0' ORDER BY ordre_menu" or die ("impossible d'effectuer la requête");
    $rep1 = mysql_query($req1);
    while($row1 = mysql_fetch_array($rep1)) {
     
    // on affiche le menu de niveau 1
    echo "<div class=\"menu\" id=\"menu".$row1['id_menu']."\" onclick=\"afficheMenu(this)\"><a href=\"#\">".$row1['lib_menu']."</a></div><br>\n";
    // ensuite on fait une seconde requete pour chercher les sous menus de ce niveau, s'il y en a on les affiche, sinon on ne fait rien
     
    $req2="SELECT id_menu, lib_menu FROM menus WHERE id_parent='".$row1['id_menu']."' ORDER BY ordre_menu"  or die ("impossible d'effectuer la requête");
    $rep2=mysql_query($req2);
    $nb2=mysql_num_rows($rep2);
    if (isset($nb2) && $nb2>0) {
     
    echo "<div id=\"sousmenu".$row1['id_menu']."\" style=\"display:none\"><br>\n";
    while ($row2=mysql_fetch_array($rep2)) {
    $num = $row2['id_menu'];
    $lib = htmlentities($row2['lib_menu']);
    print '<div class="sousmenu"><a href="contenu.php?num='.$num.'&lib='.$lib.'">'.$lib.'</a></div><br>';
    }
    echo "</div>\n";
     
    }
    }
    ?>
    </div>

    Lorsque je clique sur un un lien du sous-menu, je vais vers une page nommée contenu.php? pour laquelle je transmets des variables ($num et $lib)

    Cette page contenu.php devrait afficher les noms des liens correspondant au sous-menu cliqué, mais j'ai un soucis dans la requête de cette page.

    Voici le code PHP/SQL qui ne fonctionne pas. Je n'ai pas d'erreur, tout simplement lorsque je clique sur un lien du sous-menu le contenu correspondant ne s'affiche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    $ca = htmlentities($_GET['lib']);
    $idm = $_GET['num'];
    require("identification/connexion_sql.php");
     
    $requete = "Select id_contenu, nom_lien, categorie FROM contenu, menus WHERE contenu.categorie = (SELECT lib_menu FROM menus WHERE menus.lib_menu='$ca') ORDER BY contenu.ordre_contenu";
    $reponse = mysql_query($requete) or die ("impossible d'effectuer la requête");
    while($affiche = mysql_fetch_array($reponse)) {
    $liencontenu = htmlentities($affiche['nom_lien']);
    $id_contenu = $affiche['id_contenu'];
     
    print '<div id="lien" class="lien"><a href="fiche.php?id='.$id_contenu.'&nomlien='.$liencontenu.'" class="lien">'.$liencontenu.'</a></div>';
     
    }
    mysql_close();
    ?>
    Pour mieux comprendre, voici la page où je fais les tests : http://www.la-grange-sardieres.fr/si...tation2css.php

    Merci beaucoup pour votre aide.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Par défaut
    bonjour,
    déjà, mets un \r\n derrière tes affichages; cela facilitera la lecture du code source renvoyé
    print '<div id="lien" class="lien"><a href="fiche.php?id='.$id_contenu.'&nomlien='.$liencontenu.'" class="lien">'.$liencontenu.'</a></div>';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print '<div id="lien" class="lien"><a href="fiche.php?id='.$id_contenu.'&nomlien='.$liencontenu.'" class="lien">'.$liencontenu.'</a></div>\r\n';

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Tu as à mon sens fait une erreur de conception au niveau de la table "contenu".
    Pour qu'un contenu soit lié à un menu, table "menus" (ou sous menu, peu importe), il faudrait non pas utiliser le champ "categorie", mais le champ "id_menu".

    Théoriquement, comme ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE contenu (
    id_contenu INT NOT NULL AUTO_INCREMENT,
    id_menu INT(11) NOT NULL,
    nom_lien VARCHAR (40),
    photo_contenu VARCHAR (40),
    lieu VARCHAR (40), titre VARCHAR (40),
    dateetnbrepage VARCHAR (20), editeur VARCHAR (40),
    texte TEXT,
    ordre_contenu INT,
    PRIMARY KEY (id_contenu)
    );
    Il n'est pas utile d'avoir le champ "categorie", le libellé du menu au finale.
    C'est l'ID du menu qui est la clé étrangère de la table "menus", qui dans cette dernière correspond à la clé primaire.
    C'est ainsi que ces 2 tables seront véritablement liées.


    Ensuite, au niveau des liens du menu pointant vers la page contenu.php, il suffit de mettre "id_menu" comme paramètre dans l'URL, c'est tout.

    Au niveau de la page contenu.php, récupérer cet "id_menu" en GET, et faire la requête suivante :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select c.id_contenu, c.nom_lien, m.lib_menu
    FROM contenu AS c
    JOIN menus AS m ON c.id_menu = m.id_menu
    WHERE m.id_menu = (int)$_GET['num']
    ORDER BY c.ordre_contenu
    Il n'est plus utile de transmettre le libelle du menu (categorie), il s'obtient grâce à la jointure entre les 2 tables.


    Et concernant les liens vers fiche.php, il n'est pas utile de mettre "nomlien" en paramètre, l'id_contenu suffit, la requête permettra de récupérer la valeur du "nomlien".
    Evite de transmettre des données superflux, juste l'essentiel, la Bdd, si elle est bien conçue fera le reste.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    546
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 546
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Salut

    Tu as à mon sens fait une erreur de conception au niveau de la table "contenu".
    Pour qu'un contenu soit lié à un menu, table "menus" (ou sous menu, peu importe), il faudrait non pas utiliser le champ "categorie", mais le champ "id_menu".
    D'accord, mais cela m'oblige a renseigner l'id_menu dans la table contenu manuellement ?? Car dans la table menus il est en auto-increment.
    C'est embêtant pour la personne à qui je fais le site, surtout lorsqu'elle voudra ajouter des liens dans la zone blanche du milieu. non ??

    -------

    J'ai remarqué sur ma page des caractères bizarres : 

    C'est quoi ??

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    D'accord, mais cela m'oblige a renseigner l'id_menu dans la table contenu manuellement ?? Car dans la table menus il est en auto-increment.
    C'est embêtant pour la personne à qui je fais le site, surtout lorsqu'elle voudra ajouter des liens dans la zone blanche du milieu. non ??
    Manuellement ?
    Non, tout devra et pourra se faire automatiquement.
    Pour l'auto_increment, celui ci est juste au niveau de la table "menu", et au niveau de la table "contenu", c'est un INT, sans plus comme j'ai mis dans le code plus haut.

    Par contre, pour ceux qui sont déjà créés par exemple, on va dire que le mal est déjà fait, et en espérant qu'il n'y ait pas énormément d'enregistrements, faire une correction manuellement c'est souvent aussi simple, voir plus rapide.
    Mais à l'usage, tout pourra se faire automatiquement.

    Je ne sais pas comment tu prévois de gérer les enregistrements de cette table "menus" et "contenu", mais pour la table "menus", rien ne change.
    Pour la table "contenu" (pure exemple bien sûr), lorsqu'on crée un nouveau contenu, on peu prévoir de mettre un menu déroulant, une liste des menus pour justement permettre de choisir le menu (menu_id) auquel il appartiendra.
    Lors de la validation, on récupérera non seulement ce qui concernera le contenu en question, mais aussi cet id_menu, qui au final sera enregistré dans la table "contenu".
    Si tu regarde bien, il n'y a pas grand chose qui diffère.

    Pour une modification d'un contenu déjà existant, c'est aussi le même principe.
    Il faudra rajouter dans le formulaire de modification l'id_menu auquel appartient le contenu.
    On peu aussi proposer (comme pour un nouvel enregistrement) un menu déroulant des différents menus, mais comme on sait à quel menu le contenu appartient, on peu pré-sélectionner (selected).
    Ca offrira la possibilité de changer le contenu de menu par exemple.


    Je ne sais pas si mes explications sont bonnes, si tu visualise bien.
    En tout cas, je comprends que lorsque les choses sont déjà faites, les modifier c'est embêtant, mais je t'assure que c'est ainsi que 2 tables liées se conçoives.


    J'ai remarqué sur ma page des caractères bizarres : 

    C'est quoi ??
    Tu as oublié de poser la question à GG.
    http://www.paris-beyrouth.org/tutori...pour-php-utf-8
    C'est le BOM, et il te faut le supprimer, et pour ça regarde au niveau de ton éditeur, et modifier tous les fichiers en précisant sans BOM, idem pour la création de nouveau fichiers.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    546
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 546
    Par défaut
    Merci beaucoup pour ton aide, j'avance bien.

    Par contre, j'ai un autre soucis à présent.

    Si tu vas sur le lien du site que je t'ai donné, dans le premier menu, si tu cliques sur "théâtre" et ensuite sur "399 secondes" tu peux voir apparaitre dans la fenêtre de droite un texte avec un caractère bizarre : �, à la place des apostrophes, des points , etc.

    Sais-tu d'où cela pourrait venir ?? J'utilise la police Garamond pour information, mais avec l'Arial c'est pareil.

    Merci encore et bonne soirée

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    tu peux voir apparaitre dans la fenêtre de droite un texte avec un caractère bizarre
    La aussi tu as oublié GG.
    Fait le point par rapport à ça : Comment utiliser de l'UTF-8 avec PHP / MySQL ?

    J'utilise la police Garamond pour information, mais avec l'Arial c'est pareil.
    Attention aux polices quelques peu spécifiques, ne perds pas de vu que le coté client, le navigateur, (les gens qui sont face) est quasi inconnue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/08/2003, 15h32
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 16h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 14h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo