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 :

classe non trouvée malgré autoloader ET include du fichier contenant la classe [POO]


Sujet :

Langage PHP

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut classe non trouvée malgré autoloader ET include du fichier contenant la classe
    Bonjour,

    mon code contient un formulaire html et quand on va sur l'action du formulaire, j'utilise aussi la POO mais il ne trouve pas les classes quand je veux les instancier. Bien qu'étant sûr d'avoir déjà lancé l'autoloader, comme on est dans l'action d'un formulaire, au cas où celui-ci ne soit pas pris en compte, j'ai rajouté un include du fichier de la classe (comme ça marchait pas) mais pas mieux. Comment faire SVP ?

    URL appelée : http://localhost/eis_oo2/index.php?page=layout.
    On passe par index.php qui lance donc l'autoloader :
    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
    $page=$_GET['page'];
    //autoloading
    include_once 'Autoloader.php';
    include_once 'connect\connect_mysql.php';
     
    use _classes\Bdd\Bdd;
     
    $Bdd = new Bdd();
    $Bdd->connect('localhost','support_eis', 'root', '');
     
    if (isset($page)) {
        include("page/".$page.".php");
    }
     
    ?>]
    Et là, on instancie la classe Bdd et pas d'erreur.
    Je lance ici la page layout.

    layout.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
    <?php 	require_once(dirname(__DIR__).'\_includes\html0-topPHP.php'); // INIT + FONCTIONS et autres config en PHP
    // -----------------------------------------------------------
    // page DEFAUT
    // -----------------------------------------------------------
     	// ICI, on peut mettre des traitements PHP,....  SPECIFIQUE A LA PAGE
     
    	 require_once(dirname(__DIR__).'/_includes/html1-debut.php'); // contient le DEBUT du code HTML, le contenu de <head> SANS la balise </head> 
     
     	// ICI, on peut mettre des scripts, CSS SPECIFIQUE A LA PAGE (donc AVANT la  balise </head>)
     
     	require_once(dirname(__DIR__).'/_includes/html2-milieu.php'); // contient la balise </head>et le DEBUT du <body>, A PARTIR DE la balise </head> 
     
    echo 'layout<br/>';
    	require_once(dirname(__DIR__).'/_includes/html3-fin.php'); // contient la FIN du code HTML, jusqu'au </body></html> ?>
    Le fichier layout.php contient notamment html2-milieu.php qui contient notamment un formulaire 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
    15
    16
    17
    18
    	...
    if (!isset($SESA)||empty($SESA)) {
    	?>
    			<main>
                <form class="form-signin" action="<?php echo SITE_URL_HTTP;?>/page/authenticate2.php" method="post">
          <img class="mb-4" src="<?=  SITE_URL_HTTP.'/image/bootstrap-solid.svg' ?>" alt="" width="72" height="72">
          <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
          <label for="inputEmail" class="sr-only">Email address</label>
          <input type="text" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
          <label for="inputPassword" class="sr-only">Password</label>
          <input type="password" id="inputPassword" class="form-control" placeholder="Password" required>
     
          <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
          <p class="mt-5 mb-3 text-muted">&copy; 2019-2020</p>
        </form>
     
    			</main>
    ...
    L'action du formulaire est authenticate2.php qui utilise la POO mais problème pour instancier les classes :
    authenticate2.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    echo dirname(dirname(__DIR__))."\\eis_oo2\_classes\Authent\Authent.php"."<br/>";
    include_once dirname(dirname(__DIR__))."\\eis_oo2\_classes\Authent\Authent.php";
    use _classes\Authent;
    use _classes\Bdd;
     
    $auth=new Authent();
    $Bdd=new Bdd();
    $Bdd->connect('localhost','support_eis', 'root', '');
    $auth->Authentification($Bdd);
    ?>
    Error: Class '_classes\Authent' not found in C:\wamp64\www\eis_oo2\page\authenticate2.php on line 7
    Comment faire ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu n'es pas cohérent : comme tu dis que tu n'arrives pas à mettre en place la redirection globale au niveau d'apache, tu t'es rabattu sur l'autre approche : /index.php?page=xxx or dans ton formulaire tu fais action="<?php echo SITE_URL_HTTP;?>/page/authenticate2.php" method="post". Cela devrait être plutôt : /index.php?page=authenticate2.

    As-tu pris le temps de poser sur le papier un schéma global de fonctionnement ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je te remercie pour ta vigilance. En fait, j'y avais pensé un moment mais oublié...
    La bonne action (en local) est /eis_oo2/index.php?page=authenticate2.
    J'ai corrigé, mais le message d'erreur reste...

    As-tu pris le temps de poser sur le papier un schéma global de fonctionnement ?
    ça risque pas vu qu'avec mon handicap, l'écriture manuelle est super difficile (et illisible)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Allez on va reprendre : tous tes liens doivent être de la forme /index.php?page=xxx :

    ton fichier index.php dot être de cet acabit :
    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
    <?php
     
    // Gestion des constantes
    define('URL_HOME', 'http://localhost/eis_oo2');
    // Base de données
    define('DB_SCHEME', 'mysql');
    define('DB_HOST', 'localhost');
    define('DB_NAME', 'db_eis_oo2');  // ici tu mets le nom de ta base de données
    define('DB_PORT', '3306');
    define('DB_USER', 'root');        // utilisateur
    define('DB_PWD', '');             // mot de passe
     
    include 'Autoloader.php';
     
    // On vérifie ce qui est reçu par le script : et surtout si le jeton 'page' est renseigné
    if (( ! empty($_GET['page'])) && ctype_alnum(($_GET['page'])) {
        $file = DIR_NAME.'page'.DIRECTORY_SEPARATOR.$_GET['page'].'.php';
        if (is_file($file)) {
            include $file;
            exit;
        }
    }
     
    // par défaut : tu renvoies toujours la page d'accueil : qu'elle soit demandée ou en cas d'erreur
    // ici, je suppose que tu as un fichier /page/home.php qui se charge de construire la page d'acceuil
    $file = DIR_NAME.'page'.DIRECTORY_SEPARATOR.'home.php';
    include $file;
    Ton fichier Bdd doit être légèrement modifié comme ceci pour tenir compte de mes modifications :
    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
    <?php
     
    namespace _classes\Bdd;
     
    class Bdd
    extends \PDO
    {
        private static $pdo;
     
        public function __construct()
        {
            if (self::$pdo === null) {
                $dsn = DB_SCHEME.':host='.DB_HOST.';port='.DB_PORT.';dbname='.DB_NAME.';charset=utf8';
                self::$pdo = new \PDO($dsn, DB_USER, DB_PWD);
            }
            return self::$pdo;
        }
    }
    je vais regarder les vues

  5. #5
    Invité
    Invité(e)
    Par défaut
    1--
    Citation Envoyé par laurentSc Voir le message
    ...ça risque pas vu qu'avec mon handicap, l'écriture manuelle est super difficile (et illisible)
    Laurent, ça ne t'empêche pas de RÉDIGER informatiquement (document Word,...) la MÉTHODOLOGIE à suivre !
    (puis de l'imprimer).

    Ce qui t'évitera d'"oublier"...

    2- Petite précision (toujours pour Laurent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (( ! empty($_GET['page'])) && ctype_alnum(($_GET['page'])) {
    ctype_alnum() : Vérifie qu'une chaîne est alphanumérique (tous les caractères de la chaîne text sont des lettres et des chiffres)
    Donc : PAS de tiret (-) ni underscore (_)dans le nom des page
    (sinon, on peut utiliser une regex, par exemple)

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses.

    J'en ai tenues compte au maximum :

    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
    <?php
    $page=$_GET['page'];
    //autoloading
    include_once 'Autoloader.php';
    include_once 'config\config.php';
    include_once 'connect\connect_mysql.php';
     
    if (( ! empty($_GET['page'])) && ctype_alnum($_GET['page'])) {// ctype_alnum — Vérifie qu'une chaîne est alphanumérique
        $file = 'page'.DIRECTORY_SEPARATOR.$_GET['page'].'.php';
        if (is_file($file)) {
            include $file;
            exit; 
        }
    }
     
    ?>

    config.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
    // -----------------------------------------------------------
    // CONFIGURATION : 
    // -----------------------------------------------------------
    if(!defined('PATHeis')) define('PATHeis','eis_donoterase');
    if(!defined('SITE_URL_WWW_LOCAL'))	define('SITE_URL_WWW_LOCAL',	'localhost/eis_oo2');  // en TEST LOCAL, A REMPLACER PAR...
    if(!defined('SITE_URL_WWW_PROD'))	define('SITE_URL_WWW_PROD',	'10.234.40.34/'.PATHeis); // en PRODUCTION
     
    if( !defined('SITE_URL_WWW')) define('SITE_URL_WWW', (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] == 'localhost') ? SITE_URL_WWW_LOCAL : SITE_URL_WWW_PROD );
    if( !defined('SITE_URL_HTTP'))	define('SITE_URL_HTTP',	'http://'.SITE_URL_WWW);
     
     
    // Gestion des constantes
    define('URL_HOME', 'http://localhost/eis_oo2');
    // Base de données
    define('DB_SCHEME', 'mysql');
    define('DB_HOST', 'localhost');
    define('DB_PORT', '3306');
    define('DB_NAME', 'support_eis');  // ici tu mets le nom de ta base de données
    define('DB_USER', 'root');        // utilisateur
    define('DB_PWD', '');             // mot de passe
    ?>

    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
    use _classes\Bdd\Bdd;
     
    //// connexion
    try{
    				$Bdd = new Bdd();
    				$Bdd->connect(DB_SCHEME, DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PWD);
      }
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}

    Bdd.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
    namespace _classes\Bdd;
    use PDO;  // dépendance
    class Bdd extends PDO {
     
        private static $Bdd;
     
            public function __construct(){}
     
            public function connect($BddScheme, $Bddhost, $BddPort, $Bddname, $Bdduser, $Bddpswd) {
     
                if (self::$Bdd === null) {
                    self::$Bdd = new PDO($BddScheme.':host=' . $Bddhost.';port='.$BddPort.';dbname=' . $Bddname ,// virgule ici et pas point-virgule
                    $Bdduser, 
                    $Bddpswd);
                }
                return (self::$Bdd);
        }
    ...autres méthodes

    Laurent, ça ne t'empêche pas de RÉDIGER informatiquement (document Word,...) la MÉTHODOLOGIE à suivre !
    (puis de l'imprimer).

    Ce qui t'évitera d'"oublier"...
    2 soucis :
    1. Les écolos vont hurler
    2. Mais où ai-je rangé ce papier ?

    Cela dit, j'applique déjà une variante de cette idée : j'écris effectivement des fichiers informatiques et les stocke sur mon disque dur.

    Pour revenir au code : si je mets comme action /index.php?page=authenticate2, au niveau de la barre d'adresse du navigateur, on a http://localhost/index.php?page=authenticate2 au lieu de http://localhost/eis_oo2/index.php?page=authenticate2 donc bien sûr, il trouve pas...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Pour qu'il trouve l'action en espérant rester cohérent, j'ai mis ça comme action : <?= SITE_URL_HTTP ?>\index.php?page=authenticate2. Certes l'action est trouvée mais...
    ) Error: Class '_classes\Authent' not found in C:\wamp64\www\eis_oo2\page\authenticate2.php on line 7
    J'ai donc quand même besoin d'aide...

    Pour rappel, authenticate2.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    echo dirname(dirname(__DIR__))."\\eis_oo2\_classes\Authent\Authent.php"."<br/>";
    include_once dirname(dirname(__DIR__))."\\eis_oo2\_classes\Authent\Authent.php";
    use _classes\Authent;
    use _classes\Bdd;
     
    $auth=new Authent();
    $Bdd=new Bdd();
    $Bdd->connect('localhost','support_eis', 'root', '');
    $auth->Authentification($Bdd);
    ?>
    que je mette l'include ligne 3 (au cas où l'autoloader ne fonctionnerait pas) ou pas, même message d'erreur...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    pour la vue, je vais poster un article de blog qui va expliquer comment faire simplement un rendu en PHP basé uniquement que sur un système d'include.
    Un petit moteur de rendu hyper simple (basé sur une seule et unique classe) qui s'occupe de tout.
    Bref, un outil qui va simplifier la vie

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Super, merci, et basé sur include, ça veut dire qu'on ne va pas utiliser l'autoload, n'est-ce pas ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Exactement

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut

    et en ce qui me concerne, tu as le temps de faire un truc bien (mais je doute que tu sois capable de faire un truc pas bien ) car je ne pourrai probablement pas le tester avant lundi. (j'aurai quand même internet sur mon téléphone donc verrai s'il y a quelque chose et pourrai poser une question si pas clair)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Pour rebondir sur mon post précédent, vous allez trouver mon annonce concernant la naissance de PhpEcho dans ce message

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

Discussions similaires

  1. [ZF 1.8] Autoload et classe non trouvée
    Par titou_777 dans le forum Zend Framework
    Réponses: 2
    Dernier message: 25/06/2009, 16h37
  2. [ORACLE9i][XML]:ORA-29540: classe non trouvée
    Par anaon dans le forum Oracle
    Réponses: 8
    Dernier message: 15/11/2005, 20h02
  3. Tomcat et classe personnel non trouvée.
    Par swirtel dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 15/02/2005, 14h43
  4. [Plugin] Classe non trouvée au runtime
    Par toto_toto dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 15/02/2005, 10h36
  5. [debutant][Classpath][Linux] Classe non trouvée
    Par oghma777 dans le forum Général Java
    Réponses: 5
    Dernier message: 15/10/2004, 21h26

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