Probleme php avec select

Résolu
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -  
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -
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]
A voir également:

22 réponses

Mcmurphy Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   7
 
Désolé mais je n'est pas comprit ton probléme!!!
2
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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
wenijah Messages postés 72 Date d'inscription   Statut Membre Dernière intervention   6
 
Après revu du code de reivax, il ne devrait y avoir aucun problème :/
1
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Non, c'est celle-là :
SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=\'' . $_GET['modifier_fiche']
1
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Le problème se situe dans ce bout de 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";

?>
Tu places "selected" sur TOUS les <option>, alors qu'il ne faudrait le mettre que sur celui qui va bien (donc sur celui qui est identifié par $id_cat).

Voilà ce que je te propose :
<?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))
{
   if ($data['id_cat'] == $id_cat)
      $selected = "selected";
   else
      $selected = "";
   echo '<option value="'.$data['id_cat'].'" '.$selected.'>'.$data['categorie'];
   echo '</option>'."\n";
}
echo '</select>'."\n";

?>
Comme ça, la chaine "selected" ne sera écrite que pour le <option> qui vérifie $data['id_cat'] == $id_cat.

Xavier
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
Alors je récapépète :

Mon soucis est que quand je modifie une fiche, les <select> ne prennent pas par défaut la valeur de la variable transmise.

COncretement :
j'ai une table avec des catégories :
1. guitare
2. batterie
3. saxophone

J'ai une fiche qui appartient à la catégorie : batterie.
Quand je modifie cette fiche, le <select> des catégories affiche par défaut la première valeur qui est dans mon cas : guitare et non batterie. Du coup, à chaque fois que je modifie une fiche, il faut que je resélectionne la catégorie. Donc j'aimerais que quand je clique sur modifier, sur la page rediger_fiche.php, il me sélectionne la catégorie à laquelle appartient cette fiche. Cela marche pour un titre, une description mais les <select> ne veulent pas récupérer la valeur.

Est-ce plu clair ?

Mici d'avance :)
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
(déjà répondu ^^
Je le redis parce que tu n'as peut-être pas vu qu'on a posté presque en même temps)
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
mici reivax je test ton code :) et reviens aux nouvelles :)
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   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
0
wenijah Messages postés 72 Date d'inscription   Statut Membre Dernière intervention   6
 
^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~
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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.
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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
0
wenijah Messages postés 72 Date d'inscription   Statut Membre Dernière intervention   6
 
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~
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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...
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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
0
ritepac Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   2
 
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 :))))))))
0