Page 1 sur 4

[resolu] 2 requête en une, comment faire ?

Posté : 04 oct. 2011, 12:56
par juliette
pour la première requête, tout va bien elle affiche un produit mais son champ contient aussi l'ID d'un autre produit...

Code : Tout sélectionner

<?php // Connexion à la base de données try { $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:host=localhost;dbname=malivote', 'root', '', $pdo_options); // Récupération info pere $req = $bdd->prepare('SELECT photo, id_pere FROM produit WHERE id = ?'); $req->execute(array($_GET['produit'])); $donnees = $req->fetch(); ?> <?php echo $donnees['photo']; ?> <br /> <?php echo $donnees['id_pere']; ?>


Jusque la ça !
En dessous que ça se complique: je voudrais avec la requête qui suit, affiché le produit dont l'ID est aussi l'id_pere de la requête au dessus, rien a faire, ca ne marche pas...

je pense que je n'utilise pas la bonne solution, je pense comprendre que les 2 requête devraient être ensemble... mais comment faire ?
quelqu'un peut il m'aider ?

merci, Juliette.


Code : Tout sélectionner

<?php $req->closeCursor(); // Important : on libère le curseur pour la prochaine requête // Récupération des commentaires $req = $bdd->prepare('SELECT * FROM produit WHERE produit = id_pere'); $req->execute(array($_GET['produit'])); while ($donnees = $req->fetch()) { ?> <p><strong><?php echo ($donnees['id']); ?></strong></p> <?php } // Fin de la boucle des commentaires $req->closeCursor(); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } ?>

Re: 2 requête en une, comment faire ?

Posté : 04 oct. 2011, 13:45
par xTG
Il faut faire une jointure sur la même table avec comme condition de renvoyer le n-uplet correspondant à l'id du père.
Tu récupéreras donc un seul n-uplet avec les informations des deux.
SELECT p1.photo, p2.photo FROM produit AS p1
LEFT JOIN produit AS p2 ON p1.id_pere = p2.id
WHERE p1.id = ?

Re: 2 requête en une, comment faire ?

Posté : 04 oct. 2011, 14:38
par juliette
merci, je comprend le principe mais auriez vous un tuto a ce sujet ?
je suis trop novice pour le mettre en place comme ça...

Re: 2 requête en une, comment faire ?

