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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du 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
    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
    Nouveau membre du 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
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Nouveau membre du 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
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

+ 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