<?php
/** 
 * @author 	:Pascal BLAIN, lycee le castel à Dijon
 * @version :2.1.2023-04-27
 * Classe d'acces aux donnees. Utilise les services de la classe PDO pour l'application
 * Les attributs sont tous statiques, les 4 premiers pour la connexion
 * $monPdo est de type PDO - $monPdoBD contient l'unique instance de la classe
 * @link       http://www.php.net/manual/fr/book.pdo.php
 */

class PdoBD
{   		
	private static $serveur='mysql:host=localhost';
	private static $bdd='dbname=promoinfo';   		
	private static $user='root';    		
	private static $mdp='root';	
	private static $monPdo;
	private static $monPdoBD=null;
			
	private function __construct()
	{
		PdoBD::$monPdo = new PDO(PdoBD::$serveur.';'.PdoBD::$bdd, PdoBD::$user, PdoBD::$mdp); 
		PdoBD::$monPdo->query("SET CHARACTER SET utf8");
	}
	public function _destruct()
	{
		PdoBD::$monPdo = null;
	}
	/**
	 * Fonction statique qui cree l'unique instance de la classe PdoBD
	 * Appel : $instancePdoBD = PdoBD::getPdoBD();
	 */
	public  static function getPdoBD()
	{
		if(PdoBD::$monPdoBD==null)	{PdoBD::$monPdoBD= new PdoBD();}
		return PdoBD::$monPdoBD;  
	}

