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 -
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]
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:
- Probleme php avec select
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Php alert ✓ - Forum PHP
- Please select boot device - Forum Windows 7
- Reboot and select proper boot device - Forum Windows
22 réponses
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 :) )
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 :) )
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...
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ?
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 ?
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 !
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 !
Non, c'est celle-là :
SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=\'' . $_GET['modifier_fiche']
SELECT * FROM fiches_infos, fiches_auteur, fiches_niveau, fiches_categories WHERE id=\'' . $_GET['modifier_fiche']
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
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
Bonjour,
Le problème se situe dans ce bout de code :
Voilà ce que je te propose :
Xavier
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
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 :)
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 :)
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
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
^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~
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~
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.
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.
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
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
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
Comprends pas.
Patrice
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~
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~
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 :
donc logiquement il récupère bien les variables...
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...
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
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
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
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
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 :))))))))
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 :))))))))