Probleme php avec select

Résolu
Bonjour,

J'ai un soucis avec les select en php. En fait je suis sur une admin de site en php avec BDD mysql.

J'ai une page liste_fiche.php qui me sort la liste des enregistrments avec les éléments voulus. Ici pas de soucis

J'ai une page rédiger_fiche.php avec des select, text area etc. Ici pas de soucis quand j'ajoute une nouvelle fiche.

Le problème est que que je suis sur liste_fiche.php, et que je clique sur modifier, il va a la page rediger_fiche.php sur la fonction modifier. Il récupère le titre, le contenu, description de la fiche sans soucis mais j'ai 3 select et je n'arrive pas à faire en sorte qu'il affiche la valeur du <select> sélectionné.

Le code de la page rediger_fiche.php : récupératin des variables
[code]
if (isset($_GET['modifier_fiche'])) // Si on demande de modifier une fiche
{
// On protège la variable "modifier_fiche" pour éviter une faille SQL
$_GET['modifier_fiche'] = mysql_real_escape_string(htmlspecialchars($_GET['modifier_fiche']));
// On récupère les infos de la correspondante
$retour = mysql_query('SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=\'' . $_GET['modifier_fiche'] . '\'');
$donnees = mysql_fetch_array($retour);

// On place les elements du formulaire dans des variables simples
$id_cat = stripslashes($donnees['id_cat']);
$timestamp = stripslashes($donnees['timestamp']);
$categorie = stripslashes($donnees['categorie']);
$id_niveau = stripslashes($donnees['id_niveau']);
$niveau = stripslashes($donnees['niveau']);
$nom = stripslashes($donnees['nom']);
$prenom = stripslashes($donnees['prenom']);
$id_auteur = stripslashes($donnees['id_auteur']);
$titre = stripslashes($donnees['titre']);
$description = stripslashes($donnees['description']);
$plansdecours = stripslashes($donnees['plansdecours']);
$exercices = stripslashes($donnees['exercices']);
$conseils = stripslashes($donnees['conseils']);
$id_fiches = $donnees['id']; // Cette variable va servir pour se souvenir que c'est une modification
}
[/code]

Le code de la page rediger_fiche.php : balise select :
[code]
<?php
echo '<select size=1 name="id_cat">'."\n";
$result = mysql_query("SELECT id_cat, categorie FROM fiches_categories" );
while($data = mysql_fetch_array($result))
{
echo '<option value="'.$data['id_cat'].'" selected>'.$data['categorie'];
echo '</option>'."\n";
}
echo '</select>'."\n";

?>
[/code]
Configuration: Windows 2000
Internet Explorer 6.0

