Ma liste reste désespérément vide

Résolu/Fermé
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021 - 18 nov. 2021 à 09:24
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021 - 22 nov. 2021 à 07:03
Bonjour,

Actuellement, j'ai créé, sur Microsoft Access, une base de données me permettant de gérer les livres que j'ai lus.
Je souhaiterai basculer cette base sur MySql et la consulter sur ma tablette ou sur mon téléphone via un site perso .
J'ai commencé à faire quelques exercices divers en suivant des tutos pour apprendre les langages nécessaires à la réalisation de mon objectif.

Mon problème vous paraitra sans doute très simple. J'ai un formulaire qui contient une liste déroulante devant afficher le nom des auteurs. J'ai suivi le tuto me permettant de remplir cette liste mais celle-ci reste toujours vide et l'exécution de la page ne retourne aucune erreur.

Je vous mets ci-dessous la copie de mes différentes pages fin que vous puissiez me diriger vers une solution

1. Connexion.php
<?php

    class DbConnect
    {
        private $host = 'localhost';
        private $dbName = 'bibliotheque';
        private $user = 'root';
        private $pass = 'root';

        public function connect()
        {
            try {
                $conn = new PDO('mysql:host=' . $this->$host . '; dbname =' . $this->$dbName, $this->$user, $this->$pass);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                return $conn;
            } catch (PDOException $e) {
                echo 'Erreur Base de données : ' . $e->getMessage();
            }
        }
    }



2. Data.php
<?php

    require 'Connexion.php';

    function loadAuteurs()
    {
        $db = new DbConnect();
        $conn = $db->connect();
  
        $reponse = $conn->prepare('SELECT * FROM t_auteurs');
        $reponse->execute();
        $auteurs = $reponse->fetchAll(PDO::FETCH_ASSOC);

        return $auteurs;
    }


3. index.php
<!DOCTYPE html>
<html>
<head>
    <title>Listes dépendantes</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container">
        <h1 class="text-center">Listes imbriquees en PHP/MySql utilisant jQuery et AJAX</h1>
        <hr>
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form role="form" method="post" action="">
                    <div  class="row">
                        <div class="form-group">
                            <label for="Auteurs">Auteurs</label>
                            <select class="form-control" id="auteurs" name="auteurs">
                                <?php
                                    require 'Data.php';
                                    $auteurs = loadAuteurs();
                                    foreach ($auteurs as $auteur) {
                                        echo "<option id='".$auteur['CodeAuteur']."' value='".$auteur['CodeAuteur']."' >".$auteur['LibleNom']."</option>";
                                    }
                                ?>
                            </select>
                        </div>
                    </div>
                </form>
            </div>
    </div>
</body>
</html>


Merci à tous ceux qui prendront le temps de regarder mon problème

3 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
18 nov. 2021 à 11:16
Bonjour,


