problème sur listes liées
Posté : 04 nov. 2011, 21:54
Bonjour
J'essaie de construire un formulaire avec 2 listes déroulantes liées.
J'ai bien sûr suivi le tuto du site, mais mon cas de figure est un peu différent :
en choisissant une valeur dans la liste "Propriétés", ça devrait appeler la liste "Valeurs" correspondante, sachant que :
propriété1 (p1) peut prendre les valeurs v1, v2, v3
propriété2 (p2) peut prendre les valeurs v1, v2, v4
propriété3 (p3) peut prendre les valeurs v1, v4, v5
IL y donc des valeurs de la 2ème liste qui peuvent se relier à plusieurs valeurs de la 1ère.
J'ai lu dans un autre forum qu'il fallait créer une 3ème table pour associer mes 2 tables.
J'ai donc fait les requêtes sql suivantes :
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given... dans la ligne :
Warning: mysql_free_result() expects parameter 1 to be resource, boolean given... dans la ligne :
Est-ce que quelqu'un pourrait m'aiguiller vers une solution ?
Merci d'avance !
J'essaie de construire un formulaire avec 2 listes déroulantes liées.
J'ai bien sûr suivi le tuto du site, mais mon cas de figure est un peu différent :
en choisissant une valeur dans la liste "Propriétés", ça devrait appeler la liste "Valeurs" correspondante, sachant que :
propriété1 (p1) peut prendre les valeurs v1, v2, v3
propriété2 (p2) peut prendre les valeurs v1, v2, v4
propriété3 (p3) peut prendre les valeurs v1, v4, v5
IL y donc des valeurs de la 2ème liste qui peuvent se relier à plusieurs valeurs de la 1ère.
J'ai lu dans un autre forum qu'il fallait créer une 3ème table pour associer mes 2 tables.
J'ai donc fait les requêtes sql suivantes :
CREATE TABLE `propriete` (
`id_propriete` tinyint(4) NOT NULL auto_increment,
`propriete` varchar(50) NOT NULL default '',
PRIMARY KEY (`id_propriete`)
);
CREATE TABLE `valeur` (
`id_valeur` tinyint(4) NOT NULL auto_increment,
`valeur` varchar(50) NOT NULL default '',
PRIMARY KEY (`id_valeur`)
);
CREATE TABLE `asso` (
`id_asso` tinyint(4) NOT NULL auto_increment,
`id_propriete` tinyint(4) NOT NULL default '0',
`id_valeur` tinyint(4) NOT NULL default '0',
PRIMARY KEY (`id_asso`),
KEY `id_propriete` (`id_propriete`),
KEY `id_valeur` (`id_valeur`)
);
INSERT INTO `propriete` VALUES (1, 'p1');
INSERT INTO `propriete` VALUES (2, 'p2');
INSERT INTO `propriete` VALUES (3, 'p3');
INSERT INTO `valeur` VALUES (1, 'v1');
INSERT INTO `valeur` VALUES (2, 'v2');
INSERT INTO `valeur` VALUES (3, 'v3');
INSERT INTO `valeur` VALUES (4, 'v4');
INSERT INTO `valeur` VALUES (5, 'v5');
INSERT INTO `asso` VALUES (1, 1, 1);
INSERT INTO `asso` VALUES (2, 1, 2);
INSERT INTO `asso` VALUES (3, 1, 3);
INSERT INTO `asso` VALUES (4, 2, 1);
INSERT INTO `asso` VALUES (5, 2, 2);
INSERT INTO `asso` VALUES (6, 2, 4);
INSERT INTO `asso` VALUES (7, 3, 1);
INSERT INTO `asso` VALUES (8, 3, 4);
INSERT INTO `asso` VALUES (9, 3, 5);
Mon script php est le suivant (c'est celui du tuto de phpfrance adapté) :<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */
$serveur = "######";
$admin = "######";
$mdp = "######";
$base = "######";
/* On récupère si elle existe la valeur de la propriété envoyée par le formulaire */
$idp = isset($_POST['propriete'])?$_POST['propriete']:null;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<title>Listes liées 2</title>
<meta name="description" content="Listes déroulantes dynamiques inter-dépendantes" />
<meta name="keywords" content="" />
<meta name="author" content="Cyrano" />
<meta name="generator" content="Zend Studio Environnement et WebExpert 5" />
<meta http-equiv="imagetoolbar" content="no" />
<meta http-equiv="Pragma" content="no-cache" />
</head>
<body style="font-family: verdana, helvetica, sans-serif; font-size: 85%">
<?php
if(isset($_POST['ok']) && isset($_POST['valeur']) && $_POST['valeur'] != "")
{
$prop_selectionnee = $_POST['propriete'];
$val_selectionnee = $_POST['valeur'];
?>
<p>Sélection de la valeur <?php echo($val_selectionnee); ?> pour la propriété <?php echo($prop_selectionnee); ?></p>
<?php
}
?>
<h3>Associer une liste de valeurs à une propriété choisie</h3>
<?php
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
* car on aura besoin de la connexion un peu plus loin dans le script */
$connexion = mysql_pconnect($serveur, $admin, $mdp);
if($connexion != false)
{
$choixbase = mysql_select_db($base, $connexion);
$sql1 = "SELECT `id_propriete`, `propriete`".
" FROM `propriete`".
" ORDER BY `id_propriete`";
$rech_props = mysql_query($sql1);
$code_prop = array();
$prop = array();
/* On active un compteur pour les propriétés */
$nb_props = 0;
if($rech_props != false)
{
while($ligne = mysql_fetch_assoc($rech_props))
{
array_push($code_prop, $ligne['id_propriete']);
array_push($prop, $ligne['propriete']);
/* On incrémente le compteur */
$nb_props++;
}
}
?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgval">
<fieldset style="border: 3px double #333399">
<legend>Sélectionner une propriété</legend>
<select name="propriete" id="propriete" onchange="document.forms['chgval'].submit();">
<option value="-1">- - - Choisir une propriété - - -</option>
<?php
for($i = 0; $i < $nb_props; $i++)
{
?>
<option value="<?php echo($code_prop[$i]); ?>"<?php echo((isset($idp) && $idp == $code_prop[$i])?" selected=\"selected\"":null); ?>><?php echo($prop[$i]); ?></option>
<?php
}
?>
</select>
<?php
mysql_free_result($rech_props);
/* On commence par vérifier si on a envoyé un numéro de propriété et le cas échéant s'il est différent de -1 */
if(isset($idp) && $idp != -1)
{
/* Création de la requête pour avoir les valeurs correspondant à cette propriété */
$sql2 = "SELECT `id_valeur`, `valeur`".
" FROM `valeur`".
" WHERE `id_propriete` = ". $idp ."".
" ORDER BY `id_valeur`";
if($connexion != false)
{
$rech_val = mysql_query($sql2, $connexion);
/* Un petit compteur pour les valeurs */
$nv = 0;
/* On crée deux tableaux pour les numéros et les noms des valeurs */
$code_val = array();
$nom_val = array();
/* On va mettre les numéros et noms des valeurs dans les deux tableaux */
while($ligne_val = mysql_fetch_assoc($rech_val))
{
array_push($code_val, $ligne_val['id_valeur']);
array_push($nom_val, $ligne_val['valeur']);
$nv++;
}
/* Maintenant on peut construire la liste déroulante */
?>
<select name="valeur" id="valeur">
<?php
for($v = 0; $v<$nv; $v++)
{
?>
<option value="<?php echo($code_val[$v]); ?>"<?php echo((isset($val_selectionnee) && $val_selectionnee == $code_val[$v])?" selected=\"selected\"":null); ?>><?php echo($nom_val[$v]." (". $code_val[$v] .")"); ?></option>
<?php
}
?>
</select>
<?php
}
/* Un petit coup de balai */
mysql_free_result($rech_val);
}
?>
<br /><input type="submit" name="ok" id="ok" value="Envoyer" />
</fieldset>
</form>
<?php
/* Terminé, on ferme la connexion */
mysql_close($connexion);
}
else
{
/* Si on arrive là, c'est pas bon signe, il faut vérifier les
* paramètres de connexion, mot de passe, serveur pas démarré etc... */
?>
<p>Un incident s'est produit lors de la connexion à la base de données, veuillez essayer à nouveau ultérieurement.</p>
<?php
}
?>
</body>
</html>
... mais ça ne fonctionne pas : ça me renvoie les erreurs :Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given... dans la ligne :
while($ligne_val = mysql_fetch_assoc($rech_val))
etWarning: mysql_free_result() expects parameter 1 to be resource, boolean given... dans la ligne :
mysql_free_result($rech_val);
Je pense qu'il y a un problème dans "l'association" de mes tables... et je ne suis pas assez calé en mysqlEst-ce que quelqu'un pourrait m'aiguiller vers une solution ?
Merci d'avance !