Page 1 sur 2

doublons dans listes de choix

Posté : 01 août 2005, 15:38
par FAbrice
Bonjour le forum,

j'ai une question pour vous.
j'ai une table de données qui se décompose de la maniere suivante:
N° equipement | slug | photo

a partir de cette table, j'ai la possibilité de faire évoluer ma liste de choix des slugs en fonction du n° choisi.

le PB est qu'il risque d'y avoir des doublons. ma question est la suivante:
comment faire pour eviter les doublons ;=) ?

merci de votre aide,
FAb

PS: ci-joint le code actuel:
<?php require_once('Connections/TCS.php'); ?>
<?php
mysql_select_db($database_TCS, $TCS);
$query_Recordset1 = "SELECT * FROM equipement ORDER BY numero ASC";
$Recordset1 = mysql_query($query_Recordset1, $TCS) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);

$colname_Recordset2 = "1";
if (isset($_GET['num'])) {
  $colname_Recordset2 = (get_magic_quotes_gpc()) ? $_GET['num'] : addslashes($_GET['num']);
}
mysql_select_db($database_TCS, $TCS);
$query_Recordset2 = sprintf("SELECT slug.type, equipslug.ID FROM equipslug, slug WHERE equipslug.equipment = '%s' AND equipslug.slug=slug.ID", $colname_Recordset2);
$Recordset2 = mysql_query($query_Recordset2, $TCS) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);

$colname_Recordset3 = "1";
if (isset($_GET['num'])) {
  $colname_Recordset3 = (get_magic_quotes_gpc()) ? $_GET['num'] : addslashes($_GET['num']);
}
mysql_select_db($database_TCS, $TCS);
$query_Recordset3 = sprintf("SELECT equipement.numero   FROM equipslug, equipement WHERE equipslug.equipment = '%s' AND equipslug.equipment=equipement.ID", $colname_Recordset3);
$Recordset3 = mysql_query($query_Recordset3, $TCS) or die(mysql_error());
$row_Recordset3 = mysql_fetch_assoc($Recordset3);
$totalRows_Recordset3 = mysql_num_rows($Recordset3);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Document sans titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<form name="form1" method="get" action="testliste.php">
  <p>
    <select name="num" id="num">
      <?php