class Db ( je te conseille de renommer le fichier en db.class.php

<?php
/*
  ------------------------------------------------------
  METHODES
  ------------------------------------------------------
  Syntaxe :
  lafonctiopn($sql,$datas) -> $sql : string contenant la requête à executer
  -> $datas : variables (dans un array associatif) à passer à la requête
  Liste des méthodes :
  db_All() -> retourne un Array contenant TOUTES les lignes du résultat de la requête
  db_One() -> retourne un Array contenant LA PREMIERRE ligne du résultat de la requête
  db_Insert -> retourne l' ID nouvellement créé par une requête INSERT
  db_Exec() -> Pour les requêtes DELETE / UPDATE : retourne le nombre de lignes impactées
*/

    class Db
    {
        private $host = 'localhost';
        private $dbName = 'bibliotheque';
        private $user = 'root';
        private $pass = 'root';
        private $bdd = NULL;
        private $prepare = NULL;
        private $rowCount = 0;
        private $res = NULL;
        
        
        
        function __construct(){
          $this->connect();
        }

        public function connect()
        {
            try {
              $conn = new PDO('mysql:host=' . $this->$host . '; dbname =' . $this->$dbName, $this->$user, $this->$pass);
              $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $this->bdd = $conn;
            } catch (PDOException $e) {
              echo 'Erreur Base de données : ' . $e->getMessage();
            }
        }
        
         private function dbQuery ( $sql, $datas = NULL ) {
          try {
            $this->prepare = $this->bdd->prepare ( $sql );
            $this->res = $this->prepare->execute ( $datas );
            $this->rowCount = $this->prepare->rowCount ();
          } catch ( Exception $e ) {
            // en cas d'erreur :
            echo "<br><b>Erreur ! " . $e->getMessage () . "</b>" . PHP_EOL;
            echo "<pre> La requete :" . $sql . "</pre>" . PHP_EOL;
            echo " <pre>Les datas : " . PHP_EOL;
            print_r ( $datas );
            echo "</pre>" . PHP_EOL;
          }
        }

        public function db_All ( $sql, $datas = NULL ) {
          $this->dbQuery ( $sql, $datas );
          return $this->prepare->fetchAll ();
        }

        
         public function db_One ( $sql, $datas = NULL ) {

          try {
            $this->dbQuery ( $sql, $datas );
            return $this->prepare->fetch ();
          } catch ( Exception $e ) {
            echo "Erreur " . $e->getMessage ();
            echo "<br> SQL :" . $sql;
            echo "<br> datas :" . print_r ( $datas, true );
          }
        }

        public function db_Insert ( $sql, $datas = NULL, $returnId = TRUE ) {
          $this->dbQuery ( $sql, $datas );
          return $returnId ? $this->bdd->lastInsertId () : $this->res;
        }

        public function db_Exec ( $sql, $datas = NULL ) {
          $this->dbQuery ( $sql, $datas );
          return array('$this->tbl' => $this->res, 'rowCount' => $this->rowCount);
        }

    }



Une class pour gérer tes auteurs
auteurs.class.php

    class Auteurs extends Db{
       
      function __construct(){
         parent::__construct();
      }
       
      public function loadAuteurs()
      {
     
        $sql ='SELECT * FROM t_auteurs';
        return parent::db_All($sql);
     
      }
    }


et dans ton index.php ( AVANT le html ! )
<?php
    require_once 'db.class.php';
    require_once 'auteurs.class.php';
   $oAuteurs = new Auteurs();

   //liste des auteurs
  $auteurs = $oAteurs->loadAuteurs();


?>
<!DOCTYPE html>
<html>
<head>
 



Puis là où tu veux mettre ta liste
<?php
if(!empty($auteurs)){
    foreach ($auteurs as $auteur) {
        echo "<option id='".$auteur['CodeAuteur']."' value='".$auteur['CodeAuteur']."' >".$auteur['LibleNom']."</option>";
    }
}else{
  echo "Aucun auteur";
}

?>
0
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021
20 nov. 2021 à 08:41
Bonjour jordane45

J'ai repris ton code et malgré tout, je reste sur une coquille.
J'ai le message d'erreur suivant dont je comprends le sens mais que je n'arrive pas à solutionner :

Fatal error: Cannot declare class Db, because the name is already in use in I:\MAMP\htdocs\Listes dependantes\db.class.php on line 16

la ligne 16 correspond à : class Db dans le fichier db.class.php

y a-t-il un lien avec : class Auteurs extends Db du fichier auteurs.class.php

Je te remercie pour ton aide
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717 > villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021
20 nov. 2021 à 09:44
Ça dépend...
Montres nous ton code complet...
N'aurais tu pas un new Db() dans ton code quelque part ?
0
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021 > jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024
20 nov. 2021 à 09:55
Je me suis permis de reprendre ton code pas à pas.
Je te mets ci-dessous les différents fichiers :

db.class.php
<?php
/*
  ------------------------------------------------------
  METHODES
  ------------------------------------------------------
  Syntaxe :
  lafonctiopn($sql,$datas) -> $sql : string contenant la requête à executer
  -> $datas : variables (dans un array associatif) à passer à la requête
  Liste des méthodes :
  db_All() -> retourne un Array contenant TOUTES les lignes du résultat de la requête
  db_One() -> retourne un Array contenant LA PREMIERRE ligne du résultat de la requête
  db_Insert -> retourne l' ID nouvellement créé par une requête INSERT
  db_Exec() -> Pour les requêtes DELETE / UPDATE : retourne le nombre de lignes impactées
*/

    class Db
    {
        private $host = 'localhost';
        private $dbName = 'bibliotheque';
        private $user = 'root';
        private $pass = 'root';
        private $bdd = NULL;
        private $prepare = NULL;
        private $rowCount = 0;
        private $res = NULL;
        
        
        
        function __construct(){
          $this->connect();
        }

        public function connect()
        {
            try {
             $conn = new PDO('mysql:host=' . $this->$host . '; dbname =' . $this->$dbName, $this->$user, $this->$pass);
              $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $this->bdd = $conn;
            } catch (PDOException $e) {
              echo 'Erreur Base de données : ' . $e->getMessage();
            }
        }
        
         private function dbQuery ( $sql, $datas = NULL ) {
          try {
            $this->prepare = $this->bdd->prepare ( $sql );
            $this->res = $this->prepare->execute ( $datas );
            $this->rowCount = $this->prepare->rowCount ();
          } catch ( Exception $e ) {
            // en cas d'erreur :
            echo "<br><b>Erreur ! " . $e->getMessage () . "</b>" . PHP_EOL;
            echo "<pre> La requete :" . $sql . "</pre>" . PHP_EOL;
            echo " <pre>Les datas : " . PHP_EOL;
            print_r ( $datas );
            echo "</pre>" . PHP_EOL;
          }
        }

        public function db_All ( $sql, $datas = NULL ) {
          $this->dbQuery ( $sql, $datas );
          return $this->prepare->fetchAll ();
        }

        
         public function db_One ( $sql, $datas = NULL ) {

          try {
            $this->dbQuery ( $sql, $datas );
            return $this->prepare->fetch ();
          } catch ( Exception $e ) {
            echo "Erreur " . $e->getMessage ();
            echo "<br> SQL :" . $sql;
            echo "<br> datas :" . print_r ( $datas, true );
          }
        }

        public function db_Insert ( $sql, $datas = NULL, $returnId = TRUE ) {
          $this->dbQuery ( $sql, $datas );
          return $returnId ? $this->bdd->lastInsertId () : $this->res;
        }

        public function db_Exec ( $sql, $datas = NULL ) {
          $this->dbQuery ( $sql, $datas );
          return array('$this->tbl' => $this->res, 'rowCount' => $this->rowCount);
        }

    }



auteurs.class.php

 <?php
 
 class Auteurs extends Db{
       
      function __construct(){
         parent::__construct();
      }
       
      public function loadAuteurs()
      {
        $sql ='SELECT * FROM t_auteurs';    
        return parent::db_All($sql);   
      }
    }

    ?>


Index.php
<?php
    require_once 'db.class.php';
    require_once 'auteurs.class.php';
   $oAuteurs = new Auteurs();

   //liste des auteurs
  $auteurs = $oAteurs->loadAuteurs();


?>

<!DOCTYPE html>
<html>
<head>
    <title>Listes dépendantes</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container">
        <h1 class="text-center">Listes imbriquees en PHP/MySql utilisant jQuery et AJAX</h1>
        <hr>
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form role="form" method="post" action="">
                    <div  class="row">
                        <div class="form-group">
                            <label for="Auteurs">Auteurs</label>
                            <select class="form-control" id="auteurs" name="auteurs">
                                <?php
                                    if(!epmpty($auteurs)){
                                        foreach ($auteurs as $auteur) {
                                            echo "<option id='".$auteur['CodeAuteur']."' value='".$auteur['CodeAuteur']."' >".$auteur['LibleNom']."</option>";
                                        }                                        
                                    }else {
                                        echo"Aucun auteur";
                                    }
                                ?>
                            </select>
                        </div>
                    </div>
                </form>
            </div>
    </div>
</body>
</html>
0
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021
Modifié le 19 nov. 2021 à 09:09
Bonjour,

Merci Joane45 pour ton suivi,
Je n'ai pas encore pu tester, je reviens vers toi dès que possible

Bonne journée
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
20 nov. 2021 à 10:22
Il semble y avoir quelques coquilles dans le code.

Pour la connexion ( attention aux espaces en trop qu'il faut retirer..)
Donc, code à remplacer par

        public function connect()
        {
            try {
              $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbName;
              $conn = new PDO($dsn, $this->user, $this->pass);
              $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $this->bdd = $conn;
            } catch (PDOException $e) {
              echo 'Erreur Base de données : ' . $e->getMessage();
            }
        }


il y avait également un souci de "u" manquant dans le nom de la variable.
Code à corriger par
   $oAuteurs = new Auteurs();

   //liste des auteurs
  $auteurs = $oAuteurs->loadAuteurs();


Une fois corrigé.. tout fonctionne parfaitement de mon côté....

Pense à arreter/redémarrer le serveur apache au cas où... il pourrait subsister un "cache" de tes anciens codes..

0
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021
Modifié le 21 nov. 2021 à 08:49
Bonjour Jordane,

Je vais te paraitre sans doute une niais...
J'ai apporté les corrections que tu m'as indiquées. Hélas, la liste reste vide.
J'ai arrêté et redémarré le server ... toujours rien !!!

Et le pire c'est qu'aucune erreur ne s'affiche !!!
Donc pour vérifier que le code fonctionne bien, j'ai provoqué des erreurs :
Faute dans le nom de la base de données, dans le nom de champ de la requête.
Le résultat ne se fait pas attendre : les erreurs sont bien affichées.

J'ai pensé que cela pouvait venir de l'utilisation de bootstrap. j'ai donc recréé une page <html> sans aucune mise en forme...
Le résultat est le même.

j'ai pensé que ma table pouvait être vérolée. J'ai recréée une petite base de données avec une seule table ... Même punition !!!

TOUJOURS RIEN !!! je m'arrache les cheveux

si tu as une idée ... je suis preneur

Merci d'avance
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717 > villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021
21 nov. 2021 à 08:52
Fais un var_dump($auteurs);
0
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021 > jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024
21 nov. 2021 à 08:58
Alors là, pour le coup, je suis débutant et je ne sais pas où placer cette instruction.

je l'ai placée dans la page index.php au niveau de la condition :

 <?php
                                    if(!epmpty($auteurs)){
                                        var_dump($auteurs);
                                        foreach ($auteurs as $auteur) {


Après exécution, pas de retour ...
0
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021 > villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021
21 nov. 2021 à 09:02
Ok, j'ai placé l'instruction directement après
   //liste des auteurs
  $auteurs = $oAuteurs->loadAuteurs();
  var_dump($auteurs);


La variable contient bien les données. Elles sont donc perdues entre temps ...
0
villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021 > villemuche Messages postés 10 Date d'inscription jeudi 18 novembre 2021 Statut Membre Dernière intervention 22 novembre 2021
21 nov. 2021 à 09:08
Voici un extrait du Dump :

array(272) { [0]=> array(4) { ["CodeAuteur"]=> string(2) "92" [0]=> string(2) "92" ["LibelNom"]=> string(6) "AILLON" [1]=> string(6) "AILLON" } [1]=> array(4) { ["CodeAuteur"]=> string(2) "93" [0]=> string(2) "93" ["LibelNom"]=> string(5) "BUSSI" [1]=> string(5) "BUSSI" } [2]=> array(4) { ["CodeAuteur"]=> string(2) "94" [0]=> string(2) "94" ["LibelNom"]=> string(8) "LEMAITRE" [1]=> string(8) "LEMAITRE" } ...
0