[Résolu] Listes déroulantes liées... hum

Eléphant du PHP | 78 Messages

18 sept. 2007, 10:45

Me revoilà.
Je me suis intéressé de près au tutoriel de Cyrano http://www.phpfrance.com/forums/voir_sujet-4562.phpet... je le trouve tip top.

Mon hic est donc assez simple dans la mesure où d'une part je ne veux, non pas afficher les valeurs numériques des départements et régions, mais plutôt le nom.
Décidément ça fait des jours que je bataille pour ça et point de solution je ne trouve. Même en faisant le poirier, Le seul résultat a été de me mélanger tout le code dans mon piti cerveau :lol: .

Bref, je souhaiterais aussi tout simplement récupérer cette variable affichée : le nom du département et celui de la région, pour les insérer dans une base de données.
J'arrive à faire un formulaire hyper simple "Test-liste_deroulante_170907.php" avec liste déroulante normale et à récupérer les variables dans un autre fichier "Test_liste_deroulante_170907_resultat.php; et même insérer ce résultat dans ma bdd... imaginez comme je suis heureux d'arriver à faire ça.
En bref si l'un d'entre vous pourrait me mettre sur la voie, je le remercierais chaudement.

Merci par avance
Ci-dessous mes deux fichiers :

Test-liste_deroulante_170907.php

Code : Tout sélectionner

<form action="Test_liste_deroulante_170907_resultat.php" method="Post"> <select name="produit"> <option value="DC Shoes"> Destinataire A</option> <option value="Gotcha"> Destinataire B</option> <option value="Hawk"> Destinataire C</option> <option value="Quiksilver"> Destinataire D</option> <option value="Rossignol"> Destinataire <E/option> <option value="Roxy"> Destinataire F</option> </select> <input type="submit" name="ok" id="ok" value="Envoyer" /> </form>
Test_liste_deroulante_170907_resultat.php
$host = "127.0.0.1"; 
$user   = "root"; 
$pass     = ""; 
$bdd    = "expeditions";
$table = "test";
// connexion
@mysql_connect($host,$user,$pass)
   or die("Impossible de se connecter");
@mysql_select_db("$bdd")
   or die("Impossible de se connecter");

if(isset($_POST['produit']))      $produit=$_POST['produit'];
else      $produit="";

echo $produit ;
	  
 // on écrit la requête sql 
    $sql = "INSERT INTO test (Id_Test, test_nom) "; 
	$sql .= " VALUES('','$produit')"; 

	// insertion des informations du formulaire dans la table 
    mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

	    mysql_close();  // on ferme la connexion 
Modifié en dernier par albatross le 21 sept. 2007, 09:47, modifié 1 fois.

d0m
Mammouth du PHP | 1141 Messages

18 sept. 2007, 10:57

Je ne vois pas d'où vient ton problème, dans la base il y a le nom associé à chaque département ou région.
Avec une simple requete utilisant les numéros sélectionnées dans les listes tu peux aller chercher les noms associés.

Un petit conseil en passant :
- pour tes requetes, sort les variables php de tes chaines
$sql = "INSERT INTO test (Id_Test, test_nom) "; 
$sql .= " VALUES('','$produit')";

//mieux :
$sql = "INSERT INTO test (Id_Test, test_nom) "; 
$sql .= " VALUES('','". $produit . "');";
ensuite pour récupérer les départements et région, tu utilises toujours la variable POST avec le nom de la liste déroulante. Tu y récupère les numéros et à l'aide de requête tu récupères les noms.
Mais pourquoi ne pas stocker les départements sous forme numérique et faire le lien avec les tables quand tu as besoin du nom?

ViPHP
AB
ViPHP | 5818 Messages

18 sept. 2007, 13:08

Un petit conseil en passant :
- pour tes requetes, sort les variables php de tes chaines
$sql = "INSERT INTO test (Id_Test, test_nom) "; 
$sql .= " VALUES('','$produit')";

//mieux :
$sql = "INSERT INTO test (Id_Test, test_nom) "; 
$sql .= " VALUES('','". $produit . "');";
Tant qu'à proposer une optimisation pour l'insertion, autant aller jusqu'au bout et conseiller l'utilisation de mysql_real_escape_string() :wink:

Eléphant du PHP | 78 Messages

18 sept. 2007, 14:36

Ok, merci.
Je m'y attelle et vous tiens au courant.

Bon ben ma requête est pas terribeul :
$sql="SELECT `ìd_produit`, `nom_produit`". 
        " FROM `produit`". 
        " WHERE `id_produit` = ". $idr ."";
echo ($nom_produit);
avec cette requête il me donne comme erreur :

Code : Tout sélectionner

Erreur SQL !SELECT `ìd_produit`, `nom_produit` FROM `produit` WHERE `id_produit` = 3 Champ 'ìd_produit' inconnu dans field list
le 3 venant de ma troisième occurence dans la liste.
Ce qui est étonnant ci-dessus vient du fait que j'ai bien dans ma base un champ 'id_produit' et l'autre champ étant 'nom_produit'... :cry:

Si j'utilise la requête suivante :
$sql   =  "SELECT `id_force`, `nom_force`". 
        " FROM `force`". 
       " WHERE `id_produit` = ". $idr ."". 
      " ORDER BY `id_force`;"; 

		echo ($nom_force); 

Là il m'affiche juste "Array".
Je comprends pas trop pourquoi il y a un souci avec un tableau.

Merci.

Eléphant du PHP | 78 Messages

20 sept. 2007, 09:39