do {  
?>
      <option value="<?php echo $row_Recordset1['ID']?>"><?php echo $row_Recordset1['numero']?></option>
      <?php
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
  $rows = mysql_num_rows($Recordset1);
  if($rows > 0) {
      mysql_data_seek($Recordset1, 0);
	  $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  }
?>
    </select>
    <input type="submit" name="Submit" value="Envoyer">
</p>
</form>
<form name="form2" method="post" action="">
  <select name="select2">
    <?php
do {  
?>
    <option value="<?php echo $row_Recordset2['ID']?>"><?php echo $row_Recordset2['type']?></option>
    <?php
} while ($row_Recordset2 = mysql_fetch_assoc($Recordset2));
  $rows = mysql_num_rows($Recordset2);
  if($rows > 0) {
      mysql_data_seek($Recordset2, 0);
	  $row_Recordset2 = mysql_fetch_assoc($Recordset2);
  }
?>
  </select>  
  <input type="submit" name="Submit2" value="Envoyer">
  <?php echo $row_Recordset3['numero']; ?>
</form>
<p>&nbsp;</p>
</body>
</html>
<?php
mysql_free_result($Recordset1);
mysql_free_result($Recordset2);
mysql_free_result($Recordset3);
?>

Posté : 01 août 2005, 15:40
par ouckileou
tu peux mettre la propriété UNIQUE sur le champ en question en base de données.
L'insertion d'une valeur déjà présente te renverra donc une erreur qu'il te suffira de récupérer/traiter

Tu peux aussi lors de l'insertion faire un

Code : Tout sélectionner

SELECT COUNT(*) AS nbValeurs FROM table WHERE champ ='valeurAinserer'
si le résultat est positif, la valeur est déjà présente, donc on ne l'insère pas

Posté : 01 août 2005, 15:41
par Cyrano
Salut,
en fait au lieu d'une grande tartine de code, il nous faudrait un exemple: si tu as la structure exacte de ta table et un jeu d'essai avec un exemple de ce que tu voudrais obtenir et ce que tu obtiens effectivement, ce sera mille fois plus rapide de te fournir une réponse efficace.

Posté : 01 août 2005, 15:48
par FAbrice
bonjour tous les 2,

dsl pour la tartine mais j'avais un peu fain (ok, elle etait facile!!)

En fait, ma page comporte:
2 listes déroulantes.
dans la premiere liste, je choisis le numéro de l'équipement et dans la seconde le type de slug en fonction du numéro choisi.

pour cela, j'ai une table "equipslug" ou g tous mes enrgistrements. cette table me sert de base de données pour les phtos des equipments mais le souci est que chaque mois, je rejoute une photo par equipement et par slug.

je ne sais pas si c plus clair :oops: ?
FAb

Posté : 01 août 2005, 15:49
par ouckileou
moi j'aimerais bien savoir ce qu'est un "slug" déjà :oops:

et ce que je t'ai donné comme principes ne t'aide pas ?

Posté : 01 août 2005, 15:54
par FAbrice
un slug est un point de mesure sur un equipement

si g bien compris ce que tu me dis, ta fonction me permettra de ne pas insérer 2 fois le meme enregistrement. or dans mon cas, j'aurai le meme n° d'equipement, le meme slug mais une photo différentes.

Mon souci vient donc du fait que je prends en fait toutes les valeurs des slugs qui ont le meme n°d'équipement.

Posté : 01 août 2005, 15:55
par Cyrano
Quand je parle d'un jeu d'essai, je pense à quelque chose dans ce goût là :

Code : Tout sélectionner

+---------------------------------------------------+ | table xyz | +------------+-------------------+------------------+ | champ_id | champ_a | champ_b | +------------+-------------------+------------------+ | 1|valeur a 1 |valeur b 1 | | 2|valeur a 2 |valeur b 2 | | 3|valeur a 3 |valeur b 3 | | 4|valeur a 4 |valeur b 4 | | 5|valeur a 5 |valeur b 5 | | 6|valeur a 6 |valeur b 6 | +------------+-------------------+------------------+
À partir de là on peut beaucoup plus facilement visualiser ton problème pour autant que ce soit accompagné des exemples de ce que tu veux obtenir et de ce que tu obtiens d'erronné.

Posté : 01 août 2005, 16:01
par ouckileou
si g bien compris ce que tu me dis, ta fonction me permettra de ne pas insérer 2 fois le meme enregistrement. or dans mon cas, j'aurai le meme n° d'equipement, le meme slug mais une photo différentes.
oui, mais c'est un exemple
le principe reste le même : tu comptes le nombre d'enregistrement qui ont les mêmes propriétés que l'insertion que tu souhaites faire

si tu en trouves, c'est qu'il va y avoir un doublon

à toi d'adapter avec tes valeurs, tes tables

Posté : 01 août 2005, 16:02
par FAbrice

Code : Tout sélectionner

+--------------------------------------------------------+ | table equipslug | +------------+-------------------+-----------------------+ | champ_id | equipment | slug | Photo | +------------+-------------------+-----------------------+ | 1|valeur a 1 |valeur b 1 | a1 | | 2|valeur a 2 |valeur b 2 | b1 | | 3|valeur a 1 |valeur b 3 | a2 | | 4|valeur a 2 |valeur b 2 | b2 | | 5|valeur a 2 |valeur b 2 | b3 | | 6|valeur a 1 |valeur b 1 | a3 | +------------+-------------------+--------------+--------+
on voit donc bien qu'il y a 2 equimpents et entre 2 et 3 slug par equipement.

Posté : 01 août 2005, 16:21
par Cyrano
:roll: L'art de bien formuler une question : c'est vrai que si tout le monde comprenait ça, ce forum n'aurais quasiment plus de raison d'être.

Bon, ok, là, je vois un exemple de données. Maintenant, formule ta question : tu voudrais obtenir quoi au juste : actuellement comment formules-tu ta requête SQL et qu'obtiens-tu ? Là, ce sera facile.... même pour toi de trouver la réponse.

Jusqu'à présent, il faudrait qu'on décortique ton code pour comprendre à peu près comment ça fonctionne... :-k

Posté : 01 août 2005, 16:42
par FAbrice
je suis touta fait d'accord avec toi sur la clareté des questions mais des fois c pas facile a formuler 8)

Ma requete sur la seconde liste est du genre:
afficher tous les slugs ayant pour n° d'equipment "num"
$colname_Recordset2 = "1";
if (isset($_GET['num'])) {
  $colname_Recordset2 = (get_magic_quotes_gpc()) ? $_GET['num'] : addslashes($_GET['num']);
}
mysql_select_db($database_TCS, $TCS);
$query_Recordset2 = sprintf("SELECT slug.type, equipslug.ID FROM equipslug, slug WHERE equipslug.equipment = '%s' AND equipslug.slug=slug.ID", $colname_Recordset2);
$Recordset2 = mysql_query($query_Recordset2, $TCS) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
voila :=)

Posté : 01 août 2005, 16:56
par Cyrano
...des fois c pas facile a formuler ...
C'est précisément pour ça que tu ne trouves pas la réponse ;)

Autre chose, quand je vois ton code..... si tu apprenais à créer tes requêtes tout seul à la main au lieu d'essayer de corriger les requêtes méthode DreamWeaver, tu gagnerais pas mal de temps à terme.

Bon, ton code fait référence à un champ qui n'est pas dans la table montrée plus haut et à une table que tu ne montres pas non plus. C'est comme si tu me demandais comment réparer un carburateur en me montrant un tournevis et une fouchette : qu'est-ce que la fourchette fait dans le décor ??

Reprends ta copie et fais une question complète : les deux tables avec jeu d'essai (lignes exemples avec des données, même bidon on s'en tape) , ce que tu voudrais obtenir, par exemple telle ligne que tu précises, et ce que tu obtiens avec ta requête.

Et puis pour finir, voici comment simplifier et éclaircir un peu :
<?php
$colname_RS2 = "1";
if (isset($_GET['num']))
{
  $colname_RS2 = (get_magic_quotes_gpc()) ? $_GET['num'] : addslashes($_GET['num']);
}
mysql_select_db($database_TCS, $TCS);

$query_RS2 = "SELECT slug.type, equipslug.ID 
              FROM equipslug, slug 
              WHERE equipslug.equipment = '". $colname_RS2 ."' 
              AND equipslug.slug=slug.ID";

$RS2 = mysql_query($query_RS2, $TCS) or die(mysql_error());
$row_RS2 = mysql_fetch_assoc($RS2);
$totalRows_RS2 = mysql_num_rows($RS2);
?>
Note que je n'ai rien changé, juste modifié des noms de variable en remplaçant Recordset par RS partout, tout de suite on y voit plus clair et ensuite des retours de ligne pour la requête.

Re: doublons dans listes de choix

Posté : 01 août 2005, 17:05
par pjl
Bonjour le forum,

j'ai une question pour vous.
j'ai une table de données qui se décompose de la maniere suivante:
N° equipement | slug | photo

a partir de cette table, j'ai la possibilité de faire évoluer ma liste de choix des slugs en fonction du n° choisi.

le PB est qu'il risque d'y avoir des doublons. ma question est la suivante:
comment faire pour eviter les doublons ;=) ?
PB de base de données, ca ?
Alors tu donnes la requete qui pose PB et pas la peine de donner le code PHP qui va avec.
C'est beaucoup plus clair et ca évite les embrouilles.

Pour ta réponse, regarde donc du coté des fonctions SQL comme DISTINCT et GROUP BY. Tu devrais trouver ta réponse.
Et on peut déplacer ce post dans base de données.
Il n'a rien à faire dans Débuter en PHP.

Posté : 01 août 2005, 17:07
par FAbrice
copie corrigée:
<?php 
$colname_RS2 = "1"; 
if (isset($_GET['num'])) 
{ 
  $colname_RS2 = (get_magic_quotes_gpc()) ? $_GET['num'] : addslashes($_GET['num']); 
} 
mysql_select_db($database_TCS, $TCS); 

$query_RS2 = "SELECT *
              FROM equipslug
              WHERE equipment = '". $colname_RS2 ."'; 

$RS2 = mysql_query($query_RS2, $TCS) or die(mysql_error()); 
$row_RS2 = mysql_fetch_assoc($RS2); 
$totalRows_RS2 = mysql_num_rows($RS2); 
?> 
maintenant il n'y a plus que le trounevis. :wink:

Posté : 02 août 2005, 08:39
par FAbrice
bonjour,

J'ai essayé d'utiliser la fonction DISTINCT mais ca ne filtre pas les doublons :(
voici comment je l'ai utilisée:
"SELECT DISTINCT * 
              FROM equipslug 
              WHERE equipment = '". $colname_RS2 ."
merci de votre aide,
FAb