Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/01/2012, 23h31   #1
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
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...
Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 23h51   #2
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
Pour vous aider à cerner le problème, voici le code de la recherche, isolé de la page :

Code :
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...
Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 15h54   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Dès la première requête, c'est bizarre !
Code :
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 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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 16h43   #4
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
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 :
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
Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 12h06   #5
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
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)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 12h33   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Citation:
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 :
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 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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 13h15   #7
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
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.
Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 13h37   #8
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
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 ?
Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 13h44   #9
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
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)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 14h17   #10
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
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...
Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 14h28   #11
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
Ô 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 !

Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 14h32   #12
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
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)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 14h40   #13
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 8
Points : 1
Points : 1
Ah... Je l'avais fait à la main...
J'avais pas vu le bouton... Je vais cliquouiller alors
Sestifer est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h01.


 
 
 
 
Partenaires

Hébergement Web