Je ne vois pas d'où vient ton problème, dans la base il y a le nom associé à chaque département ou région.
Avec une simple requete utilisant les numéros sélectionnées dans les listes tu peux aller chercher les noms associés.
Je comprends pas ; j'essaie tout plein de requêtes, style celle-ci :
$sql = 'SELECT `id_force` , `nom_force` '
        . ' FROM `force` '
        . ' WHERE id_produit = 3 LIMIT 0, 30';  
		
	echo ($nom_force); 
J'ai bien testé cette requête mysql et elle me retourne bien tous les noms_force et id_force corrrespondant à l'id_produit "3".
mais dans mon fichier, elle n'affiche que "Array".

Quand je valide le choix des listes, j'ai bien l'affichage suivant :
Vous avez sélectionné le destinataire 126 du produit 4
mais impossible d'afficher le nom correspondant au destinataire "126" et au produit "4".
Merci mille fois à l'âme charitable pour m'éclairer, car la ça me fout la déprime. Je pense que je vais être totally grisonnant avant l'âge :cry:
Allez petit bonus, Merci dans des langues exotiques :
-ngiyabonga (zulu)
-asante (Swahili)
- takk fyrir (Islandais)
-dankon (esperanto)
-Hvala (Croate)
-tapadh leat (Gaëlique Ecossais)

J'avais pas mieux pour les remerciements, mais c'est déjà pas mal. :?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 sept. 2007, 11:33

Array c'est un tableau.
Si quand tu affiches ta variable php écrit "array", c'est que ta variable est un tableau.
Si tu veux afficher le contenu d'un tableau il faut le parcourir et afficher les valeurs souhaitées.

Utilise print_r() ou var_dump() sur ta variable. Tu verras ainsi ce que contient ton tableau, ce qui devrait te permettre de savoir comment le parcourir (s'il est indéxé, à plusieurs dimensions, etc.)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 78 Messages

20 sept. 2007, 12:00

Array c'est un tableau.
Si quand tu affiches ta variable php écrit "array", c'est que ta variable est un tableau.
Si tu veux afficher le contenu d'un tableau il faut le parcourir et afficher les valeurs souhaitées.

Utilise print_r() ou var_dump() sur ta variable. Tu verras ainsi ce que contient ton tableau, ce qui devrait te permettre de savoir comment le parcourir (s'il est indéxé, à plusieurs dimensions, etc.)
Je vois ça et te tiens informé de l'évolution.
Ce que je trouve étrange quand même c'est que la requête marche dans mysql.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 sept. 2007, 12:12

Ca n'a rien d'étrange.. ca n'a juste aucun rapport :) Un code php peut très bien fonctionner même si une requête plante, tout comme une requête peut être correcte et le code php qui suit complètement erroné :)

Vérifies que :
- tu exécutes bien ta requête avec un mysql_query()
- l'exécution a fonctionné avec un mysql_error()
- tu récupères bien les résultats avec mysql_fetch_*() ? (*_assoc te retournant un tableau associatif, *_row un tableau indexé, *_array un tableau avec index et libellés, et *_object un objet)
- tu parcours bien le tableau ou l'objet récupéré pour en afficher les valeurs ?

Et si tu arrives jusqu'ici, bah ton code a du fonctionner ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 78 Messages

20 sept. 2007, 12:20

Ca n'a rien d'étrange.. ca n'a juste aucun rapport :) Un code php peut très bien fonctionner même si une requête plante, tout comme une requête peut être correcte et le code php qui suit complètement erroné :)

Vérifies que :
- tu exécutes bien ta requête avec un mysql_query()
- l'exécution a fonctionné avec un mysql_error()
- tu récupères bien les résultats avec mysql_fetch_*() ? (*_assoc te retournant un tableau associatif, *_row un tableau indexé, *_array un tableau avec index et libellés, et *_object un objet)
- tu parcours bien le tableau ou l'objet récupéré pour en afficher les valeurs ?

Et si tu arrives jusqu'ici, bah ton code a du fonctionner ;)
Merci Ryle.
Je vosi ça dans la journée !
That's good to have helpful people on this forum... mainly for newbies 8-)

Ayé voici mon code :
	  if (isset($_POST['nom_force']))	$nom_force=$_POST['nom_force'];
	  echo $nom_force="";




$sql = 'SELECT `id_force` , `nom_force` '
        . ' FROM `force` '
        . " WHERE `id_produit` = ". $idr ."";  
		 

		  
		//echo ($force); 		 

	$rs = mysql_query($sql) or die (mysql_error(). ": <br :>".$sql);
while($val = mysql_fetch_array($rs)) 
{
	echo "<BR>".$val["nom_force"]."<BR>";
}

Donc j'ai bien utilisé ce coup-ci mysql_query(), mysql_error() ainsi que mysql_fetch_array().
Donc en fait j'ai toujours mes listes déroulantes affichées et toutes le détail de celle des forces (qui est celle des départements à l'origine).
Ce que je souhaite est simplement comme dans le message quand on valide le formulaire, de n'avoir qu'un produit (région) et une force (département) affichés et non toute la liste.
Et d'ailleurs si dans ma requête je la modifie en :
$sql = 'SELECT `id_force` , `nom_force`, `id_produit`, `nom_produit` '
        . ' FROM `force` , `produit`'
        . " WHERE `id_produit` = ". $idr ."";
Cela m'indique que `id_produit`est ambigu.

Bon cela dit, j'ai progressé comparé au début de ce post, mais j'aimerais simplement affiner cela.


Bon dernières nouvelles sur mes listes déroulantes.
Je garde ça sur le bras, mais comme le but premier était de me servir de celles-ci pour faire des recherches dans une base avec le moins d'erreurs possibles, je vais plutôt le faire avec un petit moteur de recherche, vu que j'en avais finalisé un grâce à l'aide de certains d'entre vous et que maintenant il marche très bien.
Je clôs donc ce post.
Merci à tous pour votre aide.