Posté : 04 oct. 2011, 15:01
par xTG
Bien sûr ce n'est pas ce qui manque sur le net. :)
http://sqlpro.developpez.com/cours/sqlaz/jointures/

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 12:01
par juliette
si j'ai compris, je devrais avoir une requête de ce genre:
$req = $bdd->prepare('SELECT chien.id, chien.nom, chien.affixe, chien.lof_pere  FROM chien AS p1
LEFT JOIN chien AS p2 ON p1.lof_pere = p2.id
WHERE p1.id = ?');
a savoir, ma table s'appel chien

mais en fait je n'ai pas du comprendre car je tombe toujours sur une erreur:
Erreur : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'chien.id' in 'field list'

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 12:07
par xTG
Tu utilises un alias p1, il faut l'utiliser au lieu de chien. ;)
Avec p1 tu as le fils et avec p2 tu auras le père.

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 12:29
par juliette
ok, merci ca marche correctement comme ca mais pour l'instant je n'affiche que les infos de p1...
$req = $bdd->prepare('SELECT p1.*  FROM chien AS p1
LEFT JOIN chien AS p2 ON p1.lof_pere = p2.id
WHERE p1.id = ?');
j'ai une dernière questions:
dans mon echo: comment j'appel les infos du chien p2 ?

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 12:49
par xTG
Dans le select rajoutes un p2.* et tu auras le contenu du second n-uplet.
A noter aussi que pour des raisons de performances et de maintenance il est préférable de sélectionner explicitement ce que tu désires sélectionner.
Utiliser l'étoile est une très mauvaise habitude. ;)

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 12:56
par juliette
oui, ca j'ai bien compris mais comment différentier le nom du père ou le nom du fils dans:
<?php echo $donnees[........']; ?>
pour le select * je sais bien mais en fait je suis entreint de faire un script de genealogie et je ne sais pas encore ce qu'il me faut :?

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 13:46
par xTG
Il me semble que pour ce cas là il faille utiliser des alias dans la requête.
SELECT p1.id AS id1, ....
Mais tu peux toujours essayer l'accès via $donnees['p1.id'] car je suis plus trop sûr.

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 13:51
par Cyrano
Mais tu peux toujours essayer l'accès via $donnees['p1.id'] car je suis plus trop sûr.
Ça ne fonctionnera pas puisque MySQL va retourner le tableau avec les noms de colonne sans l'alias de la table correspondante.

Et je signale aussi au passage que pour un tuto niveau basique sur les jointures, il y en a un ici dans la FAQ, peut-être moins ardu à suivre, et celui de sqlpro sera une très bonne suite dès que les principes de base du premier seront assimilés ;)

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 14:16
par juliette
le soucis est que vos tuto et ceux que je trouve sont des jointure sur 2 tables differente et moi je doit faire une jointure sur une meme table mais 2 champs different.
je vous en montre plus pour le cas ou il y aurais une autre erruer:
<?php
// Connexion à la base de données
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=pedigre', 'root', '', $pdo_options);
    
    // Récupération info pere
    $req = $bdd->prepare('SELECT ch1.*, ch2.* 
						FROM chien AS ch1
						LEFT JOIN chien AS ch2 ON ch1.lof_pere = ch2.id
						WHERE ch1.id = ?');
    $req->execute(array($_GET['pedigre']));
    $donnees = $req->fetch();
    ?>

				N° lof: <?php echo $donnees['lof']; ?> <br />
				N°lof-pere: <?php echo $donnees['id_pere']; ?> <br />
	
	
    
    <?php
    $req->closeCursor(); // je libère le curseur


}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 14:35
par Cyrano
Ça s'appelle une auto-jointure mais dans ce cas, tu dois aliasser les colonnes.

Évite les « SELECT * », ça dépanne pour voir rapidement un contenu de table, mais dans la pratique, ne récupères que ls colonnes dont tu as besoin. Là, tu as besoin de certaines colonnes d'une des instance de ta table chien et d'autres colonnes de l'autre instance, en utilisant des alias sur les colonnes, tu pourras distinguer le parent de l'enfant.

Essaye avec ceci dans phpMyAdmin et observe le résultat, ce sera peut-être plus parlant :
SELECT
  ce.id       AS id_parent,
  ce.nom      AS nom_parent,
  ce.affixe   AS affixe_parent,
  ce.lof_pere AS id_pere_parent,
  cp.id       AS id_enfant,
  cp.nom      AS nom_enfant,
  cp.affixe   AS affixe_enfant,
  cp.lof_pere AS id_pere_enfant
FROM chien AS         ce
  LEFT JOIN chien AS  cp ON ce.lof_pere = cp.id
WHERE cp.id = ?
On cherche les colonnes dans ce (chien enfant) et les colonnes dans cp (chien parent) : ensuite, enlève les colonnes dont tu n'as pas besoin pour ton code.

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 14:45
par juliette
malheureusement ça ne marche pas, pas d'erreur mais rien ne s'affiche.
je ne sais pas le faire sur phpmyadmin, j'ai tester sur mon site...

Re: 2 requête en une, comment faire ?

Posté : 05 oct. 2011, 14:58
par Cyrano
dans phpMyAdmin, remplace le « ? » par une valeur que tu sais exister pour identifier le parent.

Tu peux aussi tester en utilisant une variable SQL en faisant quelque chose comme ceci :
-- On crée une variable pour définir une valeur identifiant un parent;
SET @p_id_parent = 1;
-- On exécute la requête qui prendra en compte la variable précédente;
SELECT
  ce.id       AS id_parent,
  ce.nom      AS nom_parent,
  ce.affixe   AS affixe_parent,
  ce.lof_pere AS id_pere_parent,
  cp.id       AS id_enfant,
  cp.nom      AS nom_enfant,
  cp.affixe   AS affixe_enfant,
  cp.lof_pere AS id_pere_enfant
FROM chien AS         ce
  LEFT JOIN chien AS  cp ON ce.lof_pere = cp.id
WHERE cp.id = @p_id_parent;
Colle ça tel quel dans la zone de saisie de requête de phpMyAdmin et au besoin, remplace la valeur de la variable de départ, j'ai mis 1 mais tu peux tester avec une autre valeur.

Quant ta requête sera au point, tu pourras remettre le « ? » à la place de la variable de la requête SELECT et intégrer ça dans ton PHP.

Mais de toutes les façons, je te recommande vivement de mettre au point tes requêtes en SQL directement avant de passer au PHP.