Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 06/09/2011, 12h02   #1
Invité de passage
 
Inscription : avril 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 4
Points : 0
Points : 0
Par défaut Variable d'entrée non prise en compte

Bonjour à tous,

Je post ici après avoir cherché un peu partout sur le fofo comme sur d'autres site (aucune référence au problème auquel je fais face en ce moment ...). Je précise que je ne suis pas encore un dev chevronné et rompu aux affres du PHP.

J'explique :

Je développe en ce moment une appli en php avec une base mysql.

J'ai créé toutes mes classes, avec des objets qui contiennent d'autres objets et pour lesquelles tout se charge automatiquement au démarrage. Après avoir testé et retesté le bousin, je me suis rendu compte que vu le poids des appels à la base, il valait mieux ne remplir completement ces objets que lorsque cela était vraiment nécessaire (je vous laisse deviner la raison ? bah une grosse perte de temps dans le cas contraire).

Donc là dessus, sur certaines fonctions, je passe un booléen en paramètre pour leur dire s'il faut oui ou non chargé les objets contenus dans les objets recherchés (j'espère que je suis clair ), voir dans la fonction qui pose problème en ce moment, s'il faut enregistrer tous les objets en cascade ou non.

Le problème : quoique je fasse, quelque soit la valeur que je passe en paramètre, elle n'est pas prise en compte (ou plutôt la valeur 'false' est prise en compte à chaque appel).

La question que je me pose, après avoir re-vérifié le script sous toutes les coutures, c'est est ce que cela peut provenir d'un problème de serveur ? (nan, parce que je ne vois vraiment pas ce qui cloche là dedans )

Je vous met un bout de la fonction en question (pas la peine de mettre l'intégralité et de tte façon elle est un peu trop longue pour ça, sans parler de la classe elle même).

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
 
function enregistrer($attr = true)
{
        // Je vous passe l'entrée en matière (vérifications effectuées avant enregistrement des données) et la préparation de la requete, elles ne posent pas problème et la valeur d'entree n'est pas encore utilisée à ce moment là
	if (!Executer($requete))
	{
		return false;
	}
 
	if ($attr)
	{	//	Enregistrement / modification des objets liés
		for ($i=0; $i<$this->nb_objets; $i++)
		{
			if (!$this->les_objets[$i]->set_id($this->id))
			{
				$this->erreur .= $this->les_objets[$i]->erreur;
				return false;
			}
			if (!$this->les_objets[$i]->enregistrer())
			{
				$this->erreur .= $this->les_objets[$i]->erreur;
				$this->sql_erreur .= $this->les_objets[$i]->sql_erreur;
				return false;
			}
		}
	}
 
	return true;
}
J'ai donc plusieurs classes qui fonctionnent sur ce principe, et systématiquement lorsque j'utilise un booléen en entrée, ca ne passe pas (et ca fait quelques heures que je m'arrache les cheveux là dessus )

Help please !
Aldous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 15h18   #2
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149


Ta variable $attr est probablement modifiée, soit avant d'entrer dans ta fonction, soit à l'intérieure de ta fonction. Méfie-toi de l'écrasement de variables causé par un mauvais nommage... Je ne vois que ça
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 16h12   #3
Invité de passage
 
Inscription : avril 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 4
Points : 0
Points : 0
Bah l'appel de la méthode est plutôt simple (enfin l'appel qui pose problème).

La valeur ne peut pas être modifiée avant appel de la méthode, puisque les cas dans lesquels j'enregistre le tout sont très ciblés et dans les scripts où cela se produit, ils sont appelés de cette manière.

Code :
$mon_objet->Enregistrer(true);
(J'ai aussi tenté avec 'Enregistrer(1);', 'Enregistrer("true");', par acquis de conscience, mais pas de changement.)

Et dans la méthode en question, la variable $attr n'est utilisée pour la première fois que dans lors du test (je lui ai changé de nom plusieurs fois pour tester ce genre de bêtises, mais c'est le même résultat).

J'ai beau regarder encore et encore, je ne vois pas d'erreur de codage.

Je me demandais, du coup, si les différentes strates d'objets imbriqués les unes dans les autres ne pouvaient pas poser ce genre de problème, où si l'erreur ne pouvait pas provenir d'un problème de surcharge au niveau du serveur (je n'y crois pas vraiment, mais comme disait Sherlock Holmes dans un des bouquins de Sir Arthur Conan Doyle, "Lorsque vous avez éliminé l'impossible, ce qui reste, si improbable soit-il, est nécessairement la vérité.").

Du coup, je patauge ... et je vais finir par supprimer la condition et faire la maj de chaque objet à chaque fois (mais ca me désole, je n'ai pas pour habitude de laisser un script me dicter ma conduite ).

Merci quand même pour la tentative de réponse, David.
Aldous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 16h14   #4
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Le problème : quoique je fasse, quelque soit la valeur que je passe en paramètre, elle n'est pas prise en compte (ou plutôt la valeur 'false' est prise en compte à chaque appel).
Qu'est-ce qui prouve que l'exécution n'a pas déjà quitté la fonction avant le if ($attr) en question?
On voit qu'il y a un return false conditionnel juste avant, sans parler de la partie de code non montrée.

Pour obtenir des certitudes là-dessus, il suffirait d'ajouter des print dans ton code.
estofilo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 10h39   #5
Invité de passage
 
Inscription : avril 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 4
Points : 0
Points : 0
Lorsque tout se passe correctement la méthode me retourne "true" (et "false" dans chaque cas d'erreur, avec une description de l'erreur lorsqu'elle ressort de la méthode si problème), or à chaque appel je n'ai constaté aucune erreur (je teste le retour de chaque fonction / méthode avant de poursuivre dans mon script.

Quant à la partie du code non montrée, ce ne sont que des vérifications sur les différents champs, leur unicité, leur format, leur existence ou non, (...) avec les mêmes règles de sorties en cas d'erreurs. La totalité des objets créés me donne chaque erreur à chaque niveau, au sein de chaque script écrit avec ces objets, donc si erreur et sortie impromptue il y a, le script s'arrete ...

Ici, le script continue pourtant jusqu'à la fin et reçoit la valeur "true" pour chaque appel de méthode. J'en déduis que les méthodes en question se déroulent jusqu'à la fin sans soucis, puisqu'aucun retour d'erreur. La seule chose qui ne passe pas, c'est la variable d'entrée qui semble ne pas exister lors du lancement des méthodes d'enregistrement.
Aldous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 11h49   #6
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Quand à l'oeil le code n'a pas de problème mais qu'à l'exécution il s'avère qu'il en a , on met des print.
estofilo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 13h36   #7
Invité de passage
 
Inscription : avril 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 4
Points : 0
Points : 0
Je me suis sûrement mal exprimé, mais dans le mode "debug" mis en place, j'ai effectivement le contenu de chaque variable d'affiché à l'écran, en plus du retour d'erreurs dans les différents objets, et lors d'un appel où je passe 'true' dans l'attribut, la variable est affichée comme inexistante (ou nulle si vous préférez)
Aldous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 14h15   #8
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Et bien passe "123" et regarde si elle est "affichée" comme contenant 123.
estofilo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h54.


 
 
 
 
Partenaires

Hébergement Web