	/**
	 * Retourne les informations des ELEVES
	*/
	public function getLesEleves()
	{		
		$req = "SELECT EL_PROMO,EL_NUM,EL_TITRE,EL_NOM,EL_PRENOM,EL_PRENOM2,EL_PRENOM3,EL_LOGIN,EL_MDP,EL_RUE,EL_CP,EL_VILLE,EL_TELPERSO,EL_EMAIL,EL_SPECIALITE,EL_BTS,P_TITRE,P_NOM,P_PRENOM,P_RUE,P_CP,P_VILLE,P_TEL,EL_DateModif,EL_PHOTO,EL_NE_LE,EL_BAC_ORIGINE,EL_Lycee,EL_LIEU_NAISSANCE,commentaire
					FROM eleve 
					ORDER BY EL_NOM,EL_PRENOM;";
		$rs = PdoBD::$monPdo->query($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la lecture des &eacute;l&grave;ves ..", $req, PdoBD::$monPdo->errorInfo());}
		$lesLignes = $rs->fetchAll();
		return $lesLignes; 
	}
	
	/**
	 * Retourne les informations d'un eleve sous la forme d'un tableau associatif
	*
	public function getInfosEleve($login,$mdp)
	{
		$req = "SELECT EL_PROMO,EL_NUM,EL_TITRE,EL_NOM,EL_PRENOM,EL_PRENOM2,EL_PRENOM3,EL_LOGIN,EL_MDP,EL_RUE,EL_CP,EL_VILLE,EL_TELPERSO,EL_EMAIL,EL_SPECIALITE,EL_BTS,P_TITRE,P_NOM,P_PRENOM,P_RUE,P_CP,P_VILLE,P_TEL,EL_DateModif,EL_PHOTO,EL_NE_LE,EL_BAC_ORIGINE,EL_Lycee,EL_LIEU_NAISSANCE,commentaire, EL_STATUT, pLibelle as wStatut
					FROM eleve INNER JOIN parametre  ON (pType='statAgt' AND pIndice=EL_STATUT)";
		if ($login==="*") 
		{$req.=" WHERE EL_NUM='$mdp';";}
		else 
		{$req.=" WHERE EL_LOGIN='$login' 
				 AND EL_MDP='$mdp';";}
		
		$rs = PdoBD::$monPdo->query($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la lecture des informations d'un &eacute;lève...", $req, PdoBD::$monPdo->errorInfo());}
		$ligne = $rs->fetch();
		return $ligne;
	}*/
/**
	 * Retourne les informations d'un ELEVE
	 */
	public function getInfosEleve($login,$mdp)
	{
		$req = "SELECT EL_PROMO,EL_NUM,EL_TITRE,EL_NOM,EL_PRENOM,EL_PRENOM2,EL_PRENOM3,EL_LOGIN,EL_MDP,EL_RUE,EL_CP,EL_VILLE,EL_TELPERSO,EL_EMAIL,EL_SPECIALITE,EL_BTS,P_TITRE,P_NOM,P_PRENOM,P_RUE,P_CP,P_VILLE,P_TEL,EL_DateModif,EL_PHOTO,EL_NE_LE,EL_BAC_ORIGINE,EL_Lycee,EL_LIEU_NAISSANCE,commentaire, EL_STATUT, pLibelle as wStatut
			FROM eleve INNER JOIN parametre  ON (pType='statAgt' AND pIndice=EL_STATUT)";
		if ($login==="*") 
			{$req.=" WHERE EL_NUM=:noeleve;";}
		
		else 
			{$req.=" WHERE EL_LOGIN=:login;";}	
		$rs = PdoBD::$monPdo->prepare($req);
		if ($login==="*")
			{$rs->bindParam(':noeleve', $mdp);}
		else
			{$rs->bindParam(':login', $login);}
		$rs->execute();
		$ligne = $rs->fetch();
		return $ligne;
	}

	
/**
	* Met à jour une ligne de la table eleve 
*/
	public function majEleve($valeur,$nom,$prenom,$statut,$mail,$login,$mdp,$adresse,$cp,$ville,$tel,$commentaire)
	{
		$req = "UPDATE eleve SET
					EL_NOM='$nom', EL_PRENOM='$prenom', EL_STATUT=$statut, EL_EMAIL='$mail', EL_LOGIN='$login', EL_RUE='$adresse',
					EL_CP=$cp, EL_VILLE='$ville', EL_TELPERSO='$tel', commentaire='$commentaire', EL_DateModif=NOW()";
		if ($mdp<>"*") {$req.= ",EL_MDP='$mdp' ";}
		$req.=" WHERE EL_NUM='$valeur';";
		$rs = PdoBD::$monPdo->exec($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la mise à jour de l'eleve dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
	}
	
/**
	* supprime une ligne de la table eleve 
*/
	public function supprimeEleve($valeur)
	{
		$req = "DELETE 
				FROM eleve
				WHERE  EL_NUM='$valeur';";
		$rs = PdoBD::$monPdo->exec($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la suppression de l'eleve dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
	}
	
/**
 * ajoute une ligne dans la table eleve
*/
	public function ajoutEleve($valeur,$nom,$prenom,$statut,$mail,$login,$mdp,$adresse,$cp,$ville,$tel,$commentaire)
	{	
		$req="SELECT if( isnull( max(EL_NUM) ) , 1, max(EL_NUM)+1 ) AS numNouveau from eleve;";
		$rs = PdoBD::$monPdo->query($req);
		if($rs === false){afficherErreurSQL("Acces impossible a la table eleve. ", $req, PdoBD::$monPdo->errorInfo());}
		$ligne=$rs->fetch();
		$valeur=$ligne['numNouveau'];	
		
		$req = "INSERT INTO eleve (				EL_NUM,EL_NOM,EL_PRENOM,EL_STATUT,EL_EMAIL,EL_LOGIN,EL_MDP,EL_RUE,EL_CP,EL_VILLE,EL_TELPERSO,commentaire,elDateEnreg, EL_DateModif) 
				VALUES 
					('$valeur', '$nom', '$prenom', $statut, '$mail', '$login', '$mdp', '$adresse', $cp, '$ville', '$tel','$commentaire', NOW(), NOW());";
		$rs = PdoBD::$monPdo->exec($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de l'insertion de l'eleve dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
	}

	/**
	 * Retourne les informations de la table TYPEPARAMETRE
	*/
	public function getLesParametres()
	{
		$req = "SELECT tlId, tlLibelle, tlBooleen, tlChoixMultiple, tlCumul
					FROM typeParametre
					ORDER BY tlLibelle;";
		$rs = PdoBD::$monPdo->query($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la recherche dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
		$lesLignes = $rs->fetchAll();
		return $lesLignes; 
	}
	
/**
 * Retourne dans un tableau associatif les informations de la table PARAMETRE (pour un type particulier)
*/
	public function getParametre($type)
	{
		$req = "SELECT pIndice, pLibelle
				FROM parametre
				WHERE pType='$type'
				ORDER by pIndice;";
		$rs = PdoBD::$monPdo->query($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la recherche des parametres dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
		$lesLignes = $rs->fetchAll();
		return $lesLignes;
	}
/**
 * Retourne dans un tableau associatifles informations de la table PARAMETRE (pour un type particulier)
*/
	public function getInfosParam($type, $valeur)
	{
			if ($valeur=="NULL") 
			{$req = "SELECT pType, max(pIndice)+1 AS pIndice, ' ' AS pLibelle, tlLibelle, pPlancher, pPlafond
						 FROM parametre INNER JOIN typeParametre ON typeParametre.tlId=parametre.pType
						 WHERE pType='$type';";
			}
			else
			{$req = "SELECT pType, pIndice, pLibelle, tlLibelle, pPlancher, pPlafond
						 FROM parametre INNER JOIN typeParametre ON typeParametre.tlId=parametre.pType
						 WHERE pType='$type'
						 AND pIndice like '$valeur';";
			}
					 
		$rs = PdoBD::$monPdo->query($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la recherche dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
		$ligne = $rs->fetch();		
		return $ligne;
	}


/**
 * Met a jour une ligne de la table PARAMETRE
*/
	public function majParametre($type, $valeur, $libelle, $territoire, $dep, $plancher, $plafond)
	{
		$req = "UPDATE parametre SET pLibelle='$libelle', pPlancher=$plancher, pPlafond=$plafond
					WHERE pType='$type'
					AND pIndice=$valeur;";
		$rs = PdoBD::$monPdo->exec($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la mise a jour des parametres dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
	}
	
/**
 * supprime une ligne de la table PARAMETRE 
*/
	public function supprimeParametre($type, $valeur)
	{
		$req = "DELETE 
				FROM parametre
				WHERE pType='$type'
				AND pIndice=$valeur;";
		$rs = PdoBD::$monPdo->exec($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de la suppression d'un parametre dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
	}
	
/**
 * ajoute une ligne dans la table PARAMETRE
*/
	public function ajoutParametre($type, $valeur, $libelle,$territoire, $dep, $plancher, $plafond)
	{	
		$req = "INSERT INTO parametre 
					(pType, pIndice, pLibelle, pPlancher, pPlafond) 
					VALUES ('$type', $valeur, '$libelle', $plancher, $plafond);";
		$rs = PdoBD::$monPdo->exec($req);
		if ($rs === false) {afficherErreurSQL("Probleme lors de l'insertion d'un parametre dans la base de donn&eacute;es.", $req, PdoBD::$monPdo->errorInfo());}
	}
}

?>