IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Impossibilité d'utiliser une requête MySQLi dans une fonction PHP [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Impossibilité d'utiliser une requête MySQLi dans une fonction PHP
    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...

  2. #2
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Pour vous aider à cerner le problème, voici le code de la recherche, isolé de la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <?php
    //connexion à la bdd
    require_once('pagedeconnexion.php');
     
     
    $reqacteurs = $connexion->query('SELECT acteurs.IDacteur, acteurs.Prenom, acteurs.Nom, acteurs.Photoface FROM acteurs'.$reqsexe.' ORDER BY acteurs.Prenom ASC, acteurs.Nom');
     
    			$indice = 0;
    			$_SESSION['champsaisie'][$champfocus]=0; //initialisation de la mémoire de la recherche précédente
     
    		SESSION['nbchoix'][$champfocus] = $reqacteurs->num_rows; //initialisation du nombre de résultats pour les boucles
     
    								//mise en mémoire de tous les résultats dans 3 tableaux 1) ID  2) identité 3) photo
     
    	while ($dataacteurs= $reqacteurs->fetch_array())
    	{
    		$identite[$indice] = $dataacteurs;
    		     if ($identite[$indice]['Nom'] !== "") //condition pour qu il n y ait pas d espace vide en fin de prénom si pas de nom pour l acteur
    		     {
    		           $_SESSION['listetempo'][$champfocus][$indice] = $identite[$indice]['Prenom'].' '.$identite[$indice]['Nom']; //concaténation du prénom et nom et mise en mémoire liste
    		     }
    		     else
    		     {
    			   $_SESSION['listetempo'][$champfocus][$indice] = $identite[$indice]['Prenom'];
    		     }
     
    		$_SESSION['idacteur'][$champfocus][$indice] = $identite[$indice]['IDacteur'];
    		$_SESSION['photo'][$champfocus][$indice] = $identite[$indice]['Photoface'];
     
    		$indice++;	
    	}
     
     
     
    $reqacteurs->free();
    								}
     
    echo "résumé des résultats <br /><br />----------------------------------<br /><br />";
     
    //affichage des résultats pour test de fonctionnement								
    $indice = 0;
    while ($indice<=$_SESSION['nbchoix'][$champfocus])
    	{
    		echo " la variable $dataacteurs vaut : ".var_dump($dataacteurs)."<br />";
    		echo "liste tempo vaut : ".$_SESSION['listetempo'][$champfocus][$indice]."<br />";
    		echo "id acteur vaut : ".$_SESSION['idacteur'][$champfocus][$indice]."<br />";
    		echo "photo vaut : ".$_SESSION['photo'][$champfocus][$indice]."<br />";
    		$indice++;
    	}
    Le code isolé de la page ci-dessus fonctionne parfaitement... Par contre dès que je l'encadre par :
    function($parametre1,parametre2,etc) {
    }

    tout plante...

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Dès la première requête, c'est bizarre !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT acteurs.IDacteur, acteurs.Prenom, acteurs.Nom, acteurs.Photoface 
    FROM acteurs'.$reqsexe.' -- C'est quoi ce .$reqsexe ?
    ORDER BY acteurs.Prenom ASC, acteurs.Nom'
    => Là tu demandes des infos dans la table dont le nom est représenté par la variable $reqsexe dans la base de données "acteurs" alors que dans le reste de la requête, tu fais référence à une table "acteurs" !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT acteurs.IDacteur, acteurs.Prenom, acteurs.Nom, acteurs.Photoface 
    														FROM acteurs WHERE acteurs.sexe= "Masculin" ORDER BY acteurs.Prenom ASC, acteurs.Nom

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    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)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    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".
    Ok, je viens de comprendre. Il s'agit d'un texte complémentaire de requête SQL.
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT acteurs.IDacteur, acteurs.Prenom, acteurs.Nom, acteurs.Photoface 
    FROM acteurs
    '.$reqsexe.'
    ORDER BY acteurs.Prenom ASC, acteurs.Nom'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    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.

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    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 ?

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    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)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    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...

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ô 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 !


  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    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)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  13. #13
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ah... Je l'avais fait à la main...
    J'avais pas vu le bouton... Je vais cliquouiller alors

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/12/2011, 10h07
  2. Réponses: 3
    Dernier message: 07/04/2011, 14h38
  3. Réponses: 6
    Dernier message: 31/05/2010, 14h12
  4. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  5. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo