Requete sql select into

Fermé
CHUM2021 - 28 juil. 2021 à 16:44
yg_be Messages postés 23482 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mars 2025 - 1 août 2021 à 11:09
Bonjour,
j'ai une requete selection resultant de 03 tables (f_consulte ,f_malade_consulte ,box) et résulat d'une autre requete selection(requete_tmp) mais j'ai le message d'erreur suivant :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1327 Undeclared variable: tab_tmp' in C:\wamp\www\Gestion Urgences Medico-Chirurgicaux - Copie\admin\malades\page_lstmal_medecin.php on line 61
( ! ) PDOException: SQLSTATE[42000]: Syntax error or access violation: 1327 Undeclared variable: tab_tmp in C:\wamp\www\Gestion Urgences Medico-Chirurgicaux - Copie\admin\malades\page_lstmal_medecin.php on line 61

Donc si j'ai bien compris , la table tab_tmp resultant de la requete($requete_tmp) n'est pas reconnue.

je vous remercie d'avance pour votre aide

$requete_tmp= "SELECT idmalade, idbox INTO tab_tmp FROM f_consulte WHERE idbox=$boxx";

$result_requete_tmp=$pdo->query($requete_tmp);
$t_les_malades=$result_requete_tmp->fetchAll();
$requete_malades="SELECT distinct
 M.idmalade, C.idbox,M.nom_malade,M.prenom_malade,M.dat_nais_malade,M.genre_malade,M.date_arrivee,M.heure_arrivee,B.box

FROM f_consulte C,f_malade_consulte M,box B,requete_tmp T
			
WHERE C.orientation_box=B.id AND C.idmalade=M.idmalade AND C.idmalade!=T.idmalade";
$result_requete_malades=$pdo->query($requete_malades);
	
$tous_les_malades=$result_requete_malades->fetchAll();

Configuration: Windows / Chrome 92.0.4515.107

7 réponses

jordane45 Messages postés 38446 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 février 2025 4 739
28 juil. 2021 à 18:15
Bonjour

Undeclared variable: tab_tmp in C:\wamp\www\Gestion Urgences Medico-Chirurgicaux - Copie\admin\malades\page_lstmal_medecin.php on line 61


Aucun problème au niveau des requêtes sql...
Le souci se trouve dans le code php à la ligne 61 ...
C'est cette ligne qu'il faut regarder...
0
Bonjour
Merci pour votre réponse.
la ligne 61 dans mon code correspond à la ligne 3 du code que j'ai publié
c-a-d
$result_requete_tmp=$pdo->query($requete_tmp);
Donc je ne vois pas où est l'erreur.
0
yg_be Messages postés 23482 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mars 2025 1 568
29 juil. 2021 à 10:23
As-tu remarqué que la variable mentionnée dans le message d'erreur est absente dans la ligne de code que tu nous montres? Tu ne nous montres donc sans doute pas la bonne ligne 61.
0
jordane45 Messages postés 38446 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 février 2025 4 739
29 juil. 2021 à 10:21
Je n'avais pas bien lu ta ligne de code..
Dans une requête SELECT c'est un from qu'il faut mettre et non pas un into
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 526
29 juil. 2021 à 10:34
Bonjour,

Pour que la deuxième requête puisse utiliser la table créée dans la première requête, il me semble que ces deux requêtes doivent être exécutées dans la même transaction (par exemple via un seul appel à $pdo->query()).

Je n'ai pas testé mais tu peux essayer d'exécuter des deux requêtes à la suite comme ceci :
$requete ="SELECT idmalade, idbox INTO tab_tmp FROM f_consulte WHERE idbox=$boxx;
SELECT distinct M.idmalade, C.idbox,M.nom_malade,M.prenom_malade,M.dat_nais_malade,M.genre_malade,M.date_arrivee,M.heure_arrivee,B.box
FROM f_consulte C,f_malade_consulte M,box B, tab_tmp T
WHERE C.orientation_box=B.id AND C.idmalade=M.idmalade AND C.idmalade!=T.idmalade";

$result=$pdo->query($requete);


Ou d'inclure directement ta première requête dans la seconde :
$requete ="SELECT distinct M.idmalade, C.idbox,M.nom_malade,M.prenom_malade,M.dat_nais_malade,M.genre_malade,M.date_arrivee,M.heure_arrivee,B.box
FROM f_consulte C,f_malade_consulte M,box B, (SELECT idmalade, idbox FROM f_consulte WHERE idbox=$boxx) T
WHERE C.orientation_box=B.id AND C.idmalade=M.idmalade AND C.idmalade!=T.idmalade";

$result=$pdo->query($requete);


Au passage, il faudrait idéalement protéger les requêtes contre les injections sql avec la fonction quote() de PDO ou en utilisant des requêtes préparées.

Bonne journée,
0

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

Posez votre question
Merci pour votre réponse
je vais essayer les 02 solutions que vous m'avez prposées et vous rendre la réponse
0
Bonjour Pitet

j'ai essayé la 2eme solution, le message d'erreur n'est plus affiché, donc j'ai eu un résultat mais je n'ai pas eu le résultat attendu de l'execution de la requete .
en effet la condition " AND C.idmalade!=T.idmalade" n'est pas vérifiée car je pense qu'il n' y a pas de jointure entre la table ayant l'alias C et celle ayant l'alias T resultant de l'execution de la requete.
Donc, comme je ne m'y connais pas trop en jointures, est ce que vous pouvez m'aider à résoudre ce problème.
Merci d'avance pour votre aide
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 526
29 juil. 2021 à 17:23
Difficile de donner une requête sql correcte sans comprendre comment sont organisées les données dans la base et sans savoir quel est le résultat attendu. Il faudrait préciser quelles sont les données enregistrés dans chaque table, à quoi elles correspondent et quelles sont les relations entre ces tables (avec un exemple idéalement).

Pour essayer de te guider un minimum : puisque l'identifiant du malade est présent dans les tables f_consulte et f_malade_consulte, tu peux donc utiliser ce champ pour réaliser la jointure. Un exemple pour te montrer la syntaxe d'une jointure :
SELECT M.idmalade, M.nom_malade, M.prenom_malade, C.idbox
FROM f_malade_consulte M
LEFT JOIN f_consulte C ON C.idmalade != M.idmalade
WHERE C.idbox = 5


Tu trouveras des explications plus claires et plus complètes sur les jointures ici : https://sql.sh/cours/jointures

Si ce n'est pas déjà le cas, essayes d'utiliser un client sql (PhpMyAdmin, HeidiSQL, etc...) pour te concentrer uniquement sur la partie SQL afin de construire la requête étape par étape (faire une première jointure entre les tables f_malade_consulte et f_consulte, puis ajouter une seconde jointure pour la table box, puis ajouter les conditions dans la clause WHERE, ...).
Lorsque la requête sql correspondra au résultat attendu, tu pourras alors l'implémenter dans ton code PHP.
0
Bonjour Pitet
Merci pour ta réponse.
il y a juste un détail que je veux comprendre:
est ce qu'on peut faire cette jointure même si le champ idmalade n'est pas une clé primaire ni un index
et aussi meme si la partie droite de la jointure n'est pas une table mais c'est le résultat d'une requete.
0
yg_be Messages postés 23482 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mars 2025 1 568
1 août 2021 à 11:09
oui, on peut.
est-ce que cela est autorisé et utile dans ton cas, impossible de le dire, tu ne nous as donné aucune information utile.
0