Souci de requête avec jointure qui ne donne rien

Résolu/Fermé
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 - 12 janv. 2017 à 15:50
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 - 23 janv. 2017 à 19:39
Bonjour,
Nous reprenons un chantier en cours pour notre association (1901) mais nos connaissances en PHP MySql restent limitées.
Donc on fait appel à votre aide.
Voici le souci, d’abord les principes puis le détail.
Il s’agit de remplir un tableau à 2 colonnes (en fait 3, mais c’est l’étape d’après… restons progressifs) avec les résultats de la première colonne trié croissant, puis de la seconde colonne trié croissant.
Nous avons testé la requête concernée dans mysql (wampserver) avec des champs sans jointure nécessaire, et çà marche.
Maintenant le cas concret se trouve dans un ‘if’ et nécessite une deuxième jointure de tables, notre code dans localhost ne génère pas de message d’erreur (malgré des points de contrôle d’erreurs ajoutés), en pratique le titre de la page s’affiche entre h2 et /h2 et le début du tableau avec les 2 titres XXXXX et YYYYY aussi, mais après, rien, donc on bloque.
Voici le code de la page :

//attention la première requête avec jointure n’est pas concernée
$requete = $connexion->prepare("SELECT champ1, champ2, champ3, champ4, champ5, champ6, etc. y compris Original_name, Describer_initials FROM table1 left outer join table2 on (table1.Rk_Hist = table2.Rk_Hist) left outer join table3 on (table3.Rk_Hist = table2.Rk_Hist) left outer join table4 on (table4.Rk_Hist = table3.Rk_Hist) left outer join table5 on (table5.Rk_Hist = table4.Rk_Hist) left outer join table6 on (table6.Rk_Hist = table5.Rk_Hist) left outer join table7 on (table7.Rk_Hist = table6.Rk_Hist) left outer join table8 on (table8.Rk_Hist = table7.Rk_Hist) left outer join table9 on (table9.Rk_Hist = table8.Rk_Hist) WHERE table1.Rk_Hist = :id");
$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);
$requete->execute();

$result = $requete->fetchAll();

echo '<div id="center">';

$Reversed_name = null;
if (empty($result[0])) {
echo '<br><h2>LIST OF XXXXXXXX</h2>';
echo '<table class="sortable"><tr><th title="(xxxxx)">XXXXXXXX</th><th title="(yyyyyyyy)">YYYYY</th></tr>';
$requete = $connexion->prepare("SELECT Original_name, Describer_initials FROM table1 left outer join table3 on (table1.Rk_Hist = table3.Rk_Hist) WHERE table1.Rk_Hist = :id and Describer_initials is not null and trim(Describer_initials) != '' ORDER BY Describer_initials, Original_name");
$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);

$requete->execute();
$result[1] = $requete->fetchAll();
$plan3 = '';
$tabCurrent_name_by_describer = array();

