[RESOLU] création objet

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] création objet

Re: [RESOLU] création objet

par or 1 » 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.

Re: création objet

par elevedavid » 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;
            }

Re: création objet

par elevedavid » 09 nov. 2023, 23:01

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

Re: création objet

par elevedavid » 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);
        }  
    }    



}

Re: création objet

par or 1 » 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.

Re: création objet

par elevedavid » 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);
        }    
            
            
        }
}

Re: création objet

par or 1 » 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 ?

Re: création objet

par elevedavid » 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);
        }    
            
            
        }
}

?>

Re: création objet

par or 1 » 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.

Re: création objet

par elevedavid » 07 nov. 2023, 23:20

merci pour ces informations précieuses !!
j'ai supprimé de la table eleve nbrSport.

la partie pour générer aléatoirement le nombre d'élève et les affecter à une ecole fonction bien.

c'est la deuxième partie du code qui merde et je tourne en rond #-o

ce que je veux faire :
récupérer les eleve_id
puis générer aléatoirement le nombre de sports pratiqués de 0 à 3 sports
puis générer aléatoire les sportId en fonction du nombre de sport pratiqué si 2 sports alors 2 sportId différents.

je ne sais pas si mon code fonction car j'ai une erreur au niveau du return $nombres -> Undefined variable $nombres in C:\code\phpAvance1\index.php on line 59
je ne comprends pas pourquoi la variable nombres n'est pas définie

hormis la variable undefined, le code est-il logique?
 //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 sportId aléatoire entre 1 et 5
              $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);

            } 
        }
}

Re: création objet

par ynx » 07 nov. 2023, 12:04

PDO retourne les valeurs numériques avec un type string, tu peux utiliser le transtypage (type casting) pour convertir le type si tu veux mais ce n'est pas l'origine du problème.

Evite l'utilisation du mot-clé global, tu ne devrais pas en avoir besoin ici.

Il ne faut pas faire de requête SELECT pour récupérer l'identifiant de l'élève ajouté.
Pour compléter la réponse déjà donnée par or1, il faut utiliser la méthode lastInsertId pour récupérer l'identifiant :
1. On prépare une requête pour ajouter un éleve : $stmnt = $this->_db->prepare('INSERT INTO eleve...');
2. On bind les paramètres de la requête puis on exécute la requête : $stmnt->bindParam(':ecole_id', $ecole_id); $stmnt->execute();
3. Juste après l'exécution de la requête, on récupère l'identifiant de l'élève qui vient d'être ajouté : $id = $this->_db->lastInsertId();

Comme indiqué par or1, le champ nbrSport dans la table élevé est inutile et va te poser plus de problème que de solution.
Pour compter le nombre de sport d'un élève, il faut compter les lignes dans la table sportEleve pour un élève spécifié :
SELECT COUNT(*) AS nbrSport FROM sportEleve WHERE id_eleve = ?

Cette requête retourne déjà l'information nbrSport : le champ nbrSport dans la table eleve est redondant et donc inutile, à supprimer.

Re: création objet

par elevedavid » 06 nov. 2023, 23:46

dès le premier eleve j'ai le message d'erreur.

je pense avoir trouver mon problème qui semble venir des tables. j'explique :
dans la table eleve : eleve_id est int 5 et est la clé primaire de la table.

Maintenant lorsque je fait un var_dump sur eleve_id de ma boucle foreach voici le résultat : C:\code\phpAvance1\index.php:39:string '3032' (length=4)

Ce n'est pas normale que eleve_id soit un string alors que dans la table eleve eleve_id int 5?????
 //récupération des résultats de la requête `SELECT`
        $stmt = $db->prepare('SELECT eleve_id, nbrSport FROM eleve');
        $stmt->execute();

      
        //variable pour stocker la valeur du paramètre `id_eleve`
        global $eleve_id;

        //variable pour stocker la valeur du paramètre `prat_sports`
        global $prat_sports;


        //boucle pour itérer sur les résultats
        foreach ($stmt->fetchAll() as $result) {
            //affectation des valeurs des résultats dans les variables
            $eleve_id = $result['eleve_id'];
            $prat_sports = $result['nbrSport'];
            var_dump($eleve_id);
            //boucle pour générer les sports pratiqués
            for ($ii=0; $ii <= $prat_sports; $ii++){
                //génération d'un nombre aléatoire compris entre 1 et 5
                $sportId = rand(1,5);               
                //création de l'objet sportEleve
                $sportEleve_data = array(
                    'eleve_id' => $eleve_id,
                    'sport_id' => $sportId,
                );                
                $sportEleve = new SportEleve($sportEleve_data);
            }
        }
et voici les condition dans le setter
public function setEleve_id($eleve_id)
  {
    if ((is_int($eleve_id)) AND ($eleve_id > 0)) 
    {
      $this->_eleve_id = $eleve_id;
    }    
  

Re: création objet

par or 1 » 06 nov. 2023, 23:33

"je veux générer aléatoirement :
un nombre d'élève,
chaque élève est affecté à une des 3 écoles
chaque élève pratique entre 0 et 3 sports parmi 5 sports"

que se passe-t-il avec cette façon de faire si vous faites cette génération non pas une fois mais x fois ?

Re: création objet

par elevedavid » 06 nov. 2023, 23:24

dans la table eleve je récupère eleve_id et nbrSport pour insérer dans la table sporteleve pour chaque eleve_id génerer les sport_id. C'est un exercice que je dois faire

Re: création objet

par elevedavid » 06 nov. 2023, 23:24

dans la table eleve je récupère eleve_id et nbrSport pour dans la table sporteleve pour chaque eleve_id génerer les sport_id. C'est un exercice que je dois faire