Accueil > Forum > > > > Probleme de requetes imbriquees
Probleme de requetes imbriquees
vendredi 21 décembre 2007 à 11:33:42 |
Probleme de requetes imbriquees

Vonscott
|
Salut à tous,
J'ai un script qui ressemble à cela :
<?php $db = odbc_connect('base', '', ''); $query = "SELECT DISTINCT Article.IDArticle, Article.Photo,
Article.Designation, Article.ReferenceInterne, Article.Type,
Article.Concordance, Nomenclature.Quantite, Nomenclature.Repere FROM
Article, Nomenclature WHERE Nomenclature.IDArticle = Article.IDArticle
AND Nomenclature.IDProduit = '$_GET[appareil]' ORDER BY $myorder";
echo '<table>';$req = odbc_exec($db, $query) or die ('Erreur'); while($res = odbc_fetch_array($req)) { echo
'<tr><td>...blahblah...</td>'; if($res['Concordance'] != '0') { $query_trv_maitre = "SELECT IDArticle, Reference FROM
Article WHERE Concordance = '$res[Concordance]' AND Maitre = '1'"; $req_trv_maitre = odbc_do($db, $query_trv_maitre) or die ('Erreur'); $res_trv_maitre = odbc_fetch_array($req_trv_maitre); echo
'<td>'.$res_trv_maitre[Reference].'</td>'; } else { echo
'<td>'.$res_trv_maitre[Reference].'</td>'; } echo
'</tr>'; } echo '</table>'; ?>
Je n'ai jamais eu de probleme avec ce genre de requete avec mysql mais j'ai un probleme que je ne comprend pas avec odbc. Dés que la condition if($res['Concordance'] <> '0') est
remplie, l'affichage change bien, il m'affiche bien
$res_trv_maitre[Reference] au lieu de $res[Reference] mais il sort de
la boucle while tout de suite apres meme si il reste des resultats.
Si je supprime la condition if, tous les resultats s'affichent bien.
Quelqu'un à une idée ???? 
PS : Base hyperfile, version 11 du driver odbc, php5, apache2.2
|
|
vendredi 21 décembre 2007 à 14:08:47 |
Re : Probleme de requetes imbriquees
|
samedi 22 décembre 2007 à 23:53:20 |
Re : Probleme de requetes imbriquees

