[RESOLU] création objet

Mammouth du PHP | 2703 Messages

07 nov. 2023, 23:35

" Il ne faut pas faire de requête SELECT pour récupérer l'identifiant de l'élève ajouté."
" $stmt = $db->prepare('SELECT eleve_id FROM eleve');"
il faut écouter les conseils donnés.

Eléphant du PHP | 66 Messages

08 nov. 2023, 00:03

désolé mais je rate un truc. je fais comment pour récupérer les eleve_id pour leur affecter un nombre de sport qui me permet de générer les sportId
voici le code entier.
<?php
require('objets.php');
//condition pour les stat aléatoirement
if (isset($_GET["lancer"])) {
    //nombre d'élève générer aléatoirement
    $nbrEleve = rand(3,10);
    //boucle création eleve (affectation ecole, nbr de sports, selection des sports)
    for ($i=0; $i < $nbrEleve; $i++) {
        //affectation de l'id de l'école
        $school_id = rand(1,3);       
         
        //création de l'objet eleve
        $eleve_data = array(
            'ecole_id' => $school_id            
        );
        $eleve = new Eleve($eleve_data);        

        //affectation dans la variable $db de la connexion PDO
        $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', '');

        //instanciation de la classe EleveManager, nous créons un objet breve en argument
        //la connexion PDO est passée en paramètre au constructeur.
        $manager = new EleveManager($db); 

        //appel de la méthode addPupil, nous passons un objet eleve en argument.
        $manager->addEleve($eleve);
    }
    //récupération des eleve_id
    $stmt = $db->prepare('SELECT eleve_id FROM eleve');
    $stmt->execute();
   

    //variable pour stocker la valeur du paramètre eleve_id
    $eleve_id;
   
    //boucle pour itérer sur les résultats
    foreach ($stmt->fetchAll() as $result) {
        //affectation des valeurs des résultats dans la variable
        $eleve_id = $result['eleve_id'];    
        //génération aléatoire du nombre de sport        
        $prat_sport = rand(0,3);
        function selectionnerNombresSansDoublons($prat_sport) {
            // Initialisation d'un tableau vide
            $nombres = [];
            // Boucle pour générer jusqu'a 3 nombres aléatoires
            for ($ii = 0; $ii < $prat_sport; $ii++) {
              // Génération des nomnbres entre 1 et 5 qui seront les sportId
              $nombre = rand(1, 5);
          
              // Vérification que le nombre n'est pas déjà dans le tableau
              if (!in_array($nombre, $nombres)) {
                // Ajout du nombre au tableau
                $nombres[]= $nombre;                
              }
            }    
        }      
        // Retour du tableau de nombres
        return $nombres;
            
        foreach ($nombres as $nombre){
            $sportId = $nombre;
            
           //création de l'objet sportEleve
            $sportEleve_data = array(
                'eleve_id' => $eleve_id,
                'sport_id' => $sportId,
            ); 
            //affectation dans la variable $db de la connexion PDO
            $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', '');

            //instanciation de la classe EleveManager, nous créons un objet breve en argument
            //la connexion PDO est passée en paramètre au constructeur.
           
            $manager1 = new SportEleveManager($db);

            //appel de la méthode addPupil, nous passons un objet eleve en argument.
           
            $manager1->addSportEleve($sportEleve);
        }    
            
            
        }
}

?>


Mammouth du PHP | 2703 Messages

08 nov. 2023, 00:14

relisez la réponse de ynx

imaginons que vous videz toutes les tables, et lancez la génération, il va se passer quoi pour ce select ?

Eléphant du PHP | 66 Messages

08 nov. 2023, 00:40

j'ai relu le message de ynx.

si je comprends bien pour récupérer l'eleve_id de la table eleve pour l'enregister dans la table sporteleve il faut faire un INSERT ??

J'essai de réexplique l'exercice que je dois faire :
4 tables
ecole : ecole_id | ecole_nom
sport : sport_id | nomSport
eleve : eleve_id | ecole_id
sporteleve : sporteleve_id |eleve_id | sport_id

je génère aléatoirement un nombre d'élève qui sont affecter aléatoirement à une école.
cette partie de mon code fonction la table se complète bien.

maintenant,
il faut que je génère aléatoirement pour chaque élève un nombre de sport entre 0 et 3 et sélectionner aléatoire les sports pratiqués puis les enregistrer dans la table sporteleve.

pour cela voilà ce que je pense juste de faire:
je récupère les eleve_id de la table élève
puis je génère aléatoirement un nombre de sport (entre 0 et 3)
puis pour en fonction du nombre de sports je génère aléatoirement les sport_id en vérifiant qu'il n'y ai pas de doublons.
du tableau des sport_id je fais une boucle pour les récupérer
je crée l'objet sporeleve

