Problème d'incrémentation sur setter

Petit nouveau ! | 7 Messages

29 juin 2019, 07:58

Bonjour,

Je dois réaliser le travail suivant concernant des statistiques:

Les élèves des trois écoles suivantes :
– École A ;
– École B ;
– École C.

peuvent pratiquer les cinq sports suivants :
– boxe ;
– judo ;
– football ;
– natation ;
– cyclisme.

Le résultat de la génération aléatoire fait que le nombre d’élèves par école est variable et que le nombre d’élèves pratiquant un sport est variable.
Un élève peut pratiquer aucun sport ou trois sports maximum.

Pour cela je dois créer une base de données ceci est fait:

Base de données stats:
- Tables:

highschool :
| id | school_name |
1 Ecole A
2 Ecole B
3 Ecole C

pupils:
| id | name | school_id |

pupil_sport:
| id | pupil_id | sport_id |

sports:
| id | sport |
1 Boxe
2 Judo
3 Football
4 Natation
5 Cyclisme

Ensuite je dois générer aléatoirement à la demande les contenus de la base de données ;
Le contenu est généré au refresh de la page, ajoutant à chaque fois 1 élève jusque là aucun problème. (il y a une boucle for pour augmenter l'ajout mais pour les tests elle est commentée).

En revanche concernant l'ajout de 0-3 sports par élèves il y a un problème.
0-3 sports sont bien ajoutés mais il n'y a aucune incrémentation dans la tables pupil_sport de pupil_id.
Il reste à 1 j'ai essayé les boucles for, while là ou cela marche en POO cela ne marche pas dans un setter et je ne trouve pas comment faire, ceci n'est peut être qu'un détail mais ce détail m'empêche d'avancer.

Ma question est donc, comment faire en sorte que ces pupil_id soient incrémentés et/ou faire en sorte qu'ils soient reliés aux id enregistrés dans la table pupil ?
Sachant que si on définit pupil AS p et pupil_sport as u on a p.id = u.pupil_id pour les incrémenter (si cela est possible de les relier).

Voici le code correspondant.

Stat.php
<?php

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////                                                                           ///////////////////////
///////////////                             PUPIL                                         ///////////////////////
///////////////                                                                           ///////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class Pupil
{
	private $_id;
	private $_name;
	private $_school_id;

	public function __construct(array $pupilData)
	{
		$this->setId($pupilData['id']);
		$this->setName($pupilData['name']);
		$this->setSchool_id($pupilData['school_id']);
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           setters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public function setId($id)
	{
		if ((is_int($id)) AND ($id > 0)) 
		{
			$this->_id = $id;
		}
	}

	public function setName($name)
	{
		if (is_string($name)) 
		{
			 
				$names = array('Steeve', 'Bryan','Marco', 'Vito', 'Jenny', 'Jessica', 'Clay', 'Jackson', 'Tyreese', 'Andréa', 'Johanna', 'Aïda', 'Maëva','Alex', 'Barry' , 'Chris', 'Thomas', 'Sébastien', 'Christian', 'Ronnie', 'Mario','Bruce' , 'Cassie', 'Maria', 'Carla', 'Cristiano', 'Vitali', 'Luigi', 'Sergeï', 'Alexander', 'Tom', 'Franck', 'Oleg', 'Milan', 'Alessandro', 'Seth', 'Todd', 'Lisa', 'Léon', 'Raven', 'Joshua', 'Amber', 'Douglas', 'Mia', 'Sherry', 'Pamela', 'Donny', 'John', 'Camilla', 'Cole', 'Holly',  'Maggie', 'Tara', 'Harper', 'Rosa', 'Wayland', 'Sophia' , 'Garret', 'Ezechiel', 'Glenn', 'Konrad', 'Sandy', 'Paolo','Jade' , 'Naya', 'Kitana', 'Sub-Zéro', 'Kano', 'Kenny', 'Kyle', 'Marian', 'Bryan', 'Drew', 'Zvonimir', 'Pedro', 'Carolina', 'Ivanova', 'Jim',  'Violet', 'Abraham', 'Yumiko',  'Aaron', 'Connor', 'Tessa', 'Rosita' , 'Kelly', 'Mac',  'Lucas', 'Evgeni',  'Madison', 'Paula', 'Shane' , 'Wyatt', 'Diego',  'Ernesto', 'Manny', 'Vincenzo', 'Rihame', 'Gabriel', 'Ajax', 'Zeus');

				//genérateur de noms aléatoires
				$rand_pupil = array_rand($names, 2);
				$name = $names[$rand_pupil[0]];
				$this->_name = $name;
			
			
		}
	}

	public function setSchool_id($school_id)
	{
		if ((is_int($school_id)) AND ($school_id > 0) AND ($school_id < 4)) 
		{
			//générateur de school_id aléatoires
			$school_id = rand(1,3);
			$this->_school_id = $school_id;
		}
		
	}


	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           getters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function getId()
	{
		return $this->_id;
	}

	public function getName()
	{
		return $this->_name;
	}

	public function getSchool_id()
	{
		return $this->_school_id;
	}

}


	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           pupil manager                             ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////


class pupilManager
{
	private $_db;

	public function __construct($db)
	{
		$this->setDb($db);
	}

	public function setDb(PDO $dbh)
	{
		$this->_db = $dbh;
	}

	//insertion des élèves dans la base de données
	public function addPupil(Pupil $pupil)
	{


		$sql = 'INSERT INTO pupils (name, school_id) VALUES (:name, :school_id)';
		$stmnt = $this->_db->prepare($sql);
		$stmnt->bindParam(':name', htmlspecialchars($pupil->getName()));
		$stmnt->bindParam(':school_id', $pupil->getSchool_id());
		$stmnt->execute();

		//gestion des erreurs
		$errors = $stmnt->errorInfo();
		if ($errors[0] != '00000') 
		{
			echo 'Erreur SQL ' . $errors[2];
		}
		else
		{
			 'L\'élève '.$pupil->getName().' de l\'école '.$pupil->getSchool_id().' a été généré aléatoirement et enregistré en base données.' .'<br>';
		}

	}



	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                 1)	Nombre d'élèves de chaque école                                  ////////////////
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


	public function getPupilBySchool()
	{
		try
		{
			$bdh = new PDO('mysql:host=localhost;dbname=stats', 'root', '');
		}
		catch(Exception $e)
		{
			echo 'Message erreur SQL : ' .$e->getMessage(). '<br>';
			exit;
		}

		$sql = 'SELECT school_name, COUNT(p.id) AS total FROM pupils AS p INNER JOIN highschool AS h WHERE p.school_id = h.id GROUP BY school_id';
		$stmnt = $bdh->prepare($sql);
		$stmnt->execute();

		//gestion des erreurs
		$errors = $stmnt->errorInfo();
		if ($errors[0] != '00000') 
		{
			echo 'Erreur SQL ' . $errors[2];
		}
		else
		{
			while($row = $stmnt->fetch())
			{
				
				$pupil_data['school_name'] = $row['school_name'];
				$pupil_data['total'] = $row['total'];

				echo $pupil_data['school_name'] = $row['school_name'] . ' : ' . $pupil_data['total'] = $row['total'] . ' élèves' . '<br>';
			}
		}
	}
}




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////                                                                           ///////////////////////
///////////////                             SPORT                                         ///////////////////////
///////////////                                                                           ///////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class Sport
{
	private $_id;
	private $_pupil_id;
	private $_sport_id;

	public function __construct(array $sportData)
	{
		$this->setId($sportData['id']);
		$this->setPupil_id($sportData['pupil_id']);
		$this->setSport_id($sportData['sport_id']);

	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           setters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function setId($id)
	{
		if ((is_int($id)) AND ($id > 0)) 
		{
			$this->_id = $id;
		}
	}

	public function setPupil_id($pupil_id)
	{
		if ((is_int($pupil_id)) AND ($pupil_id > 0)) 
		{
			$this->_pupil_id = $pupil_id;
		}
	}

	public function setSport_id($sport_id)
	{
		if ((is_int($sport_id)) AND ($sport_id < 6)) 
		{
			$sport_id = rand(0,5);
			$this->_sport_id = $sport_id;
		}
	}


	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           getters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function getId()
	{
		return $this->_id;
	}

	public function getPupil_id()
	{
		return $this->_pupil_id;
	}

	public function getSport_id()
	{
		return $this->_sport_id;
	}
}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           sport manager                             ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

class sportManager
{
	private $_db;

	public function __construct($db)
	{
		$this->setDb($db);
	}

	public function setDb(PDO $dbh)
	{
		$this->_db = $dbh;
	}

	public function addSport(Sport $sport)
	{
		$sql = 'INSERT INTO pupil_sport (pupil_id, sport_id) VALUES (:pupil_id, :sport_id)';
		$stmnt = $this->_db->prepare($sql);
		$stmnt->bindParam(':pupil_id', $sport->getPupil_id());
		$stmnt->bindParam(':sport_id', $sport->getSport_id());
		$stmnt->execute();

		//gestion des erreurs
		$errors = $stmnt->errorInfo();
		if ($errors[0] != '00000') 
		{
			echo 'Erreur SQL ' . $errors[2];
		}
		else
		{
			echo 'Le sport '.$sport->getSport_id().' a été généré aléatoirement pour l\'élève dont l\'id est '.$sport->getPupil_id().'  et enregistré en base données.' .'<br>';
		}
	}
}
?>


index2.php
<?php
require('class/Stat.php');
/*for ($i=0; $i < 50; $i++) 
{*/
	//creation d'un objet pupil
	$pupil_data = array('id' => 1, 'name' => 'Kenny', 'school_id' => 1);
	$pupil = new Pupil($pupil_data);

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

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

	//appel de la méthode addPupil, nous passons un objet pupil en argument.
	$manager->addPupil($pupil);


//}
	
for ($i=0; $i < 3; $i++) 
{ 
	//Itération *3 pour que chaque élèves puisse faire de 0-3 sports
	//creation d'un objet sport
	$sport_data = array('id' => 1,'pupil_id' => 1, 'sport_id' => 1);
	$sport = new Sport($sport_data);

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

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

	//appel de la méthode addSport, nous passons un objet pupil en argument.
	$manager->addSport($sport);
}
	
?>

<!DOCTYPE html>
<html lang="fr">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

	<h1>Statistiques</h1>

		<h2>Liste des écoles</h2>
		<?php $manager = new pupilManager($db); ?>
		<?php $manager->getPupilBySchool(); ?>

		<h2>Elèves pratiquant au moins un sport</h2>

		<h2>Nombre d'activités sportives pratiquées:</h2>

		<h2>Liste des activités sportives pratiquées classées par ordre croissant en fonction du nombre d’élèves:</h2>

</body>
</html>

D'avance merci à ceux qui pourront m'aider.

Avatar du membre
Mammouth du PHP | 1609 Messages

30 juin 2019, 14:19

Salut, ça dépend de $sport sur cette ligne non ?
$manager->addSport($sport);
qui lui dépend de $spot_data sur cette ligne
$sport = new Sport($sport_data);
Si $sport_data['pupil_id'] est toujours égal à 1 forcément c'est toujours égale à 1 dans la table aussi...
Développeur web depuis + de 20 ans

Petit nouveau ! | 7 Messages

30 juin 2019, 21:58

Salut Saian,

Merci de ta réponse
$sport_data = array('id' => 1,'pupil_id' => 1, 'sport_id' => 1);
$sport = new Sport($sport_data);
$manager = new sportManager($db);
$manager->addSport($sport);
Oui en effet cela dépend de $sport qui lui même dépend de $sport_data.
Et tu fais certainement référence à 'pupil_id' => 1 donc au fait que cela soit normal qu'il n'y ait pas d'incrémentation.
Cela vient du fait que je n'arrive pas à incrémenter au niveau du setter de pupil_il dans la classe Sport.
Le problème est dû à ce setter.

De la même manière
$pupil_data = array('id' => 1, 'name' => 'Kenny', 'school_id' => 1);
$pupil = new Pupil($pupil_data);
$db = new PDO('mysql:host=localhost;dbname=stats', 'root', '');
$manager = new pupilManager($db);
$manager->addPupil($pupil);
Ici on pourrait penser que 'name' => 'Kenny' et 'school_id' => 1 pourraient être enregistrés à l'infini.
Mais cela n'est pas le cas car name et school_id sont des valeurs qui sont appelées par des getters, valeurs qui ont été définies par les setters donc ces valeurs prennent le dessus sur celles du tableau $pupil_data.

Le probème est que je n'arrive pas à definir une incrémentation dans le setter pour pupil_id dans la class Sport.

Avatar du membre
Mammouth du PHP | 1609 Messages

30 juin 2019, 22:44

A mon avis tu ne devrais pas gérer l'ajout aléatoire de données dans tes tables au niveau des entités pupil et sport.
Tu devrais plutôt créer des méthodes à cet effet dans tes managers.
Les entités, elles, devraient simplement faire leur job de stockage de l'information sous forme d'objet.

Un manager pour gérer les élèves, un pour gérer les sports et éventuellement un pour gérer l'activité sportive des élèves, par exemple PupilSport dans lequel tu pourrais récupérer la liste des élèves et la liste des sports et pour chaque élève, lui attribuer 1 à n sports choisis aléatoirement dans ta liste de sports.

PS : je pense que tu as un problème dans la manière dont tu organises tes classes. Pour moi en essayant d'aller dans le sens de ce que tu as fait, tu as 3 tables et donc je ferais plutôt un truc dans le genre.

Entités : Pupil, Sport, PupilSport
Manager : PupilManager, SportManager et PupilSportManager

Les entités correspondent juste au schéma des tables avec setters et getters simples.

Les managers proposent les méthodes classiques insert / update / delete et éventuellement des méthodes spéciales style PupilManager::addRandomPupils, PupilSportManager::addSportToPupil($pupilId, $sportId) PupilSportManager::addRandomSportsToPupil($pupilId)

En tout cas pour moi, à priori c'est un non sens de gérer le passage à un nouvel élève dans le setPupilId de l'entité Sport.
Développeur web depuis + de 20 ans