PDO requête sur 4 tables

PARMGG Messages postés 6 Date d'inscription lundi 19 mai 2014 Statut Membre Dernière intervention 8 août 2015 - 19 mai 2014 à 08:32
jordane45 Messages postés 38134 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 11 avril 2024 - 19 mai 2014 à 10:38
Bonjour,
1/ Je cherche à faire une requête sur 4 tables :
Table S : synthese
Id
Code
Intitule
Numero
Source (les données reprennent certains numeros de code des 3 tables suivantes : exemple R8, A1, E1...)
Source1 (les données reprennent certains numeros de code des 3 tables suivantes : exemple R7, A2...)
Source2 (les données reprennent certains numeros de code des 3 tables suivantes : exemple R3...)
Source3 (les données reprennent certains numeros de code des 3 tables suivantes : exemple E6...)
Source4 (les données reprennent certains numeros de code des 3 tables suivantes : exemple R16...)
Source5 (les données reprennent certains numeros de code des 3 tables suivantes : exemple A3...)
Table A : global
Id
Code
Analyse
Cotation
Table E : interne
Id
Code
Analyse
Cotation
Table T : theme
Id
Code
Analyse
Cotation

2/ Mon objectif est d'afficher les analyses et les cotations des tables A, E et Tpar ordre de numero de la table S

3/ J'ai essayé de deux manières:
3.1/ Par une requête simple (export_syn_gg3.php) : cela me donne 35 fois les données
« Vous êtes connecté au serveur et à la base
numéro - Intitulé
Fin de la rubrique : R8
Analyse A1
Fin de la rubrique : A1
Analyse E1
Fin de la rubrique : E1
Sources citées : R8
Et cela 35 fois !

