problèmede construction d'une requête

Eléphanteau du PHP | 10 Messages

02 juin 2006, 17:54

Bonjour,

Je pense avoir un problème au niveau de la construction d'une requête.
Voici mon problème :

J'ai 2 tables : une table "cheval" et une table "mere".
Dans la table "cheval", y sont stokées toutes les informations d'un cheval : son nom, son père, sa mère...
Dans la table "mere", il y a le nom de cette mère, ses parents et grds parents.
Je fais donc une fiche par cheval, et je voudrais que quand un cheval a un enfant, on récupère le nom de tous les chevaux dont le nom de leur mère est le nom du cheval de la fiche...
J'espère que je suis claire, parceque c'est maintenant que ça se gatte :
Quand je rentre la fiche d'un cheval dans l'administration, j'ai une liste déroulante qui récupère tous les noms des mères de la table "mere" et qui renvoie l'id de la mère.
Donc, ce que je voudrais, c'est récupérer :
1. le nom du cheval de la fiche qui a des enfants
2. la mère des autres chevaux( "mere" dans la table "cheval")
3. le nom de la mère qui correspond à l'idmere récupéré en 2
4. les noms des chevaux dont leur mère est le cheval de la fiche

Voici mon code :
$idcheval = $_GET['idcheval'];

// REQUETE FICHE CHEVAL :
	$requete_cheval = mysql_query("SELECT * FROM cheval WHERE idcheval= '$idcheval' ");
	$result_fiche   = mysql_fetch_array($requete_cheval);
	
	$nom        = $result_fiche['nom'];
	....
	$mere       = $result_fiche['mere'];

//REQUETE POULAINS :
	$requete_mere = mysql_query("SELECT idmere, nom FROM mere WHERE idmere = '$mere'");
	$resultat      = mysql_fetch_array($requete_mere);
	$idmere       = $resultat['idmere'];
	$nom_mere = $resultat['nom'];

	$requete_enfants = mysql_query("SELECT * FROM cheval WHERE '$nom_mere' = '$nom' ORDER BY nom DESC");

DANS LE HTML :
<?php
		 $nim = mysql_num_rows($requete_enfants);
		 while($ligne = mysql_fetch_array($requete_enfants)){
		?>
			<a class="lien" href="ficheCheval.php?idcheval=<?php echo $ligne['idcheval']; ?>"><?php echo $ligne['nom']?><br /></a>
Voila... ca ne marche pas, ça n'affiche rien, et j'ai retourné le problème dans tous les sens... rien !
Quelqu'un peut-il m'aider?
Merci d'avance.

Mammouth du PHP | 1353 Messages

05 juin 2006, 09:07

Code : Tout sélectionner

$requete_enfants = mysql_query("SELECT * FROM cheval WHERE '$nom_mere' = '$nom' ORDER BY nom DESC");
Cette requète ne peux pas marcher : tu veux selectionner les chevaux en demandant une égalité entre deux chaines de caractères. Si tu veux comparer des valeurs il faut donner un nom de champ = une variable par exemple, et si tu en as deux tu peux utiliser le AND...

Sinon essaye d'afficher au fur et a mesure des résultats de requete pour voir à partir d ou cela ne fonctionne plus.
4.les noms des chevaux dont leur mère est le cheval de la fiche

Code : Tout sélectionner

$requete = mysql_query("SELECT nom FROM cheval WHERE mere = '$mere' ORDER BY nom DESC");
par exemple

Mammouth du PHP | 19672 Messages

05 juin 2006, 09:42

Je comprends mal ta structure : pourquoi deux tables quand une seule suffirait ?

Tu peux parfaitement enregistrer toute une généalogie dans une seule et même table en ayant en clé étrangère la clé primaire de cette même table et tu fais une auto-joiture pour retrouver le(s) parent(s) d'un canasson quelconque. À terme, ce sera en plus infiniment plus facile à gérer.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

05 juin 2006, 18:06

Bonjour, merci pour vos réponses,
Voici les requètes que j'ai fait :

$requete_mere = mysql_query("SELECT nom, idmere FROM mere WHERE nom = '$nom'");
$requete_mere = mysql_fetch_array($requete_mere);
$idmere = $requete_mere['idmere'];
$mere_nom = $requete_mere['nom'];
echo $mere_nom;

$requete_enfants = mysql_query("SELECT nom FROM cheval WHERE mere = '$idmere' ORDER BY nom DESC");
$requete_enfants = mysql_fetch_array($requete_enfants);
$nom_enfants = $requete_enfants['nom'];
echo $nom_enfants;
--> avec le "echo", ça m'affiche bien un des enfants, mais qd je fais la boucle pour afficher tous les enfants, voici l'erreur que ça me fait :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Program Files\wamp\www\Bremoy\ficheCheval.php on line 180

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Program Files\wamp\www\Bremoy\ficheCheval.php on line 181
Je ne sais pas quoi faire... :(

ViPHP
ViPHP | 2144 Messages

05 juin 2006, 19:16

Je ne peux te faire que la même réponse que Cyrano : reprends au début ta modélisation de base de donnée, qui est malheureusement très imparfaite, et qui risque de te poser de nombreux problèmes par la suite.

Tu peux très bien n'avoir qu'une seule table avec une structure du genre:

idCheval idMere idPere + les autres informations propres à chaque cheval

Les idMere et idPere contiendront chacun l'id d'un autre enregistrement de la même table. il ne faut pas perdre de vue qu'avant d'être une mère ou un père, un cheval est avant tout un cheval, comme son poulain, donc il n'y a pas de raisons d'avoir des tables différentes.
Ce genre de relation est appelé relation de composition, une entité peut être constituée d'autres entités et elle même faire partie d'une autre entité avec d'autre entité.

Mammouth du PHP | 19672 Messages

05 juin 2006, 19:24

même plus simple : un champ définissant si c'est un cheval ou une jument, genre ENUM('male','femelle') et id_parent en clé étrangère, mais avec éventuellement une table de relation puisque un cheval peut avoir plusieurs descendants, mais également a obligatoirement deux ascendants.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

05 juin 2006, 19:42

Merci pour vos réponses.
J'avais bien réfléchi à mettre tout dans la même table, mais, ce qui m'interressait, c'etait de pouvoir aller rechercher une jument dans la table mère, qui reviendra régulièrement puisqu'elles ont un poulain par an. Et ainsi de ne pas avoir à rentrer à chaque fois son ascendance (il faut remonter jusqu'à 3 générations. Les pères aussi reviennent frequemment.
Ceci dit, je n'ai pas compris toutes vos solutions... Mais je vais tâcher de me renseigner.
Auriez vous des liens s'il vous plait?

ViPHP
ViPHP | 2144 Messages

05 juin 2006, 19:51

Cyrano : si on veut mémoriser le père et la mère, il va falloir deux clé étrangère.
Sinon, c'est vrai que si on doit pouvoir faire facilement le lien dans les deux sens entre parent/poulain, une table filliation, prend ton son intérêt.

Mammouth du PHP | 19672 Messages

05 juin 2006, 20:05

Proposition de schéma basique :

Code : Tout sélectionner

+--------------------------------------------+ +-------------------------+ | t_chevaux | | r_parente | +---------------+-----------------------+----+ +-----------------+-------+ | chv_id | INT(11) UNSIGNED | PK |<----------->|chv_id_enfant | FK PK| | chv_nom | CHAR(32) | | |chv_id_parent | FK PK| | chv_date_nais | DATE | | +-----------------+-------+ | chv_sexe | ENUM('male','femelle' | | +---------------+-----------------------+----+
De cette manière, un cheval lors de son inscription va donner lieu à l'ajout dans la table r_parente de deux lignes, une pour chacun de ses parents qui va pointer vers la ligne correspondante dans la table t_chevaux.

J'ai mis t_chevaux mais r_parente pour souligner "table" pour les chevaux, mais "relation" pour les liens de parenté. Dans la relation, les deux colonnes sont des clés étrangères qui forment une clé primaire composite, la première étant le chaval en cours d'inscription, le second l'identifiant d'un de ses parents. Après, tu auras tout loisir de retrouver des généalogies sur autant de profondeurs que désiré dans les deux sens, j'entends par là les ascendants d'un cheval donné, mais également toute la descendance d'un cheval donné aussi.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

12 juin 2006, 18:38

Bonjour,

Pour être franche, je n'ai pas vraiment envie de tout refaire, surtout que c'est une des dernières choses qui me reste à faire...
Ce qui se passe maintenant, c'est que ça affiche à l'infini le nom d'un enfant.
Comment puis-je faire pour qu'il ne s'affiche qu'une seule fois, et que tous s'affichent?
Merci d'avance.

Mammouth du PHP | 19672 Messages

12 juin 2006, 19:40

Si tu n'as pas modifié ta structure, alors montre-nous la structure actuelle et la requête que tu as essayé qu'on puisse y détecter d'éventuelles erreurs.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

12 juin 2006, 20:46

Voici ce que j'ai fait :
<?php
	$requete_mere = mysql_query("SELECT nom, idmere FROM mere WHERE nom = '$nom'");
	$requete_mere = mysql_fetch_array($requete_mere);
	$idmere           = $requete_mere['idmere'];
	$mere_nom      = $requete_mere['nom'];

	$requete_enfants = mysql_query("SELECT idcheval, nom FROM cheval WHERE mere = '$idmere' ORDER BY nom DESC");
	$requete_enfants = mysql_fetch_array($requete_enfants);
	$id_enfants         = $requete_enfants['idcheval'];
	$nom_enfants      = $requete_enfants['nom'];
while($requete_enfants){
		?>

Code : Tout sélectionner

<a class="lien" href="ficheCheval.php?idcheval=<?php echo $requete_enfants['idcheval']; ?>"><?php echo $requete_enfants['nom'];?><br /></a>
<?php 
		 }
		?>

Mammouth du PHP | 19672 Messages

12 juin 2006, 21:18

Et ta structure de base ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

13 juin 2006, 00:41

Voici mes tables :
-cheval : idcheval, nom, sexe, pouliniere,pere, mere...
-mere : idmere, nom, race, pere, mere, grdperepat, grdmerepat, grdperemat, grdmeremat
-pere : idpere, nom, race, pere, mere, grdperepat, grdmerepat, grdperemat, grdmeremat

"pouliniere" dans la table "cheval" renvoie SF (selle français), TF (trotteur français) ou non, si ce n'est pas une poulinière
"pere" et "mere" de la table "cheval" correspondent aux "idpere" et "idmere" des tables "pere" et mere".

Mammouth du PHP | 19672 Messages

13 juin 2006, 07:59

Et pourquoi pas une seule requête avec une jointure ?
<?php
$sql = "SELECT c.idcheval, c.nom AS 'nom_cheval', m.idmere, m.nom AS 'nom_mere' ".
       "FROM `cheval`, `mere` ".
       "WHERE c.mere = m.idmere ".
       "AND m.nom = '". $nom ."';";
$exec = mysql_query($sql);
while(false != ($ligne = mysql_fetch_array($exec)))
{
    ?>
<a class="lien" href="ficheCheval.php?idcheval=<?php echo $ligne['idcheval']; ?>"><?php echo $ligne['nom_cheval'];?></a><br />
	<?php
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: