8768 sujets

Développement web côté serveur, CMS

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.
Modifié par Gan3sh (29 Jun 2019 - 08:20)
Ne serait-il pas plus simple (et plus logique) de fusionner les tables pupils et pupil_sport ?
Salut
limipl a écrit :
Il semble que dans ta boucle $i n'est pas utilisé.


Tu parles du $i de la boucle qui fait 3 tours ?
En base de données l'enregistrement se fait bien 3 fois mais pour pupil_id le nombre reste à 1 (pour le 1er élève cela est logique) mais pour les suivants ça devrait être 2, 3...
Et ce n'est pas le cas.

limipl a écrit :
Ne serait-il pas plus simple (et plus logique) de fusionner les tables pupils et pupil_sport ?


Justement non car c'est une des contraintes de l'exercice
Modifié par Gan3sh (30 Jun 2019 - 07:10)
A mon avis, le problème vient que tes variables dans la classe Sport sont en "private" ce qui fait qu'elle ne peuvent pas être utilisées en dehors de la classe Sport (donc dans sport manager). Essaie de les passer en protected:

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

....

Et d'ailleurs, tu devrais faire pareil pour ta classe Pupil. En revanche, pas de soucis sur les manager, vu que la connexion à la base de données n'est pas utilisée en dehors, donc le private est justifié
Modifié par Mathieu8337 (30 Jun 2019 - 17:52)
Salut Mathieu8337

Merci pour ta réponse.
Les passer en protected est utile lorsque une classe fille hérite d'une classe mère non ?
J'ai tout de même essayer comme ci-dessous mais cela ne change rien.
Le problème vient du setter de Pupil_id car par défaut, il n'a aucun paramètre ce qui explique qu'il reste à 1 mais je n'arrive pas à changer cela.

Ex:


class Sport
{
	protected $_id;
	protected $_pupil_id;
	protected $_sport_id;
...
}

class sportManager extends Sport
{
    ...
}
Gan3sh a écrit :
Les passer en protected est utile lorsque une classe fille hérite d'une classe mère non ?

En effet... Mais j'ai tellement l'habitude de tout mettre en protected que ça m'a induit en erreur, désolé...
Sinon petite question: as-tu vérifié que les champs id de toutes tes tables sont bien en autoincrement? Est-ce que tu as une erreur SQL à l’exécution?

Et sinon, est-ce que tu pourrais faire

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

pour récupérer directement dans ta fonction la valeur originale de pupil_id?
Modifié par Mathieu8337 (01 Jul 2019 - 10:00)