Le code est le suivant :
<?php
// Connexion à la base de données avec PDO (PHP Data Object)
echo 'Vous êtes connecté au serveur et à la base<br>';
?>
<?php
// On récupère les 5 derniers billets
$req = $dbh->query('SELECT synthese.numero AS numero_s, synthese.intitule AS intitule_s,
synthese.source AS source_s, synthese.source2 AS source2_s, synthese.source3 AS source3_s, synthese.source4 AS source4_s, synthese.source5 AS source5_s,
analyse_a.code AS code_a, analyse_a.analyse AS analyse_a,
analyse_e.code AS code_e, analyse_e.analyse AS analyse_e,
theme.code AS code_t, theme.analyse AS analyse_t
FROM synthese
INNER JOIN theme
ON theme.code = synthese.source OR theme.code = synthese.source2 OR theme.code = synthese.source3
INNER JOIN analyse_a
ON analyse_a.code = synthese.source OR analyse_a.code = synthese.source2 OR analyse_a.code = synthese.source3 OR theme.code = synthese.source OR theme.code = synthese.source2 OR theme.code = synthese.source3
INNER JOIN analyse_e
ON analyse_e.code = synthese.source OR analyse_a.code = synthese.source2 OR analyse_a.code = synthese.source3 OR theme.code = synthese.source OR theme.code = synthese.source2 OR theme.code = synthese.source3
ORDER BY synthese.numero');
while ($donnees = $req->fetch())
{
?>
<div class="news">
<?php echo htmlspecialchars($donnees['numero_s']); ?>
- <b><?php echo $donnees['intitule_s']; ?></b><br>
<?php echo $donnees['analyse_t']; ?><br>
<em> Fin de la rubrique : </em><?php echo $donnees['code_t']; ?><br/>
<?php echo $donnees['analyse_a']; ?><br>
<em> Fin de la rubrique : </em><?php echo $donnees['code_a']; ?><br/>
<?php echo $donnees['analyse_e']; ?><br>
<em> Fin de la rubrique : </em><?php echo $donnees['code_e']; ?><br/>
<em> Sources citées : <?php echo $donnees['source_s']; ?></em>
<em> <?php echo $donnees['source2_s']; ?></em>
<em> <?php echo $donnees['source3_s']; ?></em>
<em> <?php echo $donnees['source4_s']; ?></em>
<em> <?php echo $donnees['source5_s']; ?></em><br/><br/>
</div>
<?php
} // Fin de la boucle des billets
$req->closeCursor();
?>

3.2/ Par une requête préparée (export_syn_us7.php) : cela me donne un texte qui n'est pas exploitable :
« Vous êtes connecté au serveur et à la base
Array ( [0] => Array ( [numero_s] => 00 [intitule_s] => Introduction [source_s] => [code_e] => EI1 [analyse_e] => essai ) [1] => Array ( [numero_s] => 00 [intitule_s] => Introduction [source_s] => [code_e] => EI2 [analyse_e] => ) [2] => Array (... »


Le code est :
<?php
// Connexion à la base de données avec PDO (PHP Data Object)
echo 'Vous êtes connecté au serveur et à la base<br>';

?>
<?php
// On récupère
$results = array();
$req1 = $dbh->prepare('SELECT synthese.numero AS numero_s, synthese.intitule AS intitule_s, FROM synthese');
$req1->execute();
while($donnees = $req1->fetch(PDO::FETCH_ASSOC))

$results[] = $donnees;

$req2 = $dbh->prepare('SELECT synthese.numero AS numero_s, synthese.intitule AS intitule_s, synthese.source AS source_s, analyse_e.code AS code_e, analyse_e.analyse AS analyse_e FROM synthese INNER JOIN analyse_e');
$req2->execute();
while($donnees = $req2->fetch(PDO::FETCH_ASSOC))

$results[] = $donnees;

print_r($results);
{
?>
<?php
} // Fin de la boucle des billets
$req1->closeCursor();
$req2->closeCursor();
?>

Pouvez-vous m'aider pour afficher les résultats correctement et qu'une seule fois (cf. Requête simple) ?
Merci pour vos réponses

2 réponses

Whismeril Messages postés 19016 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 655
19 mai 2014 à 09:29
Bonjour, pour plus de lisibilité, et donc de chances d'obtenir une réponse, voir ici comment utiliser la coloration syntaxique.
0
jordane45 Messages postés 38134 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 11 avril 2024 344
Modifié par jordane45 le 19/05/2014 à 10:42
Bonjour,

Avant de parler d'affichage... la Première grande question à se poser est :
Ta requête te donne t'elle le résultat attendu ?
( Je parle bien QUE de la requête... pas de son utilisation dans PHP.... il te faut donc tester/concevoir ta requête en tapant directement dans ta BDD...)

SELECT synthese.numero AS numero_s
  , synthese.intitule AS intitule_s
  , synthese.source AS source_s
  , synthese.source2 AS source2_s
  , synthese.source3 AS source3_s
  , synthese.source4 AS source4_s
  , synthese.source5 AS source5_s
  , analyse_a.code AS code_a
  , analyse_a.analyse AS analyse_a
  , analyse_e.code AS code_e
  , analyse_e.analyse AS analyse_e
  , theme.code AS code_t
  , theme.analyse AS analyse_t
FROM synthese
INNER JOIN theme
 ON theme.code = synthese.source 
 OR theme.code = synthese.source2 
 OR theme.code = synthese.source3
INNER JOIN analyse_a
 ON analyse_a.code = synthese.source 
 OR analyse_a.code = synthese.source2 
 OR analyse_a.code = synthese.source3 
 OR theme.code = synthese.source 
 OR theme.code = synthese.source2 
 OR theme.code = synthese.source3
INNER JOIN analyse_e
 ON analyse_e.code = synthese.source 
 OR analyse_a.code = synthese.source2 
 OR analyse_a.code = synthese.source3 
 OR theme.code = synthese.source 
 OR theme.code = synthese.source2 
 OR theme.code = synthese.source3
ORDER BY synthese.numero


Sachant que :
- L'ordre des jointure a une incidence sur le résultat.
- Tu sembles avoir plusieurs champs dans chaque table pouvant servir de lien..c'est étonnant....


PS: as tu remarqué ? .. je fais des retours à la ligne pour présenter mes requêtes... cela rend leur lecture beaucoup plus simple.


ps2 : Je pense que tes jointures pourraient plus simplement s'écrire ainsi :
INNER JOIN analyse_a
 ON analyse_a.code = synthese.source 
 OR analyse_a.code = synthese.source2 
 OR analyse_a.code = synthese.source3 
INNER JOIN analyse_e
 ON analyse_e.code = synthese.source 
 OR analyse_a.code = synthese.source2 
 OR analyse_a.code = synthese.source3 

c'est à dire... sans répeter :
OR theme.code = synthese.source 
 OR theme.code = synthese.source2 
 OR theme.code = synthese.source3




PS3 : Vu que tes Tables sont toutes de la même forme et semblent contenir le même genre de données.... Pourquoi les avoir séparée ??
Il aurait suffit d'ajouter un champ suplémentaire : TYPE_tbl qui aurait pris comme valeur : global / interne/ thème selon le "type" de données...

Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
0
Rejoignez-nous