22 réponses

  1. Désolé mais je n'est pas comprit ton probléme!!!
    1. lol reivax, déjà que tu comprennes mon soucis, je trouve cela très fort :) alors merci de ton aide :)

      patrice
      1. Oui voilà !
        C'est exactement ce que je pensais.

        Cool :)

        Et désolé d'avoir mis du temps à tilter :p

        Xavier
        1. re :) résolu. En fait tu avais raison, me manquait des éléments dans ma requête SQL :

          ce qui était avant :
          $retour = mysql_query('SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=\'' . $_GET['modifier_fiche'] . '\'');

          ce qui fonctionne :
          $retour = mysql_query('SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE fiches_infos.id_auteur = fiches_auteur.id_auteur AND fiches_infos.id_niveau = fiches_niveau.id_niveau AND fiches_infos.id_cat = fiches_categories.id_cat AND id=\'' . $_GET['modifier_fiche'] . '\'');

          mici bcp :))))))))
          1. sur ma page qui liste les enregistrements et qui fonctionne, la requete est celle-ci :

            SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE fiches_infos.id_auteur = fiches_auteur.id_auteur AND fiches_infos.id_niveau = fiches_niveau.id_niveau AND fiches_infos.id_cat = fiches_categories.id_cat

            Faut-il que j'utilise la même mais il faut bien que je récupère l'ID de la fiche pour savoir que c'est celle-là qui est modifié et pas une autre.

            Je me perds ... vas-y lance moi une pagaye :)

            patrice
            1. alors j'ai essayé cette requete-ci dans SQL :

              SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=2

              Il me sort le même enregsitrement pour tous les niveaux, tous les auteurs et toute les catégories en fait. Donc, il faut que je fasse cela ?

              SELECT fiches_infos.id_cat, fiches_infos.id_niveau, fiches_infos.id_auteur, fiches_auteur.id_auteur, fiches_auteur.nom, fiches_auteur.prenom, fiches_niveau.id_niveau, fiches_niveau.niveau, fiches_categories.id_cat, fiches_categories.categorie FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=2

              Pour info, l'id est dans ma table fiches_infos, création d'un ID unique lors de la création d'une fiche.

              patrice
              1. Non, c'est celle-là :
                SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=\'' . $_GET['modifier_fiche']
                1. quand je regarde le code source de la page rédiger, il me met selected sur la première option, comme si il ne prenait pas du tout en compte la chose.

                  Pour la requete SQL, je l'ai essayé dans SQL, il n'y a pas de soucis il me sort bien les deux enregistrment de la table fiche_catégories

                  Est-ce cette requete là qui ne te plait pas ?
                  SELECT id_cat, categorie FROM fiches_categories

                  patrice
                  1. Non, ce n'est pas ça.
                    Je pense que c'est ta requête qui ne va pas.
                    Déjà, dans ta description des tables, je ne vois pas de champ "id". Alors que dans ton where, tu l'utilises...

                    Essaie de faire un test de ta requête et d'afficher directement le résultat, pour voir ce que ça donne !
                    1. mmmh.... d'après toi il faut que je fass la jointure juste avant la boucle (quand je récupère les variables) ?

                      du style pour categories :

                      <?php
                      echo '<select size=1 name="id_cat">'."\n";
                      $result = mysql_query("SELECT fiches_infos.id_cat, fiches_categories.id_cat, fiches_categories.categorie FROM fiches_categories, fiches_infos" );
                      while($data = mysql_fetch_array($result))
                      {
                      if ($data['id_cat'] == $id_cat)
                      $selected = "selected";
                      else
                      $selected = "";
                      echo '<option value="'.$data['id_cat'].'" selected="'.$selected.'">'.$data['categorie'];
                      echo '</option>'."\n";
                      }
                      echo '</select>'."\n";

                      ?>

                      et donc pour la balise selected, c'est bien comme ci-dessus ?
                      1. pour l'auteur cela ne change rien. En fait je pense que le soucis est autre part, je m'explique :

                        j'ai 4 tables :
                        table fiches_auteur
                        - id_auteur
                        - nom
                        - prenom

                        tables fiches_categories
                        - id_cat
                        - categorie

                        table fiches_niveau
                        - id_niveau
                        - niveau

                        table fiches_infos
                        - id_cat
                        - id_niveau
                        - id_auteur
                        - titre ....

                        Et dans ma page rédiger_fiche.php, j'affiche avec la boucle while (que tu m'as retravaillé) les éléments de chaque table. Pour moi, il doit récup les différents id de chaque tables et le mettre dans la table fiches_infos.

                        au dessus des boucles, j'ai :
                        <?php   
                        if (isset($_GET['modifier_fiche'])) // Si on demande de modifier une fiche
                        {       
                            // On protège la variable "modifier_fiche" pour éviter une faille SQL
                            $_GET['modifier_fiche'] = mysql_real_escape_string(htmlspecialchars($_GET['modifier_fiche']));
                            // On récupère les infos de la correspondante
                            $retour = mysql_query('SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=\'' . $_GET['modifier_fiche'] . '\'');
                            $donnees = mysql_fetch_array($retour);
                                
                            // On place les elements du formulaire dans des variables simples        
                            $id_cat =  stripslashes($donnees['id_cat']);
                            $timestamp =  stripslashes($donnees['timestamp']);
                            $categorie =  stripslashes($donnees['categorie']);
                            $id_niveau =  stripslashes($donnees['id_niveau']);
                            $niveau =  stripslashes($donnees['niveau']);
                            $nom = stripslashes($donnees['nom']);
                            $prenom = stripslashes($donnees['prenom']);
                            $id_auteur =  stripslashes($donnees['id_auteur']);
                            $titre = stripslashes($donnees['titre']);
                            $description = stripslashes($donnees['description']);
                            $plansdecours = stripslashes($donnees['plansdecours']);
                            $exercices = stripslashes($donnees['exercices']);
                            $conseils = stripslashes($donnees['conseils']);
                            $id_fiches = $donnees['id'];  // Cette variable va servir pour se souvenir que c'est une modification
                        }
                        

                        donc logiquement il récupère bien les variables...
                        1. A la reflexion, je trouve ta requête SQL étrange.
                          As-tu essayé de l'exécuter dans phpmyadmin par exemple, ou ailleurs, pour voir exactement quels sont les résultats qu'elle renvoit ? Il me semble que tu fais un produit cartésien et non une jointure...
                          1. le problème survient quand tu modifies? Donc, quand tu valides ton formulaire?

                            Si c'est bien cela, cela doit être soit pendant la récupération des données que ça plante, soit quand tu entres les infos dans MySQL..

                            Ou alors... Pourrais-tu aller sur la page de formulaire, puis voir source et poste ici le formulaire, peut-être qu'au lieu de mettre une valeur différente dans chaque "value", il met la valeur initiale.

                            ~W~
                            1. bon ben je viens de remettre ton code... il n'ya pas moyen, il reste figé sur le premier de chaque select.

                              Comprends pas.

                              Patrice
                              1. Non, il n'y a pas de raison...
                                C'est bizarre...
                                Si tu affiches le code source de ta page, comment est défini ce <select> ? Surtout, comment sont placés les selected="" ?

                                Sinon, tu peux essayer de placer, à la place de $data[nom].' '.$data[prenom], une aide pour débuguer (de façon temporaire bien sûr), et mettre en fait : $id_auteur . ' / ' . $data['id_auteur'] comme ça tu verras directement où est le problème !

                                Xavier

                                (PS : pour mettre un code, ce n'est pas [code], mais $lt;code> qu'il faut utiliser :) )
                                1. Bon en fait cela ne fonctionne pas... j'ai fais plusieurs essais. C'est vraiment à son bon vouloir.

                                  j'ai :
                                  id_cat = 1
                                  categorie = guitare
                                  id_niveau = 1
                                  niveau = debutant
                                  id_auteur = 1
                                  nom = berer
                                  prenom = louis

                                  et

                                  id_cat = 2
                                  categorie = batterie
                                  id_niveau = 2
                                  niveau = confirmé
                                  id_auteur = 2
                                  nom = Pierre
                                  prenom = jean

                                  quand il affiche la liste, c'est nikel, il me met les bons id respectifs et les bonnes catégories respectives mais quand je modifie, pas moyen, desfois, c'est niveau 2 alors que c'est 1... je ne capte pas :/

                                  patrice
                                  1. ^Holà!

                                    Juste pour info:

                                    <option value="'.$data['id_auteur'].'" selected="'.$selected.'">

                                    ^ cela n'existe pas, cela doit être:

                                    <option value="'.$data['id_auteur'].'" '.$selected.'>

                                    A+

                                    ~W~
                                    1. Définitivement, non.
                                      La vraie bonne syntaxe est celle donnée par reitepac :
                                      <option selected="selected">
                                      En XML, et donc en XHTML, les attributs sont forcément de la forme nom="valeur". Il ne peut pas y avoir d'attribut n'ayant qu'un nom. HTML le permet car il est laxiste par rapport aux normes HTML, mais ce n'est pas le cas du XHTML.
                                  2. re :)

                                    Alors ton code fonctionne presque bien :

                                    En fait si je le mets tel quel il ne change rien, il faut que je rajoute :

                                    echo '<option value="'.$data['id_niveau'].'" selected="'.$selected.'">'.$data['niveau'];

                                    selected = dans la valeur.

                                    Ca marche pour deux de mes 3 <select> mais la troisième pas moyen :

                                    [code]
                                    <?php
                                    echo '<select size=1 name="id_auteur">'."\n";
                                    $result = mysql_query("SELECT id_auteur, nom, prenom FROM fiches_auteur" );
                                    while($data = mysql_fetch_array($result))
                                    {
                                    if ($data['id_auteur'] == $id_auteur)
                                    $selected = "selected";
                                    else
                                    $selected = "";
                                    echo '<option value="'.$data['id_auteur'].'" selected="'.$selected.'">'.$data['nom']. ' ' .$data['prenom'];
                                    echo '</option>'."\n";
                                    }
                                    echo '</select>'."\n";
                                    ?>
                                    [/code]

                                    Je pense que le fait d'avoir $data['nom'] et $data['prenom'] met le boxon. Penses-tu que cela est possible ?

                                    mici
                                    • 1
                                    • 2