Probleme php avec select

Résolu/Fermé
ritepac Messages postés 14 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 - 22 août 2007 à 10:44
ritepac Messages postés 14 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 - 22 août 2007 à 13:32
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]

22 réponses

Mcmurphy Messages postés 115 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 28 août 2008 7
22 août 2007 à 10:50
Désolé mais je n'est pas comprit ton probléme!!!
2
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 août 2007 à 11:42
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 mercredi 20 juin 2007 Statut Membre Dernière intervention 26 janvier 2012 6
22 août 2007 à 11:50
Après revu du code de reivax, il ne devrait y avoir aucun problème :/
1
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 août 2007 à 11:51
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 11:59
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 août 2007 à 12:02
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 août 2007 à 12:09
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 12:09
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 août 2007 à 10:57
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 10:57
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 août 2007 à 10:58
(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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 10:59
mici reivax je test ton code :) et reviens aux nouvelles :)
0
ritepac Messages postés 14 Date d'inscription mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 11:35
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 mercredi 20 juin 2007 Statut Membre Dernière intervention 26 janvier 2012 6
22 août 2007 à 11:39
^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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 août 2007 à 11:49
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 11:41
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 11:43
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 mercredi 20 juin 2007 Statut Membre Dernière intervention 26 janvier 2012 6
22 août 2007 à 11:45
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 11:53
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 12:04
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 12:12
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 mercredi 22 août 2007 Statut Membre Dernière intervention 22 août 2007 2
22 août 2007 à 12:18
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