neigedhiver
|
Réponse acceptée !
Salut,
@morpheus57 : il n'utilise peut-être pas mysqli ou pdo pour la bonne raison qu'il n'utilise pas une base mysql, mais une base hyperfile, moteur développé par PC Soft (éditeur de Windev). Il a pourtant pris la peine de le préciser.
@Vonscott : Je pense que tes requêtes ne sont pas optimisées. Certes, je ne sais pas pourquoi il sort de la boucle while à cause du if, mais je sais que tes requêtes sont mal écrites. En fait, il n'est pas censé sortir du while à cause d'une condition non vérifiée dans un bloc if. A moins que tu n'aies une version bugguée de PHP, ce comportement est à exclure : il s'agit donc probablement d'une erreur de ta part.
Deux choses : tu n'utilises pas de guillemets pour indexer ton tableau $res_trv_maitre. Il y fort à parier que $res_trv_maitre[Reference] provoque une erreur et que du coup, non seulement il sort de la boucle while, mais pire que tout, le script s'interrompt.
Pour le savoir :
error_reporting[E_ALL);
Idem pour $_GET[appareil] et $res[Concordance]
Si la variable $_GET['appareil'] est effectivement définie et qu'aucune erreur n'est affichée (ce qui est déconseillé en développement, ou bien c'est parce que tu travailles sur un site en production, ce qui est déconseillé également) c'est parce que par défaut, si la constante appareil (que php cherche quand ce n'est ni une chaine de caractères ni une variable) n'existe pas, il utilise le mot comme texte, mais en générant une erreur non fatale.
En regardant mieux tes 2 requêtes (la première puis celle que tu effectues sur CHAQUE enregistrement qui satisfait la condition), j'ai vu qu'elles tapent toutes les deux dans la table Article. C'est un vrai gaspi de performances. Ta deuxième requête ne fait que récupérer le champ "Reference" pour l'article en cours : tu gagnerais à le récupérer dans la première requête, même si tu ne t'en sers pas (à cause de la condition). Exécuter autant de requêtes est bien plus gourmand que le stockage d'un champ supplémentaire en mémoire.
Essaie ça :
$query = "SELECT DISTINCT Article.IDArticle, Article.Photo, Article.Designation, Article.ReferenceInterne, Article.Reference, Article.Type, Article.Concordance, Nomenclature.Quantite, Nomenclature.Repere FROM Article, Nomenclature WHERE Nomenclature.IDArticle = Article.IDArticle AND Nomenclature.IDProduit = '" . $_GET['appareil'] . "' ORDER BY $myorder";
echo ' ';
$req = odbc_exec($db, $query) or die ('Erreur');
while($res = odbc_fetch_array($req))
{
echo '| ...blahblah... | ';
if($res['Concordance'] != '0')
{
echo ''.$res['Reference'].' | ';
}
else
{
echo ''.$res['Reference'].' | ';
}
echo ' ';
}
echo ' ';
Par pitié : fais une vérification sur $_GET['appareil'] avant de l'utiliser n'importe comment dans ta requête : c'est la porte ouverte à une magnifique attaque XSS. Il FAUT OBLIGATOIREMENT vérifier ce que tu mets dans ta requête SQL. Au minimum, un stripslashes(), mais le mieux est de faire un traitement poussé pour éviter de péter ta requête avec des caratères binaires.
|
|
lundi 24 décembre 2007 à 11:47:42 |
Re : Probleme de requetes imbriquees

Vonscott
|
Salut neigedhiver,
Merci beaucoup de tes conseils, mais du coup d'autres question se posent.
1 - Excuse moi, une erreur s'est glissé dans le script que je donne ( c'est surement pour cela qu'il t'as semblé bizarre de faire deux requetes pour sortir le meme champ )
if($res['Concordance'] != '0') { $query_trv_maitre = "SELECT IDArticle, Reference FROM Article WHERE Concordance = '$res[Concordance]' AND Maitre = '1'"; $req_trv_maitre = odbc_do($db, $query_trv_maitre) or die ('Erreur'); $res_trv_maitre = odbc_fetch_array($req_trv_maitre); echo '<td>'.$res_trv_maitre[Reference].'</td>'; } else { echo '<td>'.$res[ReferenceInterne].'</td>'; }
En fait si l'article de la premiere boucle à une concordance, rechercher par le biais de la deuxieme requete l'article ayant la meme concordance et avec maitre a 1. Existe t'il un moyen de le faire en une seule requete ??
2 - Je suis deja en error_reporting[E_ALL); Aucune erreur ne s'affiche
Et le script sort de la boucle mais ne plante pas, j'ai bien une page valide, dans la source je retrouve bien </table></html>
3 - Pense tu vraiment que dans la requete '$_GET[appareil]' ou '" . $_GET['appareil'] . "' soit differents ?
4 - Rassure toi, le script donné est "light", je verifie effectivement le contenu de $_GET[appareil] qui est en fait un id A ce sujet, pense tu qu'un simple is_numeric() soit suffisant
|
|
lundi 24 décembre 2007 à 13:56:12 |
Re : Probleme de requetes imbriquees

neigedhiver
|
Salut,
1. "En fait si l'article de la premiere boucle à une concordance, rechercher par le biais de la deuxieme requete l'article ayant la meme concordance et avec maitre a 1.
Existe t'il un moyen de le faire en une seule requete ??"
Certainement. Si tu tapes dans la même table les deux fois, il y a surement moyen d'économiser l'exécution de la deuxième requête (qui est d'ailleurs exécutée pour chaque article listée, si je comprends bien).
N'hésite pas à faire un copier/coller complet (en masquant juste les mots de passes et informations sensibles) : aider à corriger une erreur n'est pas possible sur une moitié de script, l'erreur pouvant être liée à un bout de code omis.
Il y a d'ailleurs un outils sur CS qui permet de faire un copier/coller de code avec colorisation (et que je n'ai jamais vu utilisé par quiconque ici) :
http://tools.codes-sources.com/copy-paste-code.aspx
Je te propose donc de faire un copier/coller complet, et de décrire également ta table (avec le code SQL pour la créer par exemple, que l'on obtient en exportant la table dans phpMyAdmin, ou avec la requête SHOW CREATE TABLE `ma_table`;)
Dis-moi également exactement ce que tu veux faire/obtenir : on verra alors le meilleur moyen de le faire.
2. C'est bizarre... Idem : montre le code entier
3. Oui, c'est vraiment différent. appareil, $appareil et 'appareil' sont 3 choses différentes.
Le premier est une constante, le second une variable, le troisième une chaine de caractères. Utilisé comme clé du tableau $_GET, le résultat est différent dans les 3 cas.
4. Oui, en toute logique, is_numeric devrait suffire. Tu peux aussi convertir en entier avec (int), ou récupérer la valeur entière avec int_val(). Il y a quelques petites différences de l'un à l'autre, qui impliquent un traitement différent pour assigner une valeur par défaut si besoin.
|
|
lundi 24 décembre 2007 à 15:50:57 |
Re : Probleme de requetes imbriquees
|
lundi 24 décembre 2007 à 18:09:01 |
Re : Probleme de requetes imbriquees

neigedhiver
|
J'avoue que j'ai un peu de mal à comprendre tes requêtes.
Tu fais une jointure sur la même table... Quel intérêt ? Je ne dis pas qu'il n'y en a pas, juste que je ne vois pas pourquoi...
Est-ce que tu peux m'expliquer ce que sont "concordance" et "maitre" ?
Que doit faire ta première requête, celle avec UNION ?
Et que doit faire la seconde, celle qui est exécutée autant de fois qu'il y a de concordance ?
J'arrive pas à me plonger dans ce que tu veux faire, je ne comprends pas encore ta logique, donc pas facile...
Cela dit, je ne vois rien qui justifie que le script sorte de la boucle while, si ce n'est le fait qu'il n'y ait plus d'enregistrement...
|
|
mercredi 26 décembre 2007 à 17:50:31 |
Re : Probleme de requetes imbriquees
|
mercredi 26 décembre 2007 à 18:04:46 |
Re : Probleme de requetes imbriquees

Vonscott
|
En fait, le script sert a ceci
Je lui envoie un id d'appareil ($_GET[appareil]) la 1ere requete recupere la liste des pieces contenues par l'appareil dans la table nomenclature (par le champ IDProduit). Chaques enregistrement retourné correspond à un article dont je recupere la reference et la designation, via la jointure pour l'affichage.
Si l'article à une concordance ( piece equivalente ) je relis la table article pour trouver toutes les pieces qui ont la meme concordance mais je selectionne seulement celle qui a Maitre ( booleen ) à 1
En gros si Concordance != 0 alors la piece peut etre remplacé par une autre reference ( meme piece mais achetée chez un autre fournisseur ) Maitre == 1 veut dire que c'est cette piece que nous gerons en stock et celle qui sera fournie au client.
|
|
mercredi 26 décembre 2007 à 23:08:10 |
Re : Probleme de requetes imbriquees

neigedhiver
|
Salut,
Juste un message pour dire que je n'oublie pas ton problème, mais n'étant pas chez moi, je ne suis pas dans des conditions optimales pour reprendre ton code tout en assimilant tes explications : il faut que je m'immerge totalement, ce que je ne pourrai pas faire avant quelques jours...
Si t'es pas pressé à la minute, je tâcherai de m'y coller très prochainement (sans date précise...). Si t'es pressé, ben... si quelqu'un peut jeter un oeil...
Bonnes fêtes de fin d'année ;)
|
|
Cette discussion est classée dans : odbc, article, res, maitre, trv
Répondre à ce message
Sujets en rapport avec ce message
afficher toutes les lignes d'une colonne d'une BDD + infos relatives à 1 ligne [ par ju0123456789 ]
Bonjour, j'ai un petit souci sur un de mes programmes en PHP.Je voudrais créer un espace perso pour les clients, sur un site web, où il y aurait une p
ODBC NUM ROWS - fonction qui renvoie 0 [ par ju0123456789 ]
Bonjour, J'ai un soucis avec la focntion odbc_num_rows, elle me renvoit 0. Voici mon petit code de test : [code=php] // Connexion a la base $sql = "s
tri d'un resultat de requetes [ par ju0123456789 ]
Bonjour, Le but de mon programme est de venir chercher dans une table des RAM les packs de barretes les moins cheres que le client pourra mettre dans
probleme boucle php [ par ju0123456789 ]
Bonjour,Dans le cadre de mon taf, je suis en train de faire un programme qui afficherais les commandes enregistrées dasn la base, j'ai un formulaire
sélectionne OPTION d'un SELECT automatique en fonction d'un choix [ par ju0123456789 ]
Bonjour, J'ai un formulaire, dans lequel j'envoi des données, et tout à partir de la séléction d'un input SELECT.Quand j'envoi le formulaire pour ré
tri d'un SELECT par case à cocher [ par ju0123456789 ]
Bonjour,Je vais essayer de faire simple.J'ai mis en place un petit outil de gestion d'articles en internes, j'ai un select qui lit dans la base et qui
Soustraction de temps [ par Strifer91 ]
bonjours,je suis en train de me tirer les cheveu la dessus.mon but et de voir qui est connecter pour la connection tres simple flag a "O" des qu'il ce
passage des var en paramettre entre le pages [ par ikramta ]
salut tout le monde. dans ma base de donnée j'ai enregistré les données suivant(titre_article, description_article et contenu_article)bon dans la page
[PHP/Access] Erreur ODBC [ par apz ]
Bonjour à tous, Dans un script PHP utilisant ODBC pour ce connecté à une base de données Access, je reçois cette erreur : [QUOTE][quote]Warning: odb
php SQL (ajout) [ par medhamdi12 ]
Bonsoir, SVP je veut réaliser un ajout dans la base avec cette formulaire : "> <span class="St
Livres en rapport
|
Derniers Blogs
ROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGEROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGE par Matthieu MEZIL
Si vous utilisez Roslyn et que vous vous voulez vous simplifier le code du code rewriter, je vous conseille d'installer mon NuGet package RoslynHelper ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|