foreach ($result[1] as $row) {
$plan3 = explode("|", $row["Describer_initials"]);

foreach ($plan3 as $cellplan3){
$tabCurrent_name_by_describer[$cellplan3][] = $row["Original_name"];
}
}
ksort($tabCurrent_name_by_describer);
foreach($tabCurrent_name_by_describer as $describer => $tabOriginal_name){
foreach($tabOriginal_name as $Original_name){
echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i></td></tr>';
}
}


} else {
// code php sur la première requête avec des $result[0], à partir de là tout baigne


La clé étrangère (commune à toutes les tables Rk_Hist) est utilisée dans les 2 requêtes.
Il doit y avoir une grosse erreur dans la 2ème requête ou bien dans le code php qui suit.

Merci de votre aide,

Seb




16 réponses

jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
12 janv. 2017 à 17:15
Bonjour,


Il doit y avoir une grosse erreur dans la 2ème requête ou bien dans le code php qui suit.


La première chose à faire pour le déterminer .. c'est de tester cette requete DIRECTEMENT dans ta BDD (via phpmyadmin par exemple) et de voir ce que ça dit.

Et pour ce qui est de ton code PHP .. tu peux commencer par appliquer ceci : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs



0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
13 janv. 2017 à 14:10
Bonjour,

Cool, merci de la réaction rapide.
Comme je l’avais dit dans le premier message, j’avais testé la requête MySql sans la jointure pour la deuxième requête et cela marchait et comme le deuxième requête avec jointure est comparable à la première j’avais peu de doute.
Mais comme tu le demandes j’ai testé la requête suivante pour la deuxième requête dans phpmyadmin et çà marche (bonne réponse).
SELECT Original_name, Describer_initials FROM table1 left outer join table3 on (table1.Rk_Hist = table3.Rk_Hist) WHERE table1.Rk_Hist = 123 and Describer_initials is not null and trim(Describer_initials) != '' ORDER BY Describer_initials, Original_name
Maintenant mon doute (faux ?) était que l’on utilise la même clé étrangère pour les 2 requêtes dans les 2 branches du ‘if’ (mais on n'a pas le choix).

Sinon on a placé des ‘ancres’ de type
echo'------------<br>';
var_dump($result[1]);
echo'------------<br>';
A toutes les lignes du code php (pas à pas) et aucun message d’erreur n’est ressorti.

C’est plus clair ?

Merci de ton aide.

A+
Seb
0
jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
13 janv. 2017 à 14:36
Tu as également appliqué le contenu du lien que je t'ai donné ? (gestion des erreurs PDO) ??
Si oui, merci de nous coller ton code "corrigé" .

PS : Lorsque tu postes du code sur le forum, dans les balises de code, précise le LANGAGE (histoire que ça mette la couleur )
=> Explications dispo ici : https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
Modifié par jordane45 le 13/01/2017 à 16:56
Re-bonjour !
Merci de ce lien général, bien utile.
Si possible il faudrait que tu sois plus explicite.
Comme je l’ai dit la requête est bonne.
Et nous avons déjà un système pour générer les erreurs (pas identique à celui de ton lien mais comparable et il fait le job : quand il y a une erreur il l’affiche, ici pas d’erreur générée).
Notre système est le suivant (dans le code de chaque page) :
<?php
 error_reporting(E_ALL);
    require ("connect-blabla.php");
    try {
        $connexion = new PDO('mysql:host=' . etc.);
    } catch (Exception $e) {
        echo 'Erreur : ' . $e->getMessage() . '<br />';
        echo 'N° : ' . $e->getCode();
    }

Et, comme je l’ai dit, des ‘ancres’ de type
echo'------------<br>';
var_dump($result[1]);
echo'------------<br>';
A toutes les lignes du code php (pas à pas).
Je ne vois pas bien ce qui manque pour générer des messages d’erreurs éventuels.
Mais je suis prêt à suivre tes indications...
A+,
Seb

EDIT : Ajout du LANGAGE dans les balises de code (pour avoir la coloration syntaxique)

0
jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
13 janv. 2017 à 16:55
Tu as ça dans ta connexion ?
$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

????
Si ça n'y ait pas .... ajoute le .. (c'est ça qui permet d'activer l'affichage des erreurs PDO).

Ensuite...pour CHAQUE requête ... tu dois les mettre dans des blocs TRY/CATCH
Ce n'est clairement pas ce qui est fait actuellement !!!!

NB: Encore une fois .. lorsque tu postes du code sur le forum METS LE LANGAGE DANS LES BALISES DE CODE POUR AVOIR LA COULEUR !!!!!!!!!!
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
17 janv. 2017 à 12:27
Bonjour,
Merci du pliotage.
J’ai fait et cela ne change rien (c’est comme avant et pas de message d’erreur).
Je reprend ci-après le code pour bien être sûr d’être en phase.
Merci de me dire si je me suis planté (mes excuses d’avance) ou alors quelle est la prochaine étape.
En début de page (ligne 17)

<?php
error_reporting(E_ALL);
require ("connect-blabla.php");
try {
$connexion = new PDO('mysql:host=' . etc.);
$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
echo 'Erreur : ' . $e->getMessage() . '<br />';
echo 'N° : ' . $e->getCode();
}

A l’endroit de la jointure concernée

//attention la première requête avec jointure n’est pas concernée
$requete = $connexion->prepare("SELECT champ1, champ2, champ3, champ4, champ5, champ6, etc. y compris Original_name, Describer_initials FROM table1 left outer join table2 on (table1.Rk_Hist = table2.Rk_Hist) left outer join table3 on (table3.Rk_Hist = table2.Rk_Hist) left outer join table4 on (table4.Rk_Hist = table3.Rk_Hist) left outer join table5 on (table5.Rk_Hist = table4.Rk_Hist) left outer join table6 on (table6.Rk_Hist = table5.Rk_Hist) left outer join table7 on (table7.Rk_Hist = table6.Rk_Hist) left outer join table8 on (table8.Rk_Hist = table7.Rk_Hist) left outer join table9 on (table9.Rk_Hist = table8.Rk_Hist) WHERE table1.Rk_Hist = :id");
$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);
$requete->execute();

$result = $requete->fetchAll();

echo '<div id="center">';

$Reversed_name = null;
if (empty($result[0])) {
echo '<br><h2>LIST OF XXXXXXXX</h2>';
echo '<table class="sortable"><tr><th title="(xxxxx)">XXXXXXXX</th><th title="(yyyyyyyy)">YYYYY</th></tr>';
try{
$requete = $connexion->prepare("SELECT Original_name, Describer_initials FROM table1 left outer join table3 on (table1.Rk_Hist = table3.Rk_Hist) WHERE table1.Rk_Hist = :id and Describer_initials is not null and trim(Describer_initials) != '' ORDER BY Describer_initials, Original_name");

$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);

$requete->execute();
$result[1] = $requete->fetchAll();
}catch(Exception $e){
// en cas d'erreur :
echo " Erreur ! ".$e->getMessage();
echo " Les datas : " ;
print_r($result[1]);
}
$plan3 = '';
$tabCurrent_name_by_describer = array();

foreach ($result[1] as $row) {
$plan3 = explode("|", $row["Describer_initials"]);

foreach ($plan3 as $cellplan3){
$tabCurrent_name_by_describer[$cellplan3][] = $row["Original_name"];
}
}
ksort($tabCurrent_name_by_describer);
foreach($tabCurrent_name_by_describer as $describer => $tabOriginal_name){
foreach($tabOriginal_name as $Original_name){
echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i></td></tr>';
}
}


} else {
// code php sur la première requête avec des $result[0], à partir de là tout baigne


A+

Seb
NB j'ai aussi essayé de déplacer le try juste avant
$requete->bindParam, etc.
Mais c'est pareil
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
17 janv. 2017 à 21:17
Je vois ceci:
	$plan3 = '';
	$tabCurrent_name_by_describer = array();

foreach  ($result[1] as $row) 
{
	$plan3 = explode("|", $row["Describer_initials"]);
	foreach ($plan3 as $cellplan3)
       {
	      $tabCurrent_name_by_describer[$cellplan3][] = $row["Original_name"];
	}	
}
ksort($tabCurrent_name_by_describer);
foreach($tabCurrent_name_by_describer as $describer => $tabOriginal_name)
{
	foreach($tabOriginal_name as $Original_name)
       {
		echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i></td></tr>';	
       }
}

Je te suggère d'ajouter quelques echo et var_dump pour suivre ce que fait ton programme et découvrir à quel moment cela ne se comporte plus comme tu l'imagines.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
18 janv. 2017 à 15:37
Bonjour,

Merci yg_be.

J’avais pas capté.
Je pensais que
$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Ne concernait que la mise en évidence d’erreurs dans les requêtes.
Les var_dump on avait déjà fait, mais je les ai refaits pour toi.
Donc pas à pas en plaçant les var_dump juste après la ligne de chaque variable concernée (j’en met un, je note le résultat dans localhost, je l’enlève, je met le suivant, etc.) :
1
echo'------------<br>';
var_dump($plan3);
echo'------------<br>';
affiche en localhost
string '' (length=0)
2
echo'------------<br>';
var_dump($tabCurrent_name_by_describer);
echo'------------<br>';
affiche en localhost
array (size=0)
empty
3
echo'------------<br>';
var_dump($row);
echo'------------<br>';
n’affiche rien en localhost
(pareil si on ajoute ["Describer_initials"])
4
echo'------------<br>';
var_dump($cellplan3);
echo'------------<br>';
n’affiche rien en localhost
5
echo'------------<br>';
var_dump($tabCurrent_name_by_describer);
echo'------------<br>';
n’affiche rien en localhost
(pareil si on ajoute [$cellplan3][])
Et si on ajoute si on ajoute [$cellplan3][], alors on a l’erreur :
Fatal error: Cannot use [] for reading in D:\, etc.
6 (après ksort)
echo'------------<br>';
var_dump($tabCurrent_name_by_describer);
echo'------------<br>';
affiche en localhost
array (size=0)
empty
7 (après le premier foreach)
echo'------------<br>';
var_dump($tabCurrent_name_by_describer);
echo'------------<br>';
n’affiche rien en localhost
pareil avec $describer,
pareil avec $tabOriginal_name
8 (après le deuxième foreach)
echo'------------<br>';
var_dump($tabOriginal_name);
echo'------------<br>';
n’affiche rien en localhost
pareil avec $Original_name
9 (après echo’<tr><td>)
echo'------------<br>';
var_dump($describer);
echo'------------<br>';
n’affiche rien en localhost
pareil avec $Original_name

Voilà j’espère que cela t’éclaire !
A+
Seb
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
Modifié par yg_be le 18/01/2017 à 20:54
et un var_dump de $result et de $_GET["Rk_Hist"] juste avant
foreach  ($result[1] as $row)
?
A ton avis, étant donné les résultats précédents, à quel moment cela ne se comporte plus comme tu l'imagines? C'est ton code, tu es le mieux placé pour vérifier si il fonctionne bien.
Je suis un peu étonné de ton utilisation inhabituelle de $result, $result[0] et $result[1]. Pourquoi mettre le résultat de ta seconde requête en $result[1] et pas en $result ou $resultbis?
Il serait beaucoup plus propre de laisser tous les var_dump pendant que tu testes, et de nous montrer le code indenté et colorisé avec tout cela.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
19 janv. 2017 à 13:40
Bonjour,
Désolé d’être un peu buté.
Mais je ne comprenais pas !
J’espère que cette fois j’ai compris à 100%.
Donc j’ai mis et gardé partout les
echo'------------<br>';
var_dump($xxxxx);
echo'------------<br>';
Et voici le code (pour éviter tout malentendu) :

try{
$requete = $connexion->prepare("SELECT Original_name, Describer_initials FROM taxabase1 left outer join taxabase3 on (taxabase1.Rk_Hist = taxabase3.Rk_Hist) WHERE taxabase1.Rk_Hist = :id and Describer_initials is not null and trim(Describer_initials) != '' ORDER BY Describer_initials, Original_name");
$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);
echo'------------<br>';
var_dump($Rk_Hist);
echo'------------<br>';

$requete->execute();
$result[1] = $requete->fetchAll();
echo'------------<br>';
var_dump($result[1]);
echo'------------<br>';
}catch(Exception $e){
// en cas d'erreur :
echo " Erreur ! ".$e->getMessage();
echo " Les datas : " ;
print_r($result[1]);
}
$plan3 = '';
echo'------------<br>';
var_dump($plan3);
echo'------------<br>';

