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

Mammouth du PHP | 790 Messages

04 oct. 2011, 12:56

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()); } ?>
Modifié en dernier par juliette le 05 oct. 2011, 21:54, modifié 1 fois.
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

04 oct. 2011, 13:45

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 = ?

Mammouth du PHP | 790 Messages

04 oct. 2011, 14:38

merci, je comprend le principe mais auriez vous un tuto a ce sujet ?
je suis trop novice pour le mettre en place comme ça...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

04 oct. 2011, 15:01

Bien sûr ce n'est pas ce qui manque sur le net. :)
http://sqlpro.developpez.com/cours/sqlaz/jointures/

Mammouth du PHP | 790 Messages

05 oct. 2011, 12:01

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'
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

05 oct. 2011, 12:07

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.

Mammouth du PHP | 790 Messages

05 oct. 2011, 12:29

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 ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

05 oct. 2011, 12:49

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. ;)

Mammouth du PHP | 790 Messages

05 oct. 2011, 12:56

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 :?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

05 oct. 2011, 13:46

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.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 13:51

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 ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 14:16

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());
}
?>
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 14:35

Ç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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 14:45

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...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 14:58

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: