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

Langage PHP Discussion :

Variable indéfinie, class [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Par défaut Variable indéfinie, class
    Bonjour,

    Je suis en train de développer un site web et je rencontre un petit soucis avec mes classes PHP.

    J'obtiens une erreur que ma variable $connexion n'est pas défini.

    Voici le code

    connexionBDD2.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
     
    $connexion = new mysqli('localhost', 'nom_user', '');
    $connexion->select_db('nom_BDD') or die("erreur");
     
    ?>
    class covoiturage.php
    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
    class covoiturage
    	{
    		private $AllCovoiturage = array();
     
    		function __construct()
    		{
     
    		}
     
    		function Create()
    		{
                    	include("../../connexion/connexionBDD2.php");
    			$AddCovoiturage = "INSERT INTO covoiturage(// Liste des paramètres												  ) 
     VALUES (//Liste des paramètres)";
    			$reussi = $connexion->query($AddCovoiturage) or die ("Erreur creation ");
                            // Boucle pour implémenter l'array AllCovoiturage
    			if($reussi)
    				echo "<script language='JavaScript'>alert('Votre trajet a bien été créé. Vous le retrouverez dans la section covoiturage ou dans votre profil.')</script>";
                    mysqli_close($connexion);
                    return $this->AllCovoiturage;
                    }
     
      // Plusieurs méthodes du même genre
            }
    class profil.php
    Le code est identique, un constructeur vide, une requete insert avec un return d'un array dans chaque fonction.

    Et dans le code appelant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $Init = new covoiturage();	
    $P = new profil();		
    $tableau = $Init->Create();
    $P = $Init->RetourProfil();
    Et là sur l'appel de la fonction RetourProfil, il me dit que ma variable $connexion de ma class n'est pas défini "error call member is non object" ou un message d'erreur de ce genre.

    Par contre si je supprime la création de l'objet covoiturage() et la méthode appelé Create() ca fonctionne.

    Il peut y avoir des conflits entre méthodes ? Pourquoi ma 2eme variable $connexion n'est pas défini ?

    J'ai essayé de simplifié au maximum le code, j'espère que ca suffira.

    Merci !!

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    En gros ce que tu dis, c'est qu'à chaque fois que tu as besoin d'une connexion tu insères ton fichier connexionBDD2.php qui lui ouvre à chaque fois une nouvelle connexion new mysqli(). Euh c'est bancal. Tu avoueras qu'il serait préférable de n'utiliser qu'une seule et unique connexion pour toutes tes requêtes, non ? Si tu es de cet avis, regarde du côté d'un Singleton.
    Pour ton erreur, il faudrait regarder du côté des logs php.
    Est-ce que les fichiers profil.php et covoiturage.php sont dans le même répertoire ?

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Par défaut
    Bonjour,

    Oui en effet j'inclus à chaque fois mon fichier de connexion car je ne savais pas comment faire autrement :s Je vais regarder du coter des singleton

    Sinon oui toutes mes classes sont dans le même dossier, j'ai une architecture standard je pense :
    Dossier principale
    dossier class
    dossier pages
    dossier js
    ....

    En fait, dès que j'utilise deux objets de deux classes différentes dans la même page, ca me renvoi cette erreur. Jusqu'à présent je me débrouillais pour en utiliser qu'une par page, mais il doit y avoir une raison .. si c'est ma façon de coder faut le dire, je début en PHP objet

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    ... si c'est ma façon de coder faut le dire ...
    Oui, et non.

    En fait, tu rencontre des problème de portées, de visibilité, sur certaines variable (ou Objet, peu importe).
    Ceci n'est pas propre à l'Objet, c'est la même chose en procédural (ou classique).

    Par défaut, une variable n'est pas "visible", dans une fonction, même chose dans une méthode de classe.
    A moins de la déclarer "globale" dans la fonction ou méthode de classe, ou encore de la "passer" en paramètre, de créer une méthode statique, voir autre ...



    En faite, le vrai fond du problème que tu rencontres c'est qu'auparavant tu utilisais très certainement les fonctions mysql_*.
    C'est ce cas là qui est (très) particulier, et non le cas actuel qui lui est normal.
    En exploitant ces fonctions, plus particulièrement lorsqu'on crée une connexion avec la fonction mysql_connect(), MySQL conserve en mémoire cette connexion.
    Du coup, si on exécute un mysql_query() dans une fonction, voire même dans une méthode de classe, il n'y a pas besoin de refaire une connexion.
    MySQL réutilise la dernière connexion effectuée, et cela automatique.
    C'est ce comportement là qui est particulier, qui rend les choses plus facile : On ne rencontre aucun de problème de portée.


    Avec un Objet MySQLi, même chose pour PDO, il n'y a plus cette (re)connexion automatique, il faut faire référence à cette connexion explicitement avec la variable ou Objet qui l'a contient (comme n'importe quelle variable d'ailleurs).


    Conclusion : En utilisant MySQLi tu reviens ni plus ni moins dans une situation normale.
    On ne peux pas exploiter une variable ou Objet non déclarée dans une fonction ou méthode de classe.
    Donc soit :
    - refaire une connexion (très lourd/répétition de code)
    - La passer en paramètre
    - la déclarer en globale (pas propre)
    - créer un singleton (c'est très certainement la technique la plus utilisée)
    - autres techniques encore que je connais pas ...


    Vois tu pourquoi tu rencontres ce problème actuellement ?

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Par défaut
    Merci pour les informations.

    En fait j'ai toujours utilisé mysqli pour les connexions, même quand je codais en procédurale.

    Quand l'erreur affiche que ma variable $connexion n'est pas défini, l'erreur s'affiche dans la class php et pas dans le programme principal.

    C'est l'appel dans le programme principal qui déclenche l'erreur (normal vu que la connexionBDD se fait dans chaque méthode).

    Je pense bien avoir compris cependant que mon erreur se situait au niveau des appels de ma connexion BDD.

    Cependant je vois pas pourquoi, même si je fais un appel à chaque fois, pourquoi au deuxième objet il me dit que ma variable $connexion n'est pas défini, peut-être parce cette variable a déjà était utilisé juste avant dans l'autre objet ? Mais je pensais que mysqli_close() fermait la connexion ainsi que "détruisait" le new mysqli() et donc le $connexion.

    Au niveau des portées des variables je sais à quoi ca correspond, mais là tout le soucis se passe dans les class je suppose .

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Evites de fermer la connexion.
    Normalement MySQL le fait automatiquement dès qu'on ne l'exploite plus, du coup c'est plus rapide de faire manuellement et successivement des connexions/déconnexions.

    Mise à par ça, quel est le code du 2ème Objet ?
    Est-ce qu'une connexion est faite ?

    Attention : Concernant les portées, si tu inclus dans une méthode le code qui effectue la connexion, ça ne veut pas dire que cette connexion soit visible dans une autre méthode.
    Il faut refaire une connexion dans la 2ème méthode. (une méthode c'est comme une fonction, ça a les mêmes spécificités).

    Du coup, au lieu d'inclure le fichier qui fait la connexion dans 1 seule méthode (comme covoiturage::Create), tu peux le faire dans le constructeur, puis la stocker dans une propriété de l'Objet.
    La propriété elle sera visible dans toutes les méthodes de la classe.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class covoiturage {
        protected $connexion;
     
        public function __construct() {
            include("../../connexion/connexionBDD2.php");
            $this->connexion = $connexion;
        }
     
        public function Create() {
            // On exploite la propriété : connexion
            $reussi = $this->connexion->query($AddCovoiturage);
        }
    }
    Ceci dit, ce principe revient presque à déclarer $connexion en global (pas très zen comme principe).

    Penches toi sur la création d'une classe de connexion de MySQLi en singleton.
    Ca se résume à exploiter cette classe de cette manière (sans aucune inclusion)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public function Create() {
            // SQLI étant la classe singleton
            $reussi = SQLI::Instance()->query($AddCovoiturage);
        }
    Toujours est il que je reste étonné que tu n'est pas rencontré ce problème avant (mode procédural) étant donné que tu utilisais déjà MySQLi.


    Au passage, dans ma doc de Php je ne vois pas de fonction mysqli_close(), juste le mode Objet, MySQLi::close().
    C'est à croire quelle n'existerait pas. (Je n'utilise pas MySQLi, mais PDO, donc j'en sais trop rien).
    T'as pas une erreur en appelant cette fonction ?

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

Discussions similaires

  1. Classe javascript, variable indéfinie.
    Par marwen1987 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/04/2009, 20h02
  2. Variable de classe JPanel
    Par Janitrix dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 11/12/2005, 17h50
  3. débutant:utilisation de variable entre classe
    Par troojan dans le forum MFC
    Réponses: 1
    Dernier message: 07/12/2005, 23h31
  4. XMLC_SkinPath : variable indéfinie
    Par johan_barbier dans le forum XMLRAD
    Réponses: 5
    Dernier message: 11/10/2005, 11h04
  5. Réponses: 6
    Dernier message: 23/09/2005, 12h54

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