|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Bonjour,
bloquant sur un point depuis 15 jours je viens demander votre aide. J'ai cherché sur le net et n'ai trouvé nulle part un problème du genre, et donc de solution. Je développe un système de consultation en PHP d'une base de donnée MySQL afin de pouvoir l'alimenter et la consulter en local sur un navigateur internet. J'ai créé une page de recherches dans la base avec plusieurs champs interrogeant les différentes tables. Pour ce faire j'ai créé un mini moteur de recherche (le coeur de ma page) qui au premier caractère entré dans le champ de texte, liste la totalité des réponses correspondantes. Ceci est réalisé par une requête MySQLi en POO. Pour limiter les accès à la base et donc optimiser la recherche, tous les résultats sont mémorisés dans des variable de session PHP. Au caractère suivant saisi, le moteur tri dans les variables de Session et élimine les résultats qui ne correspondent pas. Ainsi, la liste est affinée au fur et à mesure en ne conservant que les résultats pertinents. Pour optimiser le code, j'ai donc inclu les requêtes mySQLi dans une fonction PHP. Au départ tout avait été écrit en MYSQL standard et tout fonctionnait parfaitement. Depuis j'ai traduit l'ensemble du site en MySQLi et depuis cela ne fonctionne plus. J'ai isolé toutes les parties et tout fonctionne parfaitement, tant que je ne les mets pas dans la fonction. Pourquoi le MySQLi est il-incompatible avec une utilisation dans une fonction PHP ? Elément bizarre, si les requêtes MySQLi sont écrite en POO, dès qu'il les atteint, le navigateur interrompt tout fonctionnement et plus rien n'est affiché. Si j'écris les requêtes en procédural, les requêtes ne donnent aucun résultat, mais la page est interprétée complètement par le navigateur... Je n'ai pas d'autre solution que de d'intégrer les requêtes en dur dans la page si je ne trouve pas l'origine de ce dysfonctionnement, mais cela me triplera inutilement la taille de la page. De plus les requêtes étant différentes suivant les champs concernées, il faut que je réécrive sous 3 formes différentes la recherche... En sachant que j'ai fait cela il y a quelques mois et que c'est suffisamment compliqué pour que je ne sache plus exactement comment cela fonctionnait... Bref un gros boulot que j'aimerai éviter... Merci de votre aide... |
|
|
00
|
|
|
#2 | ||
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Pour vous aider à cerner le problème, voici le code de la recherche, isolé de la page :
Code :
function($parametre1,parametre2,etc) { } tout plante... |
||
|
|
00
|
|
|
#3 | ||
![]() ![]() |
Dès la première requête, c'est bizarre !
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Je me doutais que cela vous poserait quelques interrogations, j'ai d'ailleurs failli ne pas laisser cette variable dans la requête pour ne pas vous induire en erreur.
Cette variable complète la requête en permettant de l'affiner. Plutôt que d'écrire une requête par cas, la variable prend une valeur suivant le type de données recherchées suite à des tests plus haut dans la page. Avec cette fonction de tri, cela me permet d'obtenir des résultats sur 5 champs différents, d'acteurs et de films. Elle comprend 3 requêtes choisies par des If then qui choisissent la requête en fonction du champ de recherche utilisé. C'est pourquoi je ne souhaite pas devoir réécrire toute la page et que j'aimerai sauver cette fonction : elle fait tout le boulot de la page à elle seule. Pour répondre au pourquoi de cette variable, elle permet de ne sélectionner que les acteurs de sexe masculin ou que les acteurs de sexe féminin. Suivant le cas, elle contiendra un WHERE acteurs.Sexe = "Masculin" ou WHERE acteurs.Sexe = "Féminin". Je ne pense pas que le problème vienne de là : cela fonctionne très bien sous MySQL, même dans la fonction, et MySQLi tant que je l'utilise pas dans la fonction. En relisant le message, je confirme : acteurs est bien la table, le nom de la base n’apparaît que dans la connexion. Une fois la valeur dans la variable cela donne la requête suivante : Code :
|
||
|
|
00
|
|
|
#5 |
![]() ![]() Développeuse PHP/Java Inscription : avril 2007 Messages : 3 671 ![]() |
Bêtement : tu n'aurais pas un problème de portée de variables ? Si tu places dans une fonction, il faut que toutes les variables assignées à l'extérieur de la fonction soient passées en paramètre (ou globales).
Tu as un message d'erreur ? (sinon, essaye de mettre le niveau d'erreur au maximum)
__________________
Modératrice PHP Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) |
|
|
00
|
|
|
#6 | |||
![]() ![]() |
Citation:
D'où l'intérêt d'écrire son code de façon claire et aérée avec indentation pour faciliter la compréhension. Tu aurais dû l'écrire de cette façon : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Merci à vous deux pour ces avis.
Je n'ai pas eu le temps ce matin, mais je vais regarder du côté de cette variable. Pour l'indentation effectivement, j'essaie de l'appliquer au mieux pendant le développement, mais là j'ai fais un copier-coller du code que j'ai du reprendre à la main pour lui donner la bonne forme ici. Je suis passé à travers cette ligne. Désolé. (d'autant que pour être honnête, j'avais pas indenté à ce niveau là dans mon code, je n'y avais pas pensé @ Celira : tu as peut-être une bonne piste. Vu que ça marchait avec le MySQL standard, j'ai pas cherché de ce côté là en fait. Cette variable n'est effectivement pas passée en paramètre. Je vais essayer avec cette méthode, je vous dirai ce qu'il se passe. Pour les messages d'erreur, le MySQLi était censé être nettement mieux de ce côté... Perso je trouve que c'est la plaie : un bon vieux die en MySQL me donnait plus d'info auparavant. J'ai beau avoir activé l'affichage des erreurs comme précisé dans le manuel, quand ça plante, le navigateur me raconte pas grand chose. Il m'est même arrivé d'avoir des plantages à cause de l'activation de l'affichage des erreurs. Bref je teste le passage de paramètres et je vous dis. |
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Mon optimisme précédent vient de retomber :
en vérifiant le code du fichier original (je vous ai fourni une partie allégée qui me sert de page de test pour trouver l'erreur), j'ai constaté que : - le problème ne vient de la variable : elle est bien passée en paramètre dans la fonction ; - j'avais bien indenté instinctivement comme tu l'avais demandé CinePhil... C'est à force de tester des tas de trucs dans le fichier test que je me suis relâché dans l'écriture... Ce que je trouve étrange c'est qu'en POO la fonction bloque complètement, alors qu'en procédural elle passe. Il y a un truc bizarre là non ? |
|
|
00
|
|
|
#9 |
![]() ![]() Développeuse PHP/Java Inscription : avril 2007 Messages : 3 671 ![]() |
Euh... Ta variable $connexion correspond à new PDO(/*infos de connexion*/) je suppose. Elle aussi est passée en paramètre de la fonction ?
(en fait, ce serait plus simple si tu nous montrais la version fonction du code)
__________________
Modératrice PHP Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Oui, $connexion est bien le nom de la connexion.
Celle-ci est établie dans un fichier séparé appelé en début de page. Ca passe en intermédiaire, pour simplifier le debuggage, par une extension de la classe MySQLi. Je veux bien vous donner le code de la fonction complète, mais promettez moi de pas me taper la tête si c'est mal indenté... Le code est assez long et je ne suis pas sûr de m'en sortir en remettant en forme ici EDIT : Et effectivement, elle n'est pas passée en paramètre... Je tente le coup... |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Ô Celira ![]() Un jour fais moi penser à t'élever un temple !!!!!!!!! Mille mercis !!!!!!!!!! Tu viens de me résoudre en 2 minutes un problème sur lequel je bloquais depuis 2 semaines (même si je n'étais pas à 100 % dessus... (je dois aussi consacrer du temps à gérer le remplacement de ma chaudière parce que coder en blouson c'est pas le top). J'ai bêtement tout traduit les requêtes sans penser que la connexion était aussi une variable... (que j'aurai ma foi supposée globale...). J'ai pas tout testé pour voir si ça fonctionne intégralement, mais la recherche sur le premier champ fonctionne et j'ai des résultats dans mes listes. Infiniment merci, tu as sauvé ma fonction !
|
|
|
00
|
|
|
#12 |
![]() ![]() Développeuse PHP/Java Inscription : avril 2007 Messages : 3 671 ![]() |
un p'tit clic sur
alors
__________________
Modératrice PHP Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) |
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : janvier 2012 Messages : 8 ![]() |
Ah... Je l'avais fait à la main...
J'avais pas vu le bouton... Je vais cliquouiller alors |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com