voici l'integralité de mon code . et surtout merci de votre patience !! si une bonne âme veut bien commenter mon code pour que je comprenne mes erreurs j'en serai ravis !!
require('objets.php');
//condition pour les stat aléatoirement
if (isset($_GET["lancer"])) {
    //nombre d'élève générer aléatoirement
    $nbrEleve = rand(3,10);
    //boucle création eleve (affectation ecole, nbr de sports, selection des sports)
    for ($i=0; $i < $nbrEleve; $i++) {
        //affectation de l'id de l'école
        $school_id = rand(1,3);       
         
        //création de l'objet eleve
        $eleve_data = array(
            'ecole_id' => $school_id            
        );
        $eleve = new Eleve($eleve_data);        

        //affectation dans la variable $db de la connexion PDO
        $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', '');

        //instanciation de la classe EleveManager, nous créons un objet breve en argument
        //la connexion PDO est passée en paramètre au constructeur.
        $manager = new EleveManager($db); 

        //appel de la méthode addPupil, nous passons un objet eleve en argument.
        $manager->addEleve($eleve);
    }
    //récupération des eleve_id
    $stmt = $db->prepare('SELECT eleve_id FROM eleve');
    $stmt->execute();
   

    //variable pour stocker la valeur du paramètre eleve_id
    $eleve_id;
   
    //boucle pour itérer sur les résultats
    foreach ($stmt->fetchAll() as $result) {
        //affectation des valeurs des résultats dans la variable
        $eleve_id = $result['eleve_id'];    
        //génération aléatoire du nombre de sport        
        $prat_sport = rand(0,3);
        function selectionnerNombresSansDoublons($prat_sport) {
            // Initialisation d'un tableau vide
            $nombres = [];
            // Boucle pour générer jusqu'a 3 nombres aléatoires
            for ($ii = 0; $ii < $prat_sport; $ii++) {
              // Génération des nomnbres entre 1 et 5 qui seront les sportId
              $nombre = rand(1, 5);
          
              // Vérification que le nombre n'est pas déjà dans le tableau
              if (!in_array($nombre, $nombres)) {
                 // Ajout du nombre au tableau
                 $nombres[]= $nombre;                
                }
            }    
        }      
        // Retour du tableau de nombres
        return $nombres;
            
        foreach ($nombres as $nombre){
            $sportId = $nombre;
            
           //création de l'objet sportEleve
            $sportEleve_data = array(
                'eleve_id' => $eleve_id,
                'sport_id' => $sportId,
            ); 
            //affectation dans la variable $db de la connexion PDO
            $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', '');

            //instanciation de la classe EleveManager, nous créons un objet breve en argument
            //la connexion PDO est passée en paramètre au constructeur.
           
            $manager1 = new SportEleveManager($db);

            //appel de la méthode addPupil, nous passons un objet eleve en argument.
           
            $manager1->addSportEleve($sportEleve);
        }    
            
            
        }
}


Mammouth du PHP | 2703 Messages

08 nov. 2023, 00:45

quand on part de tables vides, pour ajouter un élève, oui, il faut faire une requête sql insert. si l'on commence par un select, la requete ne va rien retourner, on ne rentre jamais dans la boucle de parcours des résultats du select.

Eléphant du PHP | 66 Messages

09 nov. 2023, 22:54

Bonsoir,

enfin j'ai trouver la solution à mes problèmes, grâce à vos commentaires et je vous en remercie beaucoup. il faut que j'apprenne à prendre du recule et surtout tester mon code au fur et à mesure.

je dirai tout de même que l'on apprends plus de ces erreurs de de ces réussites immédiates.

j'ai tout de même un petit bug sur cette partie du code :
c'est la partie pour vérifier que nous n'avons pas deux fois le même sportId.
//condition pour lancer les stat aléatoirement
if (isset($_GET["generer"])){
    // Instanciation de connexion au serveur
    $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', ''); 

    //récupération des eleve_id
    $stmt = $db->prepare('SELECT eleve_id FROM eleve');
    $stmt->execute();

    while ($row = $stmt -> fetch()){

        print_r($row); 'br';
        //affectation des valeurs des résultats dans la variable
        $eleve_id = $row['eleve_id']; 

        //génération aléatoire du nombre de sport        
        $prat_sport = rand(0, 3);
        // Initialisation d'un tableau vide
        $nombres = [];
        // Boucle pour générer jusqu'a 3 nombres aléatoires
        for ($ii = 0; $ii < $prat_sport; $ii++) {
            // Génération des nombres entre 1 et 5 qui seront les sportId
            $nombre = rand(1, 5);
            // Vérification que le nombre n'est pas déjà dans le tableau
            if (!in_array($nombre, $nombres)) {
                // Ajout du nombre au tableau
                $nombres[]= $nombre;                
            }
            // Récupération des sportId du tableau nombres
            foreach ($nombres as $nombre){
                $sportId = $nombre;
            }
            //création de l'objet sportEleve
            $sportEleve_data = array(
                'eleve_id' => $eleve_id,
                'sport_id' => $sportId,
            ); 
            // Instanciation de la classe SportEleve
            $sportEleve = new SportEleve($sportEleve_data);        

            // Instanciation de connexion au serveur
            $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', '');

            //instanciation de la classe EleveManager, nous créons un objet breve en argument
            //la connexion PDO est passée en paramètre au constructeur.
            $manager1 = new SportEleveManager($db); 

            //appel de la méthode addSportEleve, nous passons un objet sportEleve en argument.
            $manager1->addSportEleve($sportEleve);
        }  
    }    



}

Eléphant du PHP | 66 Messages

09 nov. 2023, 23:01

petite précision j'ai plusieurs fois le même sportId pour un élève !!

Eléphant du PHP | 66 Messages

09 nov. 2023, 23:18

j'ai trouver la solution !!
for ($ii = 0; $ii < $prat_sport; $ii++) {
            // Génération des nombres entre 1 et 5 qui seront les sportId
            $nombre = rand(1, 5);
            // Vérification que le nombre n'est pas déjà dans le tableau
            if (!in_array($nombre, $nombres)) {
                // Ajout du nombre au tableau
                $nombres[]= $nombre;                
            }else{
                // Si le nombre est déjà dans le tableau on passe à l'itération suivante
                continue;
            }

Mammouth du PHP | 2703 Messages

09 nov. 2023, 23:35

si l'on part de tables vides, cela ne va créer aucun élève. si l'on lance 2 fois la génération, il se peut que cela rajoute des sports aux élèves qui en avaient déjà. ce n'est donc pas résolu.