$tabCurrent_name_by_describer = array();
echo'------------<br>';
var_dump($tabCurrent_name_by_describer);
echo'------------<br>';

foreach ($result[1] as $row) {
$plan3 = explode("|", $row["Describer_initials"]);
echo'------------<br>';
var_dump($plan3);
echo'------------<br>';
echo'------------<br>';
var_dump($row);
echo'------------<br>';

foreach ($plan3 as $cellplan3)
echo'------------<br>';
var_dump($cellplan3);
echo'------------<br>';
{
$tabCurrent_name_by_describer[$cellplan3][] = $row["Original_name"];
echo'------------<br>';
var_dump($tabCurrent_name_by_describer);
echo'------------<br>';
echo'------------<br>';
var_dump($row);
echo'------------<br>';

}
}
ksort($tabCurrent_name_by_describer);
echo'------------<br>';
var_dump($tabCurrent_name_by_describer);
echo'------------<br>';

foreach($tabCurrent_name_by_describer as $describer => $tabOriginal_name)
echo'------------<br>';
var_dump($describer);
echo'------------<br>';
echo'------------<br>';
var_dump($tabOriginal_name);
echo'------------<br>';
{

foreach($tabOriginal_name as $Original_name)
echo'------------<br>';
var_dump($tabOriginal_name);
echo'------------<br>';
echo'------------<br>';
var_dump($Original_name);
echo'------------<br>';
{
echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i></td></tr>';
echo'------------<br>';
var_dump($Original_name);
echo'------------<br>';
//echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Used_names . '</i></td></tr>';
}
}

Et le résultat dans localhost :
Ligne 82 qui correspond à var_dump($Rk_Hist);
Notice: Undefined variable: Rk_Hist in D:\_etc on line 82
Ensuite:
null

------------
------------

array (size=0)
empty

------------
------------

string '' (length=0)

------------
------------

array (size=0)
empty

------------
------------

array (size=0)
empty

------------
Ensuite, ligne 140 qui correspond à var_dump($tabOriginal_name);
Notice: Undefined variable: tabOriginal_name in D:\_etc on line 140
Suivi de
null

------------
Ensuite, ligne 144 qui correspond à foreach($tabOriginal_name as $Original_name)
Notice: Undefined variable: tabOriginal_name in D:\_etc on line 144
Warning: Invalid argument supplied for foreach() in D:\_etc on line 144
Ensuite, ligne 146 qui correspond à var_dump($tabOriginal_name);
Notice: Undefined variable: tabOriginal_name in D:\_etc on line 146
Suivi de
null

------------
------------
Ensuite, ligne 149 qui correspond à var_dump($Original_name);
Notice: Undefined variable: Original_name in D:\_etc on line 149
Suivi de:
null

------------
Ensuite, ligne 152 qui correspond à echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i></td></tr>';
Notice: Undefined variable: describer in D:\_etc on line 152
Notice: Undefined variable: Original_name in D:\_etc on line 152
Ensuite, ligne 152 qui correspond à var_dump($Original_name);
Notice: Undefined variable: Original_name in D:\_etc on line 154
Suivi de:
null

------------

Je suis surpris d’avoir des erreurs undefined variable car j’ai d’autres pages très similaires à cette deuxième requête (mais sans jointure) et cà marche sans erreur et sans définition des variables concernées qui sont alors dans la même table (sauf que je n’utilise pas la variable Rk_Hist dans ces pages très similaires).
Mais il faut apprendre… avec le profil bas.
Voilà j’espère avoir été complet!
A+
Seb
PS : je sais pas pourquoi les result, result[0], result[1], je reprend juste un chantier d’une autre personne.
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
19 janv. 2017 à 14:27
bonjour, $Rk_Hist n'existe pas, $_GET["Rk_Hist"] existe (j'espère).
ce serait sans doute plus pratique pour toi et nous si tu ajoutais un texte spécifique dans chaque
echo'------------<br>';
, qu'en penses-tu?
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
19 janv. 2017 à 16:08
Re-Bonjour,

Comme je l'ai dit les variables ne sont pas définies dans le 2ème requête après le else du if, notamment result[1], et çà marche.
Donc pour reprendre ton style ce serait sans doute plus éclairant pour moi si tu me disais ce que je dois faire pour définir $Rk_Hist et $_GET["Rk_Hist"].
Je suis allé sur la doc PHP sur phpfacile et je ne comprend pas de quoi il retourne.
Ensuite pas de souci je peux retester la page en mettant une précision éclairante dans le echo'------------<br>'; à chaque ligne concernée, ce qui te permettra de voir plus clair (et le var_dump doit il être placé avant ou après la ligne de la variable à tester?).
Mais je ne vois pas comment coloriser mon code (je l'ai mis entre
 et 


Merci de ton aide.
A+
Seb
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
19 janv. 2017 à 17:57
bonjour,
simplement
var_dump($_GET["Rk_Hist"]);
au lieu de
var_dump($Rk_Hist); 

je ne comprends pas ta question à propos de "la ligne de la variable à tester": la précision éclairante peut être n'importe quoi, du moment qu'elle permette de faire le lien avec le code PHP.
comment colorer ton code: https://forums.commentcamarche.net/forum/affich-34266107-souci-de-requete-avec-jointure-qui-ne-donne-rien#3
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
20 janv. 2017 à 12:25
Bonjour,
Désolé j’étais resté sur une modif ancienne de CCM pour les balises code que je préparais avant.
J’ai corrigé le var_dump et j’ai ajouté un libellé de test éclairant.
Voici les nouveaux résultats.
Et voici le code (pour éviter tout malentendu) :

try{
		$requete = $connexion->prepare("SELECT Original_name, Describer_initials FROM taxabase1 left outer join taxabase3 on (taxabase1.Rk_Hist = taxabase3.Rk_Hist) WHERE taxabase1.Rk_Hist = :id and Describer_initials is not null and trim(Describer_initials) != '' ORDER BY Describer_initials, Original_name");
	$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);
	echo'test $_GET["Rk_Hist"]<br>';
	var_dump($_GET["Rk_Hist"]);
	echo'------------<br>';
	
	$requete->execute();
    $result[1] = $requete->fetchAll();
		echo'test $result[1]<br>';
	var_dump($result[1]);
	echo'------------<br>';
	}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($result[1]);
}
	$plan3 = '';
	echo'test $plan3<br>';
	var_dump($plan3);
	echo'------------<br>';

	$tabCurrent_name_by_describer = array();
	echo'test $tabCurrent_name_by_describer<br>';
	var_dump($tabCurrent_name_by_describer);
	echo'------------<br>';
	
    foreach  ($result[1] as $row) {
	$plan3 = explode("|", $row["Describer_initials"]);
	echo'test $plan3<br>';
	var_dump($plan3);
	echo'------------<br>';
	echo'test $row["Describer_initials"]<br>';
	var_dump($row["Describer_initials"]);
	echo'------------<br>';

	foreach ($plan3 as $cellplan3)
	echo'test $cellplan3<br>';
	var_dump($cellplan3);
	echo'------------<br>';
	{
	$tabCurrent_name_by_describer[$cellplan3][] = $row["Original_name"];
	echo'test $tabCurrent_name_by_describer<br>';
	var_dump($tabCurrent_name_by_describer);
	echo'------------<br>';
	echo'test $row["Original_name"]<br>';
	var_dump($row["Original_name"]);
	echo'------------<br>';
		
	}	
		}
		ksort($tabCurrent_name_by_describer);
	echo'test $tabCurrent_name_by_describer<br>';
	var_dump($tabCurrent_name_by_describer);
	echo'------------<br>';
		
			foreach($tabCurrent_name_by_describer as $describer => $tabOriginal_name)
	echo'test $tabCurrent_name_by_describer<br>';
	var_dump($tabCurrent_name_by_describer);
	echo'------------<br>';
	echo'test $describer<br>';
	var_dump($describer);
	echo'------------<br>';
	echo'test $tabOriginal_name<br>';
	var_dump($tabOriginal_name);
	echo'------------<br>';
	{

			foreach($tabOriginal_name as $Original_name)
	echo'test $tabOriginal_name<br>';
	var_dump($tabOriginal_name);
	echo'------------<br>';
	echo'test $Original_name<br>';
	var_dump($Original_name);
	echo'------------<br>';
	{
		echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i></td></tr>';
	echo'test $describer<br>';
	var_dump($describer);
	echo'------------<br>';		
	echo'test $Original_name<br>';
		var_dump($Original_name);
	echo'------------<br>';




Et le résultat dans localhost :
test $_GET["Rk_Hist"]

null

------------
test $result[1]

array (size=0)
empty

------------
test $plan3

string '' (length=0)

------------
test $tabCurrent_name_by_describer

array (size=0)
empty

------------
test $tabCurrent_name_by_describer

array (size=0)
empty

------------

array (size=0)
empty

------------
test $describer

Ensuite, ligne 140 pour var_dump($describer);
Notice: Undefined variable: describer in D:\_etc. on line 140
Ensuite:
null

------------
test $tabOriginal_name
Ensuite, ligne 143 pour var_dump($tabOriginal_name)
Notice: Undefined variable: tabOriginal_name in D:\_etc on line 143
Ensuite:
null

------------
Ensuite, ligne 147 pour foreach($tabOriginal_name as $Original_name)
Notice: Undefined variable: tabOriginal_name in D:\_Etc on line 147
Warning: Invalid argument supplied for foreach() in D:\_Etc on line 147
Ensuite ligne 149 pour var_dump ($tabOriginal_name);
Notice: Undefined variable: tabOriginal_name in D:\_Etc on line 149
Ensuite :
null

------------
test $Original_name
Ensuite, ligne 152 pour var_dump ($Original_name);
Notice: Undefined variable: Original_name in D:\_Etc on line 152
Ensuite:
null

------------
Ensuite, ligne 155 pour echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i></td></tr>';
Notice: Undefined variable: describer in D:\_Etc on line 155
Notice: Undefined variable: Original_name in D:\_Etc on line 155
Ensuite
test $describer
Ensuite ligne 157 pour var_dump ($describer);
Notice: Undefined variable: describer in D:\_Etc on line 157
Ensuite
null

------------
test $Original_name
Ensuite, ligne 160 pour var_dump ($Original_name);
Notice: Undefined variable: Original_name in D:\_Etc on line 160
Ensuite:
null

------------

Voilà j’espère avoir été complet, cette fois!
Je précise à nouveau (pour éviter tout malentendu face à cette avalanche de « notices ») que j’ai une autre page avec un tableau similaire qui marche (on a juste transposé les noms des variables, j’ai vérifié 3 fois !), la seule différence est qu’ici la requête contient une jointure car les champs sélectionnés sont dans des tables différentes
A+
Seb
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
20 janv. 2017 à 13:10
$_GET["Rk_Hist"] est null, alors que tu l'utilises comme critère de recherche. Cela explique largement ton soucis.
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
20 janv. 2017 à 13:24
Autre chose à corriger: tu as mis tout ton code de test avant l'accolade ouvrante qui suit le foreach, Il faut impérativement le mettre après l'accolade ouvrante. Je vois le problème après trois foreach, vérifie bien tout.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5 > yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024
20 janv. 2017 à 13:50
Mais je bloque!
La première jointure ci-après est pareille (même code), elle concerne la partie après le else qui marche nickel.
Rk_Hist est le champ commun qui se trouve ligne à ligne dans toutes les tables.
Je ne sais pas si c'est un critère de recherche, mais ce champ (clé primaire) ne sert qu'à la jointure.
Il n'est pas utilisé dans le code php.
Voici la première jointure (c'est la deuxième qui est le sujet ici, mais comme je l'ai dit la requête marche dans phpmyadmin).
//attention la première requête avec jointure n’est pas concernée
$requete = $connexion->prepare("SELECT champ1, champ2, champ3, champ4, champ5, champ6, etc. y compris Original_name, Describer_initials FROM table1 left outer join table2 on (table1.Rk_Hist = table2.Rk_Hist) left outer join table3 on (table3.Rk_Hist = table2.Rk_Hist) left outer join table4 on (table4.Rk_Hist = table3.Rk_Hist) left outer join table5 on (table5.Rk_Hist = table4.Rk_Hist) left outer join table6 on (table6.Rk_Hist = table5.Rk_Hist) left outer join table7 on (table7.Rk_Hist = table6.Rk_Hist) left outer join table8 on (table8.Rk_Hist = table7.Rk_Hist) left outer join table9 on (table9.Rk_Hist = table8.Rk_Hist) WHERE table1.Rk_Hist = :id");
	$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);
    $requete->execute();

    $result = $requete->fetchAll();

A+
Seb
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5 > yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024
20 janv. 2017 à 13:52
Ah, OK, merci. Je vais corriger et je te tiens au courant. Seb
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480 > Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018
20 janv. 2017 à 13:58
Tu t'obstines à imaginer un problème de jointure.
Rk_Hist est, en effet, un champ de ta table.
$_GET["Rk_Hist"], c'est un tout autre animal: cela récupère une donnée fournie par l'utilisateur. Le code PHP se sert de cette donnée comme critère de sélection dans la table. Comme cette donnée est vide, la sélection ne retourne rien.
C'est sans doute plutôt un problème dans la partie de ton code PHP qui communique avec l'utilisateur.
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
20 janv. 2017 à 17:46
Suggestion :
var_dump($_GET);
0
jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
21 janv. 2017 à 00:58
Bonjour,

Vous vous perdez en code inutile ...
Et puis vous mettez des var_dump n'importe où ... à tel point que vous ne respectez plus la syntaxe des FOR et autres lignes de codes ....

Bref ...
essayez ce code et dites nous ce que ça donne :

//fonction permetant de récupérer PROPREMENT une variable GET
function getVar($varName,$defaultValue=NULL){
 return !empty($_GET[$varName]) ? $_GET[$varName] : $defaultValue;
}


//Petite fonction pour faire du debug
function debug($data,$title=" --> Debug :<br>"){
 echo $title;
 if(!empty($data)){
  if(is_array($data)){
    echo "<pre>";
    print_r($data);
    echo "</pre>";
  }else{
    echo "<br>".$data;
  }
 }else{
  echo "<br>Unknown or NULL or EMPTY" !;
 }
 echo'<br>------------<br>';
}

//récupération PROPRE des variables AVANT de les utiliser
$id = getVar("Rk_Hist");

//Initialisation de la variable $result
$result = array();


//si il y a un id !
if($id){
  //quelques retours à la ligne sur la requete la rendent plus lisible
  // de plus.. la mettre dans une variable permet d'en faire un ECHO en cas de besoin !
  $sql = "SELECT Original_name, Describer_initials 
          FROM taxabase1 
          LEFT OUTER JOIN taxabase3 ON taxabase1.Rk_Hist = taxabase3.Rk_Hist
          WHERE taxabase1.Rk_Hist = :id 
          AND Describer_initials is not null 
          AND TRIM(Describer_initials) != '' 
          ORDER BY Describer_initials, Original_name";
    
  debug($sql,"La requete est : ");
        
  try{
    $requete = $connexion->prepare($sql);
    $requete->bindParam(':id', $id, PDO::PARAM_INT);
    $requete->execute();
    $result = $requete->fetchAll();  
    debug($result," Resultat de la requete :");    
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " requete : " .$sql ;
  }	
}else{
 echo "Aucun ID !";
}

	$tabCurrent_name_by_describer = array();
		
	foreach($result as $row) {
    $Describer_initials = !empty($row["Describer_initials"]) ? $row["Describer_initials"] : "";
    debug($Describer_initials,'test Describer_initials<br>');
    
    $plan3 = explode("|", $Describer_initials);
    debug($plan3,"test plan3");
    
    $Original_name = !empty($row["Original_name"]) ? $row["Original_name"] : "";
    debug($Original_name,"Original_name");
    
    if(!empty($plan3)){
      foreach ($plan3 as $cellplan3) {
        $tabCurrent_name_by_describer[$cellplan3][] = $Original_name;
      }	
      debug($tabCurrent_name_by_describer,'test $tabCurrent_name_by_describer<br>');
    }else{
      debug("plan3 est vide !","erreur");
    }
	}
  
  if(!empty($tabCurrent_name_by_describer)){
    ksort($tabCurrent_name_by_describer);
    debug($tabCurrent_name_by_describer,"tabCurrent_name_by_describer");
 	}
  
  
  // Affichage des données dans ton tableau
  if(!empty($tabCurrent_name_by_describer)){
	  foreach($tabCurrent_name_by_describer as $describer => $tabOriginal_name){
      debug($describer,"test describer");
      debug($tabOriginal_name,"test tabOriginal_name");
      	
			foreach($tabOriginal_name as $Original_name) {
        echo "<tr>
               <td>
                <b>$describer</b>
               </td>
               <td>
                <i>$Original_name</i>
               </td>
              </tr>";
      }
    }
  }



De plus, au début de votre fichier PHP, merci d'ajouter les trois lignes suivantes : (juste après le <?php )
 // Affichage de TOUTES les erreurs PHP !
 error_reporting(E_ALL);
 ini_set("display-errors","on");



0
jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
21 janv. 2017 à 01:00
PS : Si vous obtenez le message "Aucun ID !" ... merci de nous coller l'URL présente dans votre navigateur histoire de voir quelles sont les variables GET que vous envoyez...
Et éventuellement .. le lien (ou le formulaire html) qui appel cette page.....
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
23 janv. 2017 à 15:38
Bonjour,

Merci de l'aide en secours.
J'ai testé et à part une broutille à corriger dans le code suggéré, suivant:
echo "<br>Unknown or NULL or EMPTY";
au lieu de
echo "<br>Unknown or NULL or EMPTY" !;

J'obtiens bien le message en localhost
Aucun ID !
(ma page s'affiche bien à part cela, avec le menu haut et le menu gauche, correspondant à une requête de la BDD), "Aucun ID ! " est le seul élément affiché de la partie centrale)
Vous demandez dans ce cas de coller l'URL présente dans mon navigateur (FF) en localhost, voici:
http://localhost/dossier1/sousdossier1/test.php

Le fichier avec votre code s'appelle test et je peux le copier ici si nécessaire (je peux aussi copier le code avec la requête sans jointure et qui marche).

Le fichier test ne contient que votre code, donc pas de if... else, par conséquent mon hypothèse d'une incompatibilité entre les 2 branches du 'if' était fausse.
Il contient le menu gauche qui s'affiche avec une requête sql.
Saisi d'un doute j'ai supprimé cette requête mais cela ne change rien, j'ai toujours mon menu haut (include txt, pas de requête) et "Aucun ID ! "

Frustrant.
A+
Seb
0
jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
23 janv. 2017 à 15:50
Vous demandez dans ce cas de coller l'URL présente dans mon navigateur (FF) en localhost, voici:
http://localhost/dossier1/sousdossier1/test.php

Donc il n'y a AUCUNE variable GET dans l'URL...
Normal donc qu'il ne trouve rien !!

Par quel moyen "lances"tu cette page ? Un lien ? Un formulaire ?
Es-tu sûr d'être en GET et non en POST ???
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
23 janv. 2017 à 16:50
Bonjour,

J'ouvre mes pages dans localhost.
En pratique, je clique dans wampserver sur localhost qui ouvre une sorte d'explorateur où se trouve le lien vers le dossier1, je clique dessus, je cherche le sous-dossier2, je clique dessus, je cherche le fichier test.php, je clique dessus et il s'affiche.
Et je fais pareil pour tous les fichiers dont je veux tester l'affichage.
Tous mes fichiers s'affichent bien de cette façon.
Le fichier qui a motivé ce fil s'affiche bien (menu haut, menu gauche, et début de partie centrale). C'est le résultat de la requête qui ne s'affiche pas. L'autre fichier avec la requête sans jointure s'affiche bien totalement.
Est-ce plus clair?

A+
Seb
PS Bien sûr il y a dans la page des liens (menus) et si je clique dessus direct çà marche aussi sauf la page à problème.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
23 janv. 2017 à 17:22
Re-Bonjour,
Je crois que je subodore le blème !
C’est sans doute la 2ème requête qui est pas bonne.
Avec la 1ère requête (la grande jointure) j’appelle des fichiers du menu gauche, par exemple si je clique sur le 6ème lien de la liste verticale j’ai le fichier qui s’affiche bien et qui correspond à Rk_Hist=1395, cad aux lignes qui ont en commun la ligne 1395 de la clé primaire et dans localhost (FF) j’ai cela
http://localhost/dossier1/sousdossier2/services.php?Rk_Hist=1395
Avec le fichier à problème c’est la requête avec la deuxième jointure et elle se fait aussi sur Rk_Hist, mais je n’appelle pas une ligne en particulier, je fais un tableau dans lequel j’appelle toutes les lignes, mais comme les 2 champs sélectionnés sont dans des tables différentes, j’ai le Rk_Hist qui sert de jointure mais pas d’appel de page.
Donc si je raisonne bien, c’est la requête qui est pas appropriée, même si la jointure est bonne.
D’où le hic ici
$requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);

Qu’en penses-tu ?
As-tu une modif à tester pour cette requête ?
Merci d’avance
Seb
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
Modifié par yg_be le 23/01/2017 à 18:10
bonjour, et si tu appelles ceci:
http://localhost/dossier1/sousdossier1/test.php?Rk_Hist=1395
au lieu de
http://localhost/dossier1/sousdossier1/test.php,
cela donne quoi?
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
Modifié par Sebas22 le 23/01/2017 à 18:36
Re-Re-Bonjour,

J’ai trouvé avec le manuel et quelques erreurs.

La bonne requête est :
$requete = $connexion->prepare("SELECT Original_name, Describer_initials FROM taxabase1 left outer join taxabase3 on (taxabase1.Rk_Hist = taxabase3.Rk_Hist) WHERE taxabase1.Rk_Hist and Describer_initials is not null and trim(Describer_initials) != '' ORDER BY Describer_initials, Original_name");
 $requete->bindParam(':Rk_Hist', $Rk_Hist, PDO::PARAM_INT);


Merci Jordane de m’avoir mis sur la voie avec tes questions.

Maintenant peux-tu (ou yb_be) vraiment me donner un coup de pousse direct?

J’ai besoin d’ajouter une colonne (issue du champ Trinominal_name dans taxabase3) à mon tableau… que dois-je ajouter à mon code ci-dessous ?

$plan3 = '';
 $tabCurrent_name_by_describer = array();
  
    foreach  ($result[1] as $row) {
 $plan3 = explode("|", $row["Describer_initials"]);
 
 foreach ($plan3 as $cellplan3){
 $tabCurrent_name_by_describer[$cellplan3][] = $row["Original_name"];
 } 
  }
  ksort($tabCurrent_name_by_describer);
 
   foreach($tabCurrent_name_by_describer as $describer => $tabOriginal_name){
   foreach($tabOriginal_name as $Original_name){
   echo '<tr><td><b>' . $describer . '</b></td><td><i>'. $Original_name . '</i><td>'. $Trinominal_name . '</td></td></tr>';
   }
  }


Merci d’avance !
Seb
0
jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
23 janv. 2017 à 19:06
Nouvelle question = nouvelle discussion

Merci.
0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
Modifié par yg_be le 23/01/2017 à 19:41
Pourrais-tu indenter ton code?
Ensuite, comment extrais-tu le champ Trinominal_name de taxabase3?
Ainsi?
$requete = $connexion->prepare("SELECT Original_name, Describer_initials, taxabase3.Trinominal_name FROM taxabase1 left outer join taxabase3 on (taxabase1.Rk_Hist = taxabase3.Rk_Hist) WHERE taxabase1.Rk_Hist and Describer_initials is not null and trim(Describer_initials) != '' ORDER BY Describer_initials, Original_name");
0