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 :

Utiliser une fonction autoloader


Sujet :

Langage PHP

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut Utiliser une fonction autoloader
    J'ai mis dans mon fichier principal une fonction d'autoload, mais elle ne marche pas et donc je suis obligé d'inclure la définition de la classe dans le 2e fichier où elle est utilisée. Peut-on me dire pourquoi ?

    autoloader dans index.php (fichier principal) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function my_autoloader($class) {
        echo "chargement du fichier (autoloader) : ".__DIR__.'\new\class_'.$class.'.php';
        include __DIR__.'\new\class_'.$class.'.php';
    }
     
    spl_autoload_register('my_autoloader');

    Je dois mettre l'inclusion de la définition de la classe dans le 2e fichier de connexion :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    if(empty($bdd_planning)){
    	include_once (__DIR__.'\\new\class_MyPdo.php');
    }
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
    				$bdd_planning = new MyPdo("planning_dev");
    			}
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}
    ?>

  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
    Salut,

    pour que l'autoloader fonctionne tu dois penser à l'initialiser au moins une fois à chaque requête serveur.
    Pour cela, tu devrais regrouper toutes les fonctions d'initialisation dans un fichier du genre bootstrap.php qui serait requis au début de tous les scripts avec un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once 'path/to/bootstrap.php';
    Pour rester propre, un autoloader doit renvoyer false en cas d'échec et passer la main à un autre autoloader qui aurait été enregistré.
    D'ailleurs avant de faire un include tu devrais t'assurer quand même de l'existence du fichier avec un if (is_file($full_path)) { include $full_path; }

  3. #3
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    Salut Laurent,
    Je croyais que tu avais réussi à le faire marcher, ton autoload... c'est quoi ton message d'erreur ? Toujours Class 'class_MyPdo' not found ?

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    pour que l'autoloader fonctionne tu dois penser à l'initialiser au moins une fois à chaque requête serveur.
    Pour cela, tu devrais regrouper toutes les fonctions d'initialisation dans un fichier du genre bootstrap.php qui serait requis au début de tous les scripts avec un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once 'path/to/bootstrap.php';
    OK, mais alors que gagne-t-on par rapport à inclure dans les fichiers utilisant une classe, le fichier où elle est définie ?

    Citation Envoyé par kalimukti Voir le message
    Je croyais que tu avais réussi à le faire marcher, ton autoload... c'est quoi ton message d'erreur ? Toujours Class 'class_MyPdo' not found ?
    Moi aussi, je le croyais mardi soir, mais depuis hier matin, j'ai de nouveau le message d'erreur que tu cites.

  5. #5
    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
    Salut,

    on y gagne énormément, une fois que le moyen de trouver un fichier est indiqué dans un autoloader, tu ne fais qu'utiliser les classes dans tes codes sans te préoccuper de savoir où elle sont implémentées.
    L'autoloader se débrouille pour trouver le fichier adéquate au premier appel et le charge pour toi.
    Donc quand t'utilises 20 classes différentes dans un script, tu ne te préoccupes pas de les inclure une par une en début de script... Tu y gagnes forcément.

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 325
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    j'ai de nouveau le message d'erreur que tu cites.
    ? mais puisque tu as inséré cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "chargement du fichier (autoloader) : ".__DIR__.'\new\class_'.$class.'.php';
    tu devrais nous retourner le retour de l'écho (et l'erreur exacte). Si l'echo n'est pas affiché alors c'est que ta fonction my_autoloader() n'est pas chargée...

  7. #7
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Y voir plus clair quand on a 20 classes...C'est sûr qu'en ayant pour l'instant une seule, je ne voyais pas...

    L'echo exact que j'obtiens est
    chargement du fichier (auto_loader) : C:\wamp\www\eis\eis\new\class_MyPdo.php
    et le message d'erreur est
    Fatal error: Class 'MyPdo' not found in C:\wamp\www\eis\eis\connect_mysql.php on line 9

  8. #8
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    Salut Laurent,

    Le problème de ton problème, c'est qu'il n'existe pas dans mon environnement de test. Chez moi, il trouve les classes autolodées...
    Quelle est ta version de php ? (< 5.1.2, spl_autoload_register n'existe pas, peut-être cela vient de là).

    En tout cas, tu peux tester le code suivant, qui fonctionne sur mon wampserver.

    structure:
    Nom : structure_code.jpg
Affichages : 161
Taille : 19,1 Ko

    codes:
    index.php à la racine :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    session_start();
    error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);
    ini_set('display_errors','1'); 
     
    header('Content-type: text/html; charset=UTF-8');
    require_once 'lib/utils/Autoload.php';
     
    include ('connect_mysql.php');
     
    $maClasse = new maClasse();
     
    $maClasse->__toString();


    connect_MySQL.php :
    Code php : 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
     
    <?php
    /*if(empty($bdd)){
    	include_once (dirname(__DIR__).'\\eis\new\class_MyPdo.php');
    }*/
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
        $bdd = new MyPdo("dbName");
        var_dump("?????");
    }
    catch(PDOException $e){
        echo "argggggggggggggg".$e->getMessage();
        return(FALSE);
    }		
    ?>

    lib/db/class_MyPdo.php :
    Code php : 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
     
    <?php
     
    // MyPDO
    class MyPdo extends PDO {
     
    	protected $DB_NAME;
    	protected $HOST = "localhost";
    	protected $USER ="root";
    	protected $PASS ="xxxxxxxx";
     
     
     
    	function __construct($db_name) {	
     
     
    	$this->DB_NAME = $db_name;
    	parent::__construct("mysql:host=$this->HOST;dbname=$this->DB_NAME",$this->USER,$this->PASS);
     
    	}
     
    }
    ?>

    lib/utils/Autoload.php :
    Code php : 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
     
    <?php
     
        set_include_path(PATH_SEPARATOR.dirname(dirname(__FILE__)));
        //echo(get_include_path());
        spl_autoload_register(function ($classe) {
            $possibilities = array(
                "db/class_".$classe . '.php',
                "autres/class_".$classe . '.php',
            );
            foreach ($possibilities as $file) {
                if (file_exists(dirname(dirname(__FILE__)).'/'.$file)) {
                    //echo $i." autoload ".$file."<br />";
                    require_once($file);
                    return true;
                }
            }
            return false;
        });

    lib/autres/class_maClasse.php :
    Code php : 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
     
    <?php
    class maClasse {
        //put your code here
     
        function __construct() {	
     
     
    	var_dump("construct de ". get_class($this));
     
        }
     
        public function __toString() {
            echo("toString de ". get_class($this));;
        }
    }

    Et avec tout ça, respecte la casse car une majuscule rajoutée ou enlevée et plus rien de marche !

  9. #9
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas un problème de version, vu que comme toi, je teste avec Wampserver et que phpinfo donne la version 5.5.12...

  10. #10
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    tu as pu testé le code que je te propose ?

  11. #11
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Désolé d'avoir mis du temps à répondre ; ça a l'air de marcher car pas de message d'erreur ; j'essaierai donc de m'en inspirer (quand j'aurai le temps car une autre urgence).

  12. #12
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    ça y est, j'ai fait l'essai mais ai un souci. Voici le détail :

    dans mon fichier principal, j'initialise la connexion à mes 2 bdd (donc création des 2 variables $bdd et $bdd_planning) :

    connect_mysql.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
    				$bdd = new MyPdo("su_dev_eis");
      }
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}		
    ?>

    connect_mysql_planning.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
    				$bdd_planning = new MyPdo("planning_dev");
    			}
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}
    ?>

    dans index.php, ces 2 fichiers sont includés :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    include (dirname(__DIR__).'\\eis\connect_mysql.php');
    include (dirname(__DIR__)."\\eis\connect_mysql_planning.php");

    Ils utilisent tous les 2 la classe MyPdo et dans index.php, il y a un autoload :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set_include_path((dirname(__FILE__)));
    spl_autoload_register(function ($classe) {
    		echo "classe:".$classe."<br/>";
    		$name_class="new/class_".$classe . '.php';
                    if (file_exists($name_class)) {
                    require_once($name_class);
    				return true;
    				}	
    		else if (file_exists((dirname(__FILE__))."/".$name_class)) {
                    require_once((dirname(__FILE__))."/".$name_class);
    				return true;
    				}
    		return false;
            });

    et la classe est définie par new/class_MyPdo.php :
    Code php : 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
    <?php
    error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);
    ini_set('display_errors','1'); 
     
    // MyPDO
     //  la classe MyPdo hérite de la classe PDO (extends)
    class MyPdo extends PDO {
     
    	protected $DB_NAME;	
    	protected $HOST = "localhost";
    	protected $USER ="root";
    	protected $PASS ="";
     
    //le constructeur de MyPdo appelle le constructeur de PDO en lui passant ses paramètres	
    	function __construct($db_name) {	
     
    	$this->DB_NAME = $db_name;
    	parent::__construct('mysql:host=' . $this->HOST . ';dbname=' . $this->DB_NAME,$this->USER,$this->PASS);
    	}
     
    }
    ?>

    Or un fichier indépendant de index.php doit aussi accéder à $bdd_planning.

    Je refais donc la connexion : include_once dirname(dirname(dirname(__DIR__))).'//connect_mysql_planning.php'; mais message d'erreur :
    Fatal error: Class 'MyPdo' not found in C:\wamp\www\eis\eis\connect_mysql_planning.php on line 8

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 325
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Je refais donc la connexion : include_once dirname(dirname(dirname(__DIR__))).'//connect_mysql_planning.php'; mais message d'erreur :
    euuuuu c'est une blague ?
    as tu une idée de ce que fait la fonction dirname() et ce que représente __DIR__ ?
    dirname(__FILE__) c'est la même chose que __DIR__

  14. #14
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    3 choses:
    tu dis que tu refais un include de ton deuxième objet pdo, mais pourquoi ?
    tu as bien dans index:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    include (dirname(__DIR__).'\\eis\connect_mysql.php');
    include (dirname(__DIR__)."\\eis\connect_mysql_planning.php");
    à quoi te sert un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include_once dirname(dirname(dirname(__DIR__))).'//connect_mysql_planning.php';
    qui en plus est différent du premier et visiblement faux (si le premier est juste)
    --> d'où ma deuxième remarque: dirname(__FILE__) est sans doute ce que tu voulais marquer, et pas dirname(__DIR__), comme le dit papajoker

    et enfin, pour des question de clarté dans ton code et de structure, je te conseillerais d'externaliser ton autoload, comme je t'en ai montré l'exemple dans le code envoyé précédemment, simplement parce que tu risques d'en avoir besoin dans d'autres fichiers qu'index... et perso, ça me permet d'être plus clair avec ce que je fais, comme quand on sort la connexion avec la base des fichiers qui s'en servent....
    (enfin, idéalement, j'aurais tendance à confier à une classe cette connexion, mais bon...)

  15. #15
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Merci de vos réponses ; il y avait en effet confusion entre __DIR__ et __FILE__ et les 2 include logiques dans index.php sont :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    include (dirname(__FILE__)."\\connect_mysql.php");
    include (dirname(__FILE__)."\\connect_mysql_planning.php");
    Le 2e include (corrigé : include_once dirname(dirname(dirname(dirname(__FILE__)))).'//connect_mysql.php';), c'est car ce script est indépendant de index.php (il est appelé par un lien html) d'où la nécessité de recréer une variable de connexion. Le nombre de dirname, c'est car ce fichier est 3 niveaux sous index.php.

    Par contre, après mes corrections, je tombe sur un autre problème ; j'ai un fichier qui est l'action d'un formulaire contenu par index.php. Ce fichier doit aussi se connecter à une des bdd, donc de nouveau une inclusion (include (dirname(__FILE__).'\\connect_mysql.php');)sauf que la classe n'est pas trouvée :
    Fatal error: Class 'MyPdo' not found in C:\wamp\www\eis\eis\connect_mysql.php on line 9

  16. #16
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Par contre, après mes corrections, je tombe sur un autre problème ; j'ai un fichier qui est l'action d'un formulaire contenu par index.php. Ce fichier doit aussi se connecter à une des bdd, donc de nouveau une inclusion (include (dirname(__FILE__).'\\connect_mysql.php');)sauf que la classe n'est pas trouvée :
    Ok, je crois que je commence à avoir une théorie sur tes problèmes: ce fichier, pour le formulaire, tu l'includes dans index.php ?
    Si c'est le cas, déjà tu n'as pas besoin de refaire un include de tes fichiers de connect: tu as déjà une instance de tes / ta classe pdo faite au début d'index.php et elle va te servir sur tous les fichiers que tu va insérer par include dans index.php...

    ensuite: mettons que tu as un fichier formulaire.php dans ../include/form/formulaire.php ou les deux points représentent la racine de ton site.
    Avec une certaine logique, dans formulaire.php, pour aller chercher connect_mysql.php, si ce dernier est à la racine du site, il te faudra, comme dans ton code:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    include_once dirname(dirname(dirname(__DIR__))).'/connect_mysql_planning.php';
    (parce que formulaire.php a disons une profondeur de 3 par rapport à la racine...)

    Mais, et c'est là qu'il me semble y avoir un problème, vu que tu include formulaire.php dans ton index.php, la profondeur de formulaire.php n'est plus de 3 mais de zéro (la même qu'index.php)... donc ton include va chercher ta classe pdo dans un endroit de ta structure de fichiers qui n'existe pas.... (avec
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    include_once dirname(dirname(dirname(__DIR__))).'/connect_mysql_planning.php';
    tu va chercher un fichier non plus à la racine de ton site, mais trois profondeur de fichiers plus hautes qu'index.php... et il le trouve pas)
    Ca te paraît pertinent comme analyse?

  17. #17
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 325
    Par défaut
    et sinon peut-être plus simple, utiliser $_SERVER['DOCUMENT_ROOT']
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include $_SERVER['DOCUMENT_ROOT']."/lefichier.php"
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    spl_autoload_register(function ($classe) {
                    ...
                    require_once $_SERVER['DOCUMENT_ROOT']."/new/class_".$classe.".php"

  18. #18
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    Citation Envoyé par papajoker Voir le message
    et sinon peut-être plus simple, utiliser $_SERVER['DOCUMENT_ROOT']

  19. #19
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    M... perdu une longue réponse...rebelote.

    En vous lisant, j'ai cru que Papajoker m'avait donné une solution miracle, mais le message d'erreur cité au post #15 est toujours là



    ( ! ) Fatal error: Class 'MyPdo' not found in C:\wamp\www\eis\eis\connect_mysql.php on line 9

    ...

    1 0.0040 141080 {main}( ) ..\authenticate2.php:0
    2 0.0070 153880 include( 'C:\wamp\www\eis\eis\connect_mysql.php' ) ..\authenticate2.php:3
    Je vais essayer de décrire le code en détail :

    index.php :

    Code php : 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
    <?php
    error_reporting(E_ALL ^ (E_NOTICE|E_WARNING|E_DEPRECATED));
    header('Content-type: text/html; charset=UTF-8');
    session_start();
     
    //autoload pas encore ds un fichier séparé !
    set_include_path((dirname(__FILE__)));
    spl_autoload_register(function ($classe) {
    		$name_class="new/class_".$classe . '.php';
            if (file_exists($name_class)) {
                    require_once($name_class);
    		return true; }	
     
    		return false;
            });
     
    echo $_SERVER['DOCUMENT_ROOT'].'eis/eis/connect_mysql.php';
    include $_SERVER['DOCUMENT_ROOT'].'eis/eis/connect_mysql.php';
    include $_SERVER['DOCUMENT_ROOT'].'eis/eis/connect_mysql_planning.php';
    ...
     
    if ( ! $_SESSION["auth"])
    {
     
    ?>
    <form action="authenticate2.php" method="post">
    <span>Welcome on intranet website P&A</span>
    <table style=" border-width:1px; border-style:solid;  border-color:black;"><tr><td>
          <fieldset>
            <legend>Enregistrement / Registration</legend>
    		<table>
    		<tr><td>
                 Login :</td> <td>
              <input type="text" name="login" id="login" value="<?php echo isset($_COOKIE['user'])?$_COOKIE['user']:"";?>" />
            </td></tr>
            <tr><td>
            Password :</td> <td>
              <input type="password" name="password" id="password" value="<?php echo isset($_COOKIE['pwd'])?$_COOKIE['pwd']:"";?>" /> <td/>
    		  </tr><tr><td colspan="2">
              <input type="submit" name="submit" value="Connexion / Connection" />
            </td></tr>
    		</table>
          </fieldset>
    	  </td></tr></table>
    </form>
    <?php
     
    }
    ...

    authentifcate2.php :

    Code php : 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
    <?php 
    session_start();
     include $_SERVER['DOCUMENT_ROOT'].'eis/eis/connect_mysql.php';
     
     function authentification()
    {
    		global $bdd;
     
    		$auth=false;
     
    		$sql = 'select * from `users`';
    		$qid = $bdd->prepare($sql);
    		$qid->execute();
    		while ($row=$qid->fetch(PDO::FETCH_ASSOC) ) {		
    				$usr = $row['user']; 
    				$password = $row['password'];  
    				if (($usr == $_POST['login']) && ($password == $_POST['password'])) {
    					$auth = true;
     
    					$_SESSION['user']=$usr;
    					$_SESSION['pass']=$password;
    					$temps = 365*24*3600;
    					setcookie ("user",$usr, time() + $temps);
    					setcookie ("pwd",$password, time() + $temps);
    				}
    		  }
     
    	$auth=true;
    	$_SESSION['auth']=$auth;
     
     return $auth;
    }
     $auth=authentification();
     header('Location:index.php?auth='.$auth);
     exit();
     
     
    ?>

    connect_MySQL.php :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
    				$bdd = new MyPdo("su_dev_eis");
     
      }
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}		
    ?>

    ...et comme j'avais un doute sur la connexion bdd avec l'autoload, j'ai fait un test qui marche :

    testpdo2.php :

    Code php : 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
    <?php
    header('Content-type: text/html; charset=UTF-8');
     
    set_include_path((dirname(__FILE__)));
    spl_autoload_register(function ($classe) {
    		$name_class="new/class_".$classe . '.php';
            if (file_exists($name_class)) {
                    require_once($name_class);
    		return true;
    		}	
    		return false;
            });
    //// connexion
    include $_SERVER['DOCUMENT_ROOT'].'eis/eis/connect_mysql.php';
     
    try{
    				// exécuter un select puis afficher les lignes
    				$sql='select * from `users` order by nom';
    				$qid = $bdd->prepare($sql);
    				$qid->execute();
     
    				$cpt=0;
    				while( $ligne=$qid->fetch(PDO::FETCH_OBJ) ) {
    					echo "name : ".$ligne->nom."  firstname : ".$ligne->prenom." <br/>";
    					$cpt++;
    					}
    				echo "nb de lignes=".$cpt;
    			}
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    			}
    ?>

  20. #20
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    réponse rapide:
    Tu ne mets pas d'autoload dans ton fichier authentifcate2.php, c'est pour ça qu'il trouve pas ta classe... et c'est pour ça que je te disais d'externaliser ton code d'autoload, comme je t'en ais donné l'exemple, comme ça tu n'as plus qu'à en faire un include dans tous les fichiers qui en ont besoin...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WD9] Utiliser une fonction d'un ActiveX avec pointeur
    Par archimor dans le forum WinDev
    Réponses: 3
    Dernier message: 21/03/2006, 01h41
  2. [Débutant] Déclarer, utiliser une fonction
    Par Hokagge dans le forum Langage
    Réponses: 7
    Dernier message: 14/03/2006, 09h03
  3. Réponses: 10
    Dernier message: 10/02/2006, 15h23
  4. DAO impossible d'utiliser une fonction dans un requete
    Par exter666 dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/09/2005, 18h15
  5. Utiliser une fonction
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/08/2005, 08h53

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