gestion absences/presences en php

Eléphant du PHP | 150 Messages

20 avr. 2011, 14:19

Bonjour,le dernier code que tu m'as donner ne fonctionne pas ==> il n'enregistre pas la date : quand je choisis une date et une classe et que je coche certain élève absent, Même si je change la date je retrouve les même élèves coché pour toutes les dates.et après si je veux décocher l'absence et que je clique sur enregistrer les absences se recochent automatiquement après l'appui du bouton "enregistrer"
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 avr. 2011, 20:53

Le problème est que tu as modifié le code que je t'ai proposé pour l'adapter à ta propre méthode de conception du traitement, ce qui change considérablement l'algorithme. Et du moment où tu ne montre pas ce que tu as modifié (base de données et code php) et où l'erreur se situe, on ne peut pas t'aider malheureusement.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

21 avr. 2011, 08:31

j'ai mis ça :
// crée la liste des classes
if (isset($dateSeance))
{
        $sql = "SELECT DISTINCT idClasse FROM eleve ORDER BY idClasse;";
		mysql_select_db("bd_eleves", @mysql_connect("localhost","root","")) or die(mysql_error());
		$result = mysql_query($sql) or die(mysql_error());
		while($result && $row=mysql_fetch_array($result))
		{
				$selected = $row['idClasse']==$idClasse? " selected " : "";
				$listeClasses .= "<option value=\"".$row['idClasse']."\" ".$selected." >".$row['idClasse']."</option>";
		}
		mysql_close();
}
a la place de ça
[sql// crée la liste des classes
if (isset($dateSeance))
{
$sql = "SELECT DISTINCT e.idClasse FROM eleve e JOIN seance s ON e.idClasse=s.idClasse
WHERE s.date = date('".$dateSeance."')
ORDER BY e.idClasse;";
mysql_select_db("bd_eleves", @mysql_connect("localhost","root","")) or die(mysql_error());
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
$selected = $row['idClasse']==$idClasse? " selected " : "";
$listeClasses .= "<option value=\"".$row['idClasse']."\" ".$selected." >".$row['idClasse']."</option>";
}
mysql_close();
}
[/sql]

et j'ai un autre problème aussi c'est que quand je fais les test en local avec wamp cela fonctionne mais si j'y met en ligne sur 1&1.fr j'ai une erreur :

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /homepages/36/d163359064/htdocs/code3.php on line 47
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

mais ce n'est pas le plus important pour l'instant mais au cas où tu aurais une réponse je suis preneur.
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 avr. 2011, 11:37

Cette erreur veut dire que la connexion à la base de données sous MySQL de 1&1 n'est pas valide, vérifie les données de connexion qu'il faut mettre, à savoir : le nom du serveur, le nom de l'utilisateur et le mot de passe dans l'instruction :
@mysql_connect("localhost","root",""); // ici: nom serveur="localhost", nom d'utilisateur="root" et mot de passe=""
Mais ce qui est très important c'est la requête qui récupère les états de présence/absence des élèves de la classe sélectionnée dans une date qui correspond à une séance de cours. C'est à dire celle-là:
// crée la liste des élèves et leurs infos assiduité pour la classe sélectionnée
if (isset($idClasse) && isset($idSeance))
{
        $sql = "SELECT e.idEleve, e.nom, e.prenom, a.presence_mat_t1, a.presence_mat_t2, a.presence_amidi_t1, a.presence_amidi_t2
        FROM eleve e Left outer JOIN assiduite a ON a.idSeance='".$idSeance."' AND e.idEleve=a.idEleve
        WHERE e.idClasse = '".$idClasse."'
        ORDER BY e.nom, e.prenom";
        //
        mysql_select_db("bd_eleves", @mysql_connect("localhost","root","")) or die(mysql_error());
        $result = mysql_query($sql) or die(mysql_error());
        while($result && $row=mysql_fetch_array($result))
        {              
                // affiche l'absence sous 4 tranches horaires : 2 le matin (mat_t1 et mat_t2) et 2 l'après-midi (amidi_t1 et amidi_t2)
                $mat_t1_checked = $row['presence_mat_t1']!=1 && !is_null($row['presence_mat_t1']) ? " checked " : "";
                $mat_t2_checked = $row['presence_mat_t2']!=1 && !is_null($row['presence_mat_t2']) ? " checked " : "";
                $amidi_t1_checked = $row['presence_amidi_t1']!=1 && !is_null($row['presence_amidi_t1']) ? " checked " : "";
                $amidi_t2_checked = $row['presence_amidi_t2']!=1 && !is_null($row['presence_amidi_t2']) ? " checked " : "";

                // les checkbox sont nommés comme un tableau nommé : absences[tranche horaire][id séance][id élève]
                $listeAssiduiteEleves .= "<tr><td>".$row['nom']." ".$row['prenom']."</td>
                <td><input type=\"checkbox\" name=\"absences[mat_t1][".$idSeance.",".$row['idEleve']."]\" ".$mat_t1_checked." /> Absent(e)</td>
                <td><input type=\"checkbox\" name=\"absences[mat_t2][".$idSeance.",".$row['idEleve']."]\" ".$mat_t2_checked." /> Absent(e)</td>
                <td><input type=\"checkbox\" name=\"absences[amidi_t1][".$idSeance.",".$row['idEleve']."]\" ".$amidi_t1_checked." /> Absent(e)</td>
                <td><input type=\"checkbox\" name=\"absences[amidi_t2][".$idSeance.",".$row['idEleve']."]\" ".$amidi_t2_checked." /> Absent(e)</td>
                </tr>";
        }
        mysql_close();
}
La question donc est : Est-ce que tu as gardé cette requête tel quel ? et si oui, est-ce que tu as une table séance et comment fais-tu pour récupérer l'idSeance dans ton programme ?

Par ailleurs, j'aimerai bien jeter un coup d’œil sur ton modèle relationnel de la base de données.
Et pour information, moi j'ai utilisé ce modèle relationnel pour mon exemple:
Image
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

21 avr. 2011, 14:58

La question donc est : Est-ce que tu as gardé cette requête tel quel ? et si oui, est-ce que tu as une table séance et comment fais-tu pour récupérer l'idSeance dans ton programme ?
je n'est pas touché a cette requète. la seule que j'ai modifier est celle que je t'es mise avant.
et aussi celle la :
j'ai mis ça :
// crée la liste des élèves et leurs infos assiduité pour la classe sélectionnée
if (isset($idClasse) /* && isset($idSeance) */)
a la place de ça :
// crée la liste des élèves et leurs infos assiduité pour la classe sélectionnée
if (isset($idClasse)  && isset($idSeance))
donc j'ai juste commenter "&&isset($idSeance)"

mais sinon j'ai gardé les table comme tu les as créé dans ton exemple.

Avec ton code on ne peut choisir n'importe quel classe, on peut prendre que les classe où les séances sont défini au préalable tendis qu'avec "mon code" (ton code modifier lol) je peux choisir n'importe qu'elle classe et donc cela m'affiche les nom mais je peux plus gérer les absences comme je t'es dis dans mes message précédents.aurais-je fais une erreur.
Par ailleurs, j'aimerai bien jeter un coup d’œil sur ton modèle relationnel de la base de données.
Et pour information, moi j'ai utilisé ce modèle relationnel pour mon exemple:
que veux tu dire par modèle relationnel? et l'url que tu as mise marche pas je ne peux en l’occurrence allez voir.
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 avr. 2011, 16:49

Ba v'la le problème. Pour toi, tu zappe complétement la notion de séance ; Car Tu listes toutes les classes sans relation avec la date que tu saisie et tu espères noter l'état de présence d'une classe que tu choisi dans cette liste ; Or, il se trouve que la classe que tu choisi n'a pas de cours (séance) pour la date saisie, ce qui provoque une erreur logique et la base de données a été conçue pour noter les présences par élève et par séance. Si tu ne donne pas l'id Séance correspondant à la date saisie et à la classe choisie, la requête de mise à jour des présence échoue.

Mais tu veux ignorer la notion de séance, il faut supprimer la table "seance" et intégrer ses champs dans la table "assiduite" ce qui te permet de saisir l'état de présence d'une classe dans le temps comme tu veux, c'est à dire sans avoir à programmer au préalable le planning des séances de cours des classes d'élèves. Ce qui est obérant à mon humble avis et qui engendre beaucoup de redondances de données au niveau de la table "assiduite" comme la date, la classe, le prof et la matière qui sont communs aux élèves de la même classe. Mais bon tu peux aller dans ce sens même si je te le déconseille.

NB: Le modèle relationnel est le schéma de la base de données.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

21 avr. 2011, 17:33

Ba v'la le problème. Pour toi, tu zappe complétement la notion de séance ; Car Tu listes toutes les classes sans relation avec la date que tu saisie et tu espères noter l'état de présence d'une classe que tu choisi dans cette liste ; Or, il se trouve que la classe que tu choisi n'a pas de cours (séance) pour la date saisie, ce qui provoque une erreur logique et la base de données a été conçue pour noter les présences par élève et par séance. Si tu ne donne pas l'id Séance correspondant à la date saisie et à la classe choisie, la requête de mise à jour des présence échoue.

Mais tu veux ignorer la notion de séance, il faut supprimer la table "seance" et intégrer ses champs dans la table "assiduite" ce qui te permet de saisir l'état de présence d'une classe dans le temps comme tu veux, c'est à dire sans avoir à programmer au préalable le planning des séances de cours des classes d'élèves. Ce qui est obérant à mon humble avis et qui engendre beaucoup de redondances de données au niveau de la table "assiduite" comme la date, la classe, le prof et la matière qui sont communs aux élèves de la même classe. Mais bon tu peux aller dans ce sens même si je te le déconseille.

NB: Le modèle relationnel est le schéma de la base de données.
le problème est que je dois créer une gestion d'absence pour que le directeur gagne du temps (pour lui il veut juste a avoir les absences du jour et pouvoir les retrouver par la suite) alors si il faut qu'il rentre les séances c'est un temps fou de perdu et autant rester sur papier.donc tu pense que je suis obliger de supprimer la table séance?et donc créer une table matiéres et professeurs?
tu peux me citer un exemple de problème que sa peut engendrer de faire ça?
ça fait quoi que le professeur la date et la classe soit identique?si c'est vrai!!
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 avr. 2011, 00:43

Ok, c'est comme tu veux, le client est roi. Tu fais alors comme on t'as demandé. Donc plus de table "séance" on se contente de la table assiduité où on fera l'enregistrement des absences/présences directement en y enregistrant aussi toutes les données utiles comme la date, l'id de l'élève, la matière et le prof.
Tu peux aussi créer deux tables "matière" et "prof" pour alimenter deux listes déroulantes et simplifier la saisie.

J'ai réadapté pour cela la base de données et le code PHP que voici:

La base:
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Jeu 21 Avril 2011 à 22:18
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `bd_eleves`
--

-- --------------------------------------------------------

--
-- Structure de la table `assiduite`
--

CREATE TABLE IF NOT EXISTS `assiduite` (
  `date` date NOT NULL,
  `idEleve` int(11) NOT NULL,
  `nomMatiere` varchar(50) NOT NULL,
  `nomProf` varchar(50) NOT NULL,
  `presence_mat_t1` int(11) NOT NULL DEFAULT '1',
  `presence_mat_t2` int(11) NOT NULL DEFAULT '1',
  `presence_amidi_t1` int(1) NOT NULL DEFAULT '1',
  `presence_amidi_t2` int(11) NOT NULL DEFAULT '1',
  UNIQUE KEY `idCours` (`date`,`idEleve`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `assiduite`
--

INSERT INTO `assiduite` (`date`, `idEleve`, `nomMatiere`, `nomProf`, `presence_mat_t1`, `presence_mat_t2`, `presence_amidi_t1`, `presence_amidi_t2`) VALUES
('2011-04-18', 1, 'Programmation', 'Mme. La Prof', 1, 1, 1, 1),
('2011-04-18', 2, 'Programmation', 'Mme. La Prof', 1, 1, 1, 1),
('2011-04-18', 3, 'Programmation', 'Mme. La Prof', 0, 0, 0, 0),
('2011-04-18', 4, 'Anglais', 'Mme. La Prof', 0, 1, 1, 1),
('2011-04-18', 5, 'Anglais', 'Mme. La Prof', 0, 0, 0, 0);

-- --------------------------------------------------------

--
-- Structure de la table `eleve`
--

CREATE TABLE IF NOT EXISTS `eleve` (
  `idEleve` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(20) NOT NULL,
  `prenom` varchar(20) NOT NULL,
  `idClasse` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`idEleve`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Contenu de la table `eleve`
--

INSERT INTO `eleve` (`idEleve`, `nom`, `prenom`, `idClasse`) VALUES
(1, 'LABELLE', 'Aline', 'BTS-INF-A1'),
(2, 'BONHOMME', 'Olivier', 'BTS-INF-A1'),
(3, 'JAMAISLA', 'Stéphane', 'BTS-INF-A1'),
(4, 'RENAULT', 'Pascal', 'BTS-INF-A2'),
(5, 'DAHOU', 'Géraldine', 'BTS-INF-A2');

-- --------------------------------------------------------

--
-- Structure de la table `matiere`
--

CREATE TABLE IF NOT EXISTS `matiere` (
  `nom` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `matiere`
--

INSERT INTO `matiere` (`nom`) VALUES
('Programmation'),
('Anglais');

-- --------------------------------------------------------

--
-- Structure de la table `prof`
--

CREATE TABLE IF NOT EXISTS `prof` (
  `nom` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `prof`
--

INSERT INTO `prof` (`nom`) VALUES
('Mr. Le Prof'),
('Mme. La Prof');
Et le programme :
<?php 
// init
$date = isset($_GET['date']) && !empty($_GET['date'])? $_GET['date'] : null;
$idClasse = isset($_GET['idClasse']) && !empty($_GET['idClasse'])? $_GET['idClasse'] : null;
$nomMatiere = isset($_GET['nomMatiere']) && !empty($_GET['nomMatiere'])? $_GET['nomMatiere'] : null;
$nomProf 	= isset($_GET['nomProf']) && !empty($_GET['nomProf'])? $_GET['nomProf'] : null;

// variable pour savoir s'il faut créer une nouvelle absence ou modifier une existante
$mode_ajout = isset($_GET['mode_ajout']) && !empty($_GET['mode_ajout'])? $_GET['mode_ajout'] : null;

// connction à la base de données
mysql_select_db("bd_eleves", @mysql_connect("localhost","root","")) or die(mysql_error());

// enregistrer la saisie du formulaire
if (isset($_GET['action']) && $_GET['action']=='Enregistrer')
{
	//
	$message = "";
	if (empty($date)) $message .= "<p>La date est obligatoire !</p>";
	if (empty($idClasse)) $message .= "<p>La classe est obligatoire !</p>";
	if (empty($nomMatiere)) $message .= "<p>La matière est obligatoire !</p>"; 
	if (empty($nomProf)) $message .= "<p>Le/la prof est obligatoire !</p>";
	//
	if (empty($message))
	{
		$listeAbsences = isset($_GET['absences'])?$_GET['absences']:array();
		//echo "<pre>"; print_r($listeAbsences); echo "</pre>";
		$sql = "SELECT * FROM eleve WHERE idClasse = '".$idClasse."';";
		$result = mysql_query($sql) or die(mysql_error());
		while($result && $row=mysql_fetch_array($result))
		{
			$idEleve = $row['idEleve'];	$nomEleve = $row['nom'];
			$presence_mat_t1 = isset($listeAbsences["$idEleve"]['mat_t1'])?0:1;
			$presence_mat_t2 = isset($listeAbsences["$idEleve"]['mat_t2'])?0:1;
			$presence_amidi_t1 = isset($listeAbsences["$idEleve"]['amidi_t1'])?0:1;
			$presence_amidi_t2 = isset($listeAbsences["$idEleve"]['amidi_t2'])?0:1;
			//
			// Nouvel enregistrement ou Mise à jour
			if ($mode_ajout==true){
			$sql="INSERT INTO assiduite SET date='".$date."', idEleve='".$idEleve."', 
									nomMatiere='".$nomMatiere."', nomProf='".$nomProf."',
									presence_mat_t1='".$presence_mat_t1."',
									presence_mat_t2='".$presence_mat_t2."',
									presence_amidi_t1='".$presence_amidi_t1."',
									presence_amidi_t2='".$presence_amidi_t2."';";				
			} else {
				$sql="UPDATE assiduite SET 	nomMatiere='".$nomMatiere."', nomProf='".$nomProf."',
									presence_mat_t1='".$presence_mat_t1."',
									presence_mat_t2='".$presence_mat_t2."',
									presence_amidi_t1='".$presence_amidi_t1."',
									presence_amidi_t2='".$presence_amidi_t2."'
						WHERE date='".$date."' AND idEleve='".$idEleve."';";			
			}
			//
			//echo $sql;
			if (!@mysql_query($sql)) $message .= "<li>".$nomEleve." => Erreur : ".mysql_error()."</li>";
		}
		if (empty($message)) $message = "Enregistrement effectué avec succès"; 
		else $message = "<p>Les Erreurs suivantes sont rencontrées :</ul>" . $message . "</ul></p>";
	}
}

// crée la liste des classes
$listeClasses = "";
$sql = "SELECT DISTINCT idClasse FROM eleve ORDER BY idClasse;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['idClasse']==$idClasse? " selected " : "";
	$listeClasses .= "<option value=\"".$row['idClasse']."\" ".$selected." >".$row['idClasse']."</option>";
}

// crée les listes des matières
$listeMatieres = "";
$sql = "SELECT * FROM matiere ORDER BY nom;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['nom']==$nomMatiere? " selected " : "";
	$listeMatieres .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
}

// crée les listes des profs
$listeProfs = "";
$sql = "SELECT * FROM prof ORDER BY nom;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['nom']==$nomProf? " selected " : "";
	$listeProfs .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
}

// crée la liste des élèves de la classe sélectionnée
$listeAssiduiteEleves = "";
if (isset($idClasse) && isset($date))
{
	// on fait une jointure externe à gauche du côté de la table client vers la table assiduité
	// pour afficher tous les élèves de la classe même si les données de présence sont NULL (cas nouvelle saisie)
	$sql = "SELECT a.*, e.*
	FROM eleve e LEFT OUTER JOIN assiduite a ON e.idEleve=a.idEleve AND a.date=date('".$date."')
	WHERE e.idClasse = '".$idClasse."'
	ORDER BY e.nom, e.prenom";
	//echo $sql;
	$result = mysql_query($sql) or die(mysql_error());
	while($result && $row=mysql_fetch_array($result))
	{		
		// si les données d'assiduité sont NULL (surtout la date) alors il s'agit d'une nouvelle feuille de présence
		// sinon affiche l'absence sous 4 tranches horaires : 2 le matin(mat_t1 et mat_t2) et 2 l'après-midi(amidi_t1 et amidi_t2)
		if (is_null($row["date"])) $mode_ajout = true; else $mode_ajout = false;
		//
		$mat_t1_checked = $row['presence_mat_t1']!=1 && !is_null($row['presence_mat_t1']) ? " checked " : "";
		$mat_t2_checked = $row['presence_mat_t2']!=1 && !is_null($row['presence_mat_t2']) ? " checked " : "";
		$amidi_t1_checked = $row['presence_amidi_t1']!=1 && !is_null($row['presence_amidi_t1']) ? " checked " : "";
		$amidi_t2_checked = $row['presence_amidi_t2']!=1 && !is_null($row['presence_amidi_t2']) ? " checked " : "";
		//
		$listeAssiduiteEleves .= "<tr><td>".$row['nom']." ".$row['prenom']."</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][mat_t1]\" ".$mat_t1_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][mat_t2]\" ".$mat_t2_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][amidi_t1]\" ".$amidi_t1_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][amidi_t2]\" ".$amidi_t2_checked." /> Absent(e)</td>
		</tr>";
	}
}

// fin de connexion
mysql_close();

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Gestion d'assiduité des élèves</title>
<link rel="stylesheet" type="text/css" href="calendrier.css">
<script type="text/javascript" src="calendrier.js"></script>
</head>
<body>
<h1>Gestion d'assiduité des élèves</h1>

<form name="form1" action="" method="get">
<table>
<tr>
<th>Date : </th><td><input type="text" id="dateLib" name="date" value="<?php echo $date; ?>" style="width:180px"
        onfocus="visuCal(this,{'format' : '%a-%m-%j'})" onblur="masqueCal(this);"  /></td>

<th>Classe :</th><td><select name="idClasse" onchange="form1.submit();" value="<?php echo $idClasse; ?>" >
<option value="" ></option>
<?php echo $listeClasses; ?>
</select></td>

<th>Matière : </th><td><select name="nomMatiere" value="<?php echo $nomMatiere; ?>" >
<option value="" ></option>
<?php echo $listeMatieres; ?>
</select></td>

<th>Prof : </th><td><select name="nomProf" value="<?php echo $nomProf; ?>" >
<option value="" ></option>
<?php echo $listeProfs; ?>
</select></td>

</tr>
</table>
<hr />
<?php if ($mode_ajout==true) { ?>
<h2>Nouvelle Feuille de présence</h2>
<p>Veuillez cocher une case pour désigner une absence.<br />
Pour ajouter cette feuille dans la base de données, appuyer sur le bouton Enregistrer</p>
<?php } else { ?> 
<h2>Feuille de présence existante</h2>
<p>Veuillez cocher une case pour désigner une absence.<br />
Vous pouvez modifie cette feuille puis appuyer sur le bouton Enregistrer pour mettre à jour la base de données.</p>
<?php } ?> 
<table border="1">
<tr><th>Nom - Prenom</th><th>8h00 - 10h00</th><th>10h00 - 12h00</th><th>13h30 - 15h30</th><th>15h30 - 17h30</th></tr>
<?php echo $listeAssiduiteEleves; ?>
</table>

<input type="hidden" name="mode_ajout" value="<?php echo $mode_ajout; ?>" />
<input type="submit" name="action" value="Enregistrer" />
</form>
<div id="message"><?php echo isset($message)?$message:''; ?></div>
</body>
</html>
Le programme est légèrement modifié pour détecter automatiquement si la feuille de présence affichée est une nouvelle feuille ou une feuille existante et effectue donc soit l'insertion de nouvelles données de pésences/Absences ou bien il met à jour des présences/absences existantes.

Voici une image du schéma relationnel de la base de données pour information:
Image
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

22 avr. 2011, 09:25

Merci le programme est nikel à un détail près : la matière et le prof sont définis pour la journée et non pour la tranche horaires comme je t'avais envoyer dans mon tableau (car en faite il y a 3 BTS mais ils ont leur cours en même temps dans une seul salle de classe). Est ce que sa vient juste de la disposition et que si je refait juste l'html (le tableau) en mettant plusieurs fois la matière et le prof sa va fonctionner ou est ce qu'il faut changer quelque chose à la base de donnée??
Et serait il possible de remettre des liste déroulante avec présent par défaut et donc = 0 et si on veut mettre absent on choisit absent et donc =1 mais je ne sais pas si c'est judicieux car c'est beaucoup plus long que de cocher des cases.
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Eléphant du PHP | 150 Messages

22 avr. 2011, 10:21

est ce que c'est possible de définir que si on coche une case "absent" c'est égale a 2h d'absence ? et donc par la suite pouvoir comptabilisé les heures d'absences pour un élève?et est ce que c'est possible de comptabilisé les heures de présence pour un élève??
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 avr. 2011, 11:17

Merci le programme est nikel à un détail près : la matière et le prof sont définis pour la journée et non pour la tranche horaires comme je t'avais envoyer dans mon tableau (car en faite il y a 3 BTS mais ils ont leur cours en même temps dans une seul salle de classe). Est ce que sa vient juste de la disposition et que si je refait juste l'html (le tableau) en mettant plusieurs fois la matière et le prof sa va fonctionner ou est ce qu'il faut changer quelque chose à la base de donnée??
Et serait il possible de remettre des liste déroulante avec présent par défaut et donc = 0 et si on veut mettre absent on choisit absent et donc =1 mais je ne sais pas si c'est judicieux car c'est beaucoup plus long que de cocher des cases.
Pour la dernière question, il vaudrait mieux laisser les cases à cocher c'est plus ergonomique et facile à saisir.

Pour la question des profs et des matières, j'ai oublié de regarder ton formulaire HTML que tu as posté auparavant, où effectivement tu notes un prof et une matière par tranche horaire. Du coup on doit gérer 4 profs et 4 matière pour une journée. C'est pas la mer à boire, c'est faisable en modifiant la table "assiduité" en y ajoutant 4 champs pour les profs et 4 champs pour les matières. Et par conséquent, on doit modifier le programme PHP et HTML pour gérer ces champs dans les requêtes et dans l'affichage.

Voici le résultat :

La base de données modifiée:
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Ven 22 Avril 2011 à 09:11
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.4

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `bd_eleves`
--

-- --------------------------------------------------------

--
-- Structure de la table `assiduite`
--

CREATE TABLE IF NOT EXISTS `assiduite` (
  `date` date NOT NULL,
  `idEleve` int(11) NOT NULL,
  `presence_mat_t1` int(11) NOT NULL DEFAULT '1',
  `presence_mat_t2` int(11) NOT NULL DEFAULT '1',
  `presence_amidi_t1` int(1) NOT NULL DEFAULT '1',
  `presence_amidi_t2` int(11) NOT NULL DEFAULT '1',
  `nomProf_mat_t1` varchar(50) NOT NULL,
  `nomProf_mat_t2` varchar(50) NOT NULL,
  `nomProf_amidi_t1` varchar(50) NOT NULL,
  `nomProf_amidi_t2` varchar(50) NOT NULL,
  `nomMatiere_mat_t1` varchar(50) NOT NULL,
  `nomMatiere_mat_t2` varchar(50) NOT NULL,
  `nomMatiere_amidi_t1` varchar(50) NOT NULL,
  `nomMatiere_amidi_t2` varchar(50) NOT NULL,
  UNIQUE KEY `idAssiduite` (`date`,`idEleve`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `assiduite`
--

INSERT INTO `assiduite` (`date`, `idEleve`, `presence_mat_t1`, `presence_mat_t2`, `presence_amidi_t1`, `presence_amidi_t2`, `nomProf_mat_t1`, `nomProf_mat_t2`, `nomProf_amidi_t1`, `nomProf_amidi_t2`, `nomMatiere_mat_t1`, `nomMatiere_mat_t2`, `nomMatiere_amidi_t1`, `nomMatiere_amidi_t2`) VALUES
('2011-04-18', 1, 1, 1, 1, 1, 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Anglais', 'Anglais', 'Anglais', 'Anglais'),
('2011-04-18', 2, 1, 1, 1, 1, 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Anglais', 'Anglais', 'Anglais', 'Anglais'),
('2011-04-18', 3, 0, 0, 0, 0, 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Anglais', 'Anglais', 'Anglais', 'Anglais'),
('2011-04-18', 4, 1, 1, 0, 1, 'Mr. Le Prof', 'Mr. Le Prof', 'Mme. La Prof', 'Mme. La Prof', 'Programmation', 'Programmation', 'Anglais', 'Anglais'),
('2011-04-18', 5, 1, 1, 0, 1, 'Mr. Le Prof', 'Mr. Le Prof', 'Mme. La Prof', 'Mme. La Prof', 'Programmation', 'Programmation', 'Anglais', 'Anglais');

-- --------------------------------------------------------

--
-- Structure de la table `eleve`
--

CREATE TABLE IF NOT EXISTS `eleve` (
  `idEleve` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(20) NOT NULL,
  `prenom` varchar(20) NOT NULL,
  `idClasse` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`idEleve`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Contenu de la table `eleve`
--

INSERT INTO `eleve` (`idEleve`, `nom`, `prenom`, `idClasse`) VALUES
(1, 'LABELLE', 'Aline', 'BTS-INF-A1'),
(2, 'BONHOMME', 'Olivier', 'BTS-INF-A1'),
(3, 'JAMAISLA', 'Stéphane', 'BTS-INF-A1'),
(4, 'RENAULT', 'Pascal', 'BTS-INF-A2'),
(5, 'DAHOU', 'Géraldine', 'BTS-INF-A2');

-- --------------------------------------------------------

--
-- Structure de la table `matiere`
--

CREATE TABLE IF NOT EXISTS `matiere` (
  `nom` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `matiere`
--

INSERT INTO `matiere` (`nom`) VALUES
('Programmation'),
('Anglais');

-- --------------------------------------------------------

--
-- Structure de la table `prof`
--

CREATE TABLE IF NOT EXISTS `prof` (
  `nom` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `prof`
--

INSERT INTO `prof` (`nom`) VALUES
('Mr. Le Prof'),
('Mme. La Prof');
Le programme modifié :
<?php 
// init
$date = isset($_GET['date']) && !empty($_GET['date'])? $_GET['date'] : null;
$idClasse = isset($_GET['idClasse']) && !empty($_GET['idClasse'])? $_GET['idClasse'] : null;
//
$nomProf_mat_t1 = isset($_GET['nomProf_mat_t1']) ? $_GET['nomProf_mat_t1'] : null;
$nomProf_mat_t2 = isset($_GET['nomProf_mat_t2']) ? $_GET['nomProf_mat_t2'] : null;
$nomProf_amidi_t1 = isset($_GET['nomProf_amidi_t1']) ? $_GET['nomProf_amidi_t1'] : null;
$nomProf_amidi_t2 = isset($_GET['nomProf_amidi_t2']) ? $_GET['nomProf_amidi_t2'] : null;
		//
$nomMatiere_mat_t1 = isset($_GET['nomMatiere_mat_t1']) ? $_GET['nomMatiere_mat_t1'] : null;
$nomMatiere_mat_t2 = isset($_GET['nomMatiere_mat_t2']) ? $_GET['nomMatiere_mat_t2'] : null;
$nomMatiere_amidi_t1 = isset($_GET['nomMatiere_amidi_t1']) ? $_GET['nomMatiere_amidi_t1'] : null;
$nomMatiere_amidi_t2 = isset($_GET['nomMatiere_amidi_t2']) ? $_GET['nomMatiere_amidi_t2'] : null;

// variable pour savoir s'il faut créer une nouvelle absence ou modifier une existante
$mode_ajout = isset($_GET['mode_ajout']) && !empty($_GET['mode_ajout'])? $_GET['mode_ajout'] : null;

// connction à la base de données
mysql_select_db("bd_eleves", @mysql_connect("localhost","root","")) or die(mysql_error());

// enregistrer la saisie du formulaire
if (isset($_GET['action']) && $_GET['action']=='Enregistrer')
{
	//
	$message = "";
	if (empty($date)) $message .= "<p>La date est obligatoire !</p>";
	if (empty($idClasse)) $message .= "<p>La classe est obligatoire !</p>";
	if (empty($nomMatiere_mat_t1) || empty($nomMatiere_mat_t2)
	||empty($nomMatiere_amidi_t1) || empty($nomMatiere_amidi_t2)) $message .= "<p>La matière est obligatoire !</p>"; 
	if (empty($nomProf_mat_t1) || empty($nomProf_mat_t2)
	||empty($nomProf_amidi_t1) || empty($nomProf_amidi_t2)) $message .= "<p>Le/la prof est obligatoire !</p>";
	//
	if (empty($message))
	{
		$listeAbsences = isset($_GET['absences'])?$_GET['absences']:array();
		//echo "<pre>"; print_r($listeAbsences); echo "</pre>";
		$sql = "SELECT * FROM eleve WHERE idClasse = '".$idClasse."';";
		$result = mysql_query($sql) or die(mysql_error());
		while($result && $row=mysql_fetch_array($result))
		{
			$idEleve = $row['idEleve'];	$nomEleve = $row['nom'];
			$presence_mat_t1 = isset($listeAbsences["$idEleve"]['mat_t1'])?0:1;
			$presence_mat_t2 = isset($listeAbsences["$idEleve"]['mat_t2'])?0:1;
			$presence_amidi_t1 = isset($listeAbsences["$idEleve"]['amidi_t1'])?0:1;
			$presence_amidi_t2 = isset($listeAbsences["$idEleve"]['amidi_t2'])?0:1;
			//
			// Nouvel enregistrement ou Mise à jour
			if ($mode_ajout==true){
			$sql="INSERT INTO assiduite SET date='".$date."', idEleve='".$idEleve."', 
									presence_mat_t1='".$presence_mat_t1."',
									presence_mat_t2='".$presence_mat_t2."',
									presence_amidi_t1='".$presence_amidi_t1."',
									presence_amidi_t2='".$presence_amidi_t2."',
									
									nomProf_mat_t1 = '".$nomProf_mat_t1."',
									nomProf_mat_t2 = '".$nomProf_mat_t2."',
									nomProf_amidi_t1 = '".$nomProf_amidi_t1."',
									nomProf_amidi_t2 = '".$nomProf_amidi_t2."',

									nomMatiere_mat_t1 = '".$nomMatiere_mat_t1."',
									nomMatiere_mat_t2 = '".$nomMatiere_mat_t2."',
									nomMatiere_amidi_t1 = '".$nomMatiere_amidi_t1."',
									nomMatiere_amidi_t2 = '".$nomMatiere_amidi_t2."';";				
			} else {
				$sql="UPDATE assiduite SET 	
									presence_mat_t1='".$presence_mat_t1."',
									presence_mat_t2='".$presence_mat_t2."',
									presence_amidi_t1='".$presence_amidi_t1."',
									presence_amidi_t2='".$presence_amidi_t2."',
									
									nomProf_mat_t1 = '".$nomProf_mat_t1."',
									nomProf_mat_t2 = '".$nomProf_mat_t2."',
									nomProf_amidi_t1 = '".$nomProf_amidi_t1."',
									nomProf_amidi_t2 = '".$nomProf_amidi_t2."',

									nomMatiere_mat_t1 = '".$nomMatiere_mat_t1."',
									nomMatiere_mat_t2 = '".$nomMatiere_mat_t2."',
									nomMatiere_amidi_t1 = '".$nomMatiere_amidi_t1."',
									nomMatiere_amidi_t2 = '".$nomMatiere_amidi_t2."'
									
						WHERE date='".$date."' AND idEleve='".$idEleve."';";			
			}
			//
			//echo $sql;
			if (!@mysql_query($sql)) $message .= "<li>".$nomEleve." => Erreur : ".mysql_error()."</li>";
		}
		if (empty($message)) $message = "Enregistrement effectué avec succès"; 
		else $message = "<p>Les Erreurs suivantes sont rencontrées :</ul>" . $message . "</ul></p>";
	}
}

// crée la liste des classes
$listeClasses = "";
$sql = "SELECT DISTINCT idClasse FROM eleve ORDER BY idClasse;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['idClasse']==$idClasse? " selected " : "";
	$listeClasses .= "<option value=\"".$row['idClasse']."\" ".$selected." >".$row['idClasse']."</option>";
}

// crée les listes des matières
$listeMatieres_mat_t1 = "";
$listeMatieres_mat_t2 = "";
$listeMatieres_amidi_t1 = "";
$listeMatieres_amidi_t2 = "";
$sql = "SELECT * FROM matiere ORDER BY nom;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['nom']==$nomMatiere_mat_t1? " selected " : "";
	$listeMatieres_mat_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";	
	//
	$selected = $row['nom']==$nomMatiere_mat_t2? " selected " : "";
	$listeMatieres_mat_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomMatiere_amidi_t1? " selected " : "";
	$listeMatieres_amidi_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomMatiere_amidi_t2? " selected " : "";
	$listeMatieres_amidi_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
}

// crée les listes des profs
$listeProfs_mat_t1 = "";
$listeProfs_mat_t2 = "";
$listeProfs_amidi_t1 = "";
$listeProfs_amidi_t2 = "";
$sql = "SELECT * FROM prof ORDER BY nom;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['nom']==$nomProf_mat_t1? " selected " : "";
	$listeProfs_mat_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";	
	//
	$selected = $row['nom']==$nomProf_mat_t2? " selected " : "";
	$listeProfs_mat_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomProf_amidi_t1? " selected " : "";
	$listeProfs_amidi_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomProf_amidi_t2? " selected " : "";
	$listeProfs_amidi_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
}

// crée la liste des élèves de la classe sélectionnée
$listeAssiduiteEleves = "";
if (isset($idClasse) && isset($date))
{
	// on fait une jointure externe à gauche du côté de la table client vers la table assiduité
	// pour afficher tous les élèves de la classe même si les données de présence sont NULL (cas nouvelle saisie)
	$sql = "SELECT a.*, e.*
	FROM eleve e LEFT OUTER JOIN assiduite a ON e.idEleve=a.idEleve AND a.date=date('".$date."')
	WHERE e.idClasse = '".$idClasse."'
	ORDER BY e.nom, e.prenom";
	//echo $sql;
	$result = mysql_query($sql) or die(mysql_error());
	while($result && $row=mysql_fetch_array($result))
	{		
		// si les données d'assiduité sont NULL (surtout la date) alors il s'agit d'une nouvelle feuille de présence
		// sinon affiche l'absence sous 4 tranches horaires : 2 le matin(mat_t1 et mat_t2) et 2 l'après-midi(amidi_t1 et amidi_t2)
		if (is_null($row["date"])) $mode_ajout = true; else $mode_ajout = false;
		//
		$nomProf_mat_t1 = $row['nomProf_mat_t1'];
		$nomProf_mat_t2 = $row['nomProf_mat_t2'];
		$nomProf_amidi_t1 = $row['nomProf_amidi_t1'];
		$nomProf_amidi_t2 = $row['nomProf_amidi_t2'];
		//
		$nomMatiere_mat_t1 = $row['nomMatiere_mat_t1'];
		$nomMatiere_mat_t2 = $row['nomMatiere_mat_t2'];
		$nomMatiere_amidi_t1 = $row['nomMatiere_amidi_t1'];
		$nomMatiere_amidi_t2 = $row['nomMatiere_amidi_t2'];
		//
		$mat_t1_checked = $row['presence_mat_t1']!=1 && !is_null($row['presence_mat_t1']) ? " checked " : "";
		$mat_t2_checked = $row['presence_mat_t2']!=1 && !is_null($row['presence_mat_t2']) ? " checked " : "";
		$amidi_t1_checked = $row['presence_amidi_t1']!=1 && !is_null($row['presence_amidi_t1']) ? " checked " : "";
		$amidi_t2_checked = $row['presence_amidi_t2']!=1 && !is_null($row['presence_amidi_t2']) ? " checked " : "";
		//
		$listeAssiduiteEleves .= "<tr><td>".$row['nom']." ".$row['prenom']."</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][mat_t1]\" ".$mat_t1_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][mat_t2]\" ".$mat_t2_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][amidi_t1]\" ".$amidi_t1_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][amidi_t2]\" ".$amidi_t2_checked." /> Absent(e)</td>
		</tr>";
	}
}

// fin de connexion
mysql_close();

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Gestion d'assiduité des élèves</title>
<link rel="stylesheet" type="text/css" href="calendrier.css">
<script type="text/javascript" src="calendrier.js"></script>
</head>
<body>
<h1>Gestion d'assiduité des élèves</h1>

<form name="form1" action="" method="get">
<table>
<tr>
<th>Date : </th><td><input type="text" id="dateLib" name="date" value="<?php echo $date; ?>" style="width:180px"
        onfocus="visuCal(this,{'format' : '%a-%m-%j'})" onblur="masqueCal(this);"  /></td>

<th>Classe :</th><td><select name="idClasse" onchange="form1.submit();" value="<?php echo $idClasse; ?>" >
<option value="" ></option>
<?php echo $listeClasses; ?>
</select></td>
</tr>
</table>
<hr />
<?php if ($mode_ajout==true) { ?>
<h2>Nouvelle Feuille de présence</h2>
<p>Veuillez cocher une case pour désigner une absence.<br />
Pour ajouter cette feuille dans la base de données, appuyer sur le bouton Enregistrer</p>
<?php } else { ?> 
<h2>Feuille de présence existante</h2>
<p>Veuillez cocher une case pour désigner une absence.<br />
Vous pouvez modifie cette feuille puis appuyer sur le bouton Enregistrer pour mettre à jour la base de données.</p>
<?php } ?> 
<table border="1">
<tr><th>Nom - Prenom</th><th>8h00 - 10h00</th><th>10h00 - 12h00</th><th>13h30 - 15h30</th><th>15h30 - 17h30</th></tr>
<?php echo $listeAssiduiteEleves; ?>
<tr>
<th>Prof : </th>
<td><select name="nomProf_mat_t1" value="<?php echo $nomProf_mat_t1; ?>" >
<option value="" ></option>
<?php echo $listeProfs_mat_t1; ?>
</select></td>
<td><select name="nomProf_mat_t2" value="<?php echo $nomProf_mat_t2; ?>" >
<option value="" ></option>
<?php echo $listeProfs_mat_t2; ?>
</select></td>
<td><select name="nomProf_amidi_t1" value="<?php echo $nomProf_amidi_t1; ?>" >
<option value="" ></option>
<?php echo $listeProfs_amidi_t1; ?>
</select></td>
<td><select name="nomProf_amidi_t2" value="<?php echo $nomProf_amidi_t2; ?>" >
<option value="" ></option>
<?php echo $listeProfs_amidi_t2; ?>
</select></td>
</tr>
<tr>
<th>Matière : </th>
<td><select name="nomMatiere_mat_t1" value="<?php echo $nomMatiere_mat_t1; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_mat_t1; ?>
</select></td>
<td><select name="nomMatiere_mat_t2" value="<?php echo $nomMatiere_mat_t2; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_mat_t2; ?>
</select></td>
<td><select name="nomMatiere_amidi_t1" value="<?php echo $nomMatiere_amidi_t1; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_amidi_t1; ?>
</select></td>
<td><select name="nomMatiere_amidi_t2" value="<?php echo $nomMatiere_amidi_t2; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_amidi_t2; ?>
</select></td>
</tr>
</table>

<input type="hidden" name="mode_ajout" value="<?php echo $mode_ajout; ?>" />
<input type="submit" name="action" value="Enregistrer" />
</form>
<div id="message"><?php echo isset($message)?$message:''; ?></div>
</body>
</html>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 avr. 2011, 11:43

est ce que c'est possible de définir que si on coche une case "absent" c'est égale a 2h d'absence ? et donc par la suite pouvoir comptabilisé les heures d'absences pour un élève?et est ce que c'est possible de comptabilisé les heures de présence pour un élève??
Oui, tu peux avec une requête de calcul interroger la table "assiduité" sachant qu'un état de présence vaut 1 et un état d'absence vaut 0, on peut multiplier chaque état par 2 pour le convertir en heures.
Du coup, pour un élève X et une date (un jour de 8 heures), la somme des présences (valeur 1) * 2 = le total d'heures de présence par jour et inversement, la somme des absences (valeur 0)*2, ôtée de 8 heures journalière = le total d'heures d'absences par jour.

Voici 2 requêtes créées comme des vues qui font ce calcul pour comptabiliser les présences et les absences par élève et par date (jour de 8 heures de travail) :
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Ven 22 Avril 2011 à 09:26
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.4

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `bd_eleves`
--

USE `bd_eleves`;

-- --------------------------------------------------------

--
-- Structure de la vue `nbre_heures_absence_par_jour`
--

CREATE VIEW `nbre_heures_absence_par_jour` AS 
select `date` AS `date`,`idEleve` AS `idEleve`,
	   sum(8 -((`presence_mat_t1` * 2) +(`presence_mat_t2` * 2) + (`presence_amidi_t1` * 2) + (`presence_amidi_t2` * 2))) AS `nbre_heures_absence` 
from `assiduite` group by `date`,`idEleve`;

-- --------------------------------------------------------

--
-- Structure de la vue `nbre_heures_presence_par_jour`
--

CREATE VIEW `nbre_heures_presence_par_jour` AS 
select `date` AS `date`,`idEleve` AS `idEleve`,
	   sum((`presence_mat_t1` * 2) +(`presence_mat_t2` * 2) + (`presence_amidi_t1` * 2) + (`presence_amidi_t2` * 2)) AS `nbre_heures_presence` 
from `assiduite` group by `date`,`idEleve`;
Et par extension, voici le calcul global par élève :
--
-- Structure de la vue `total_heures_absence`
--

CREATE VIEW `total_heures_absence` AS 
select  `idEleve` AS `idEleve`,
	   sum(8 -((`presence_mat_t1` * 2) +(`presence_mat_t2` * 2) + (`presence_amidi_t1` * 2) + (`presence_amidi_t2` * 2))) AS `nbre_heures_absence` 
from `assiduite` group by  `idEleve`;

-- --------------------------------------------------------

--
-- Structure de la vue `total_heures_presence`
--

CREATE VIEW `total_heures_presence` AS 
select `idEleve` AS `idEleve`,
	   sum((`presence_mat_t1` * 2) +(`presence_mat_t2` * 2) + (`presence_amidi_t1` * 2) + (`presence_amidi_t2` * 2)) AS `nbre_heures_presence` 
from `assiduite` group by `idEleve`;
Voici un essai qui intégre le calcul du total d'heures d'absence par élève et l'affiche sur le formulaire qu'on a développé. Ce programme exige que les vues (requêtes) de calcul soit créée sur MySQL en tant que vues.
<?php 
// init
$date = isset($_GET['date']) && !empty($_GET['date'])? $_GET['date'] : null;
$idClasse = isset($_GET['idClasse']) && !empty($_GET['idClasse'])? $_GET['idClasse'] : null;
//
$nomProf_mat_t1 = isset($_GET['nomProf_mat_t1']) ? $_GET['nomProf_mat_t1'] : null;
$nomProf_mat_t2 = isset($_GET['nomProf_mat_t2']) ? $_GET['nomProf_mat_t2'] : null;
$nomProf_amidi_t1 = isset($_GET['nomProf_amidi_t1']) ? $_GET['nomProf_amidi_t1'] : null;
$nomProf_amidi_t2 = isset($_GET['nomProf_amidi_t2']) ? $_GET['nomProf_amidi_t2'] : null;
		//
$nomMatiere_mat_t1 = isset($_GET['nomMatiere_mat_t1']) ? $_GET['nomMatiere_mat_t1'] : null;
$nomMatiere_mat_t2 = isset($_GET['nomMatiere_mat_t2']) ? $_GET['nomMatiere_mat_t2'] : null;
$nomMatiere_amidi_t1 = isset($_GET['nomMatiere_amidi_t1']) ? $_GET['nomMatiere_amidi_t1'] : null;
$nomMatiere_amidi_t2 = isset($_GET['nomMatiere_amidi_t2']) ? $_GET['nomMatiere_amidi_t2'] : null;

// variable pour savoir s'il faut créer une nouvelle absence ou modifier une existante
$mode_ajout = isset($_GET['mode_ajout']) && !empty($_GET['mode_ajout'])? $_GET['mode_ajout'] : null;

// connction à la base de données
mysql_select_db("bd_eleves", @mysql_connect("localhost","root","")) or die(mysql_error());

// enregistrer la saisie du formulaire
if (isset($_GET['action']) && $_GET['action']=='Enregistrer')
{
	//
	$message = "";
	if (empty($date)) $message .= "<p>La date est obligatoire !</p>";
	if (empty($idClasse)) $message .= "<p>La classe est obligatoire !</p>";
	if (empty($nomMatiere_mat_t1) || empty($nomMatiere_mat_t2)
	||empty($nomMatiere_amidi_t1) || empty($nomMatiere_amidi_t2)) $message .= "<p>La matière est obligatoire !</p>"; 
	if (empty($nomProf_mat_t1) || empty($nomProf_mat_t2)
	||empty($nomProf_amidi_t1) || empty($nomProf_amidi_t2)) $message .= "<p>Le/la prof est obligatoire !</p>";
	//
	if (empty($message))
	{
		$listeAbsences = isset($_GET['absences'])?$_GET['absences']:array();
		//echo "<pre>"; print_r($listeAbsences); echo "</pre>";
		$sql = "SELECT * FROM eleve WHERE idClasse = '".$idClasse."';";
		$result = mysql_query($sql) or die(mysql_error());
		while($result && $row=mysql_fetch_array($result))
		{
			$idEleve = $row['idEleve'];	$nomEleve = $row['nom'];
			$presence_mat_t1 = isset($listeAbsences["$idEleve"]['mat_t1'])?0:1;
			$presence_mat_t2 = isset($listeAbsences["$idEleve"]['mat_t2'])?0:1;
			$presence_amidi_t1 = isset($listeAbsences["$idEleve"]['amidi_t1'])?0:1;
			$presence_amidi_t2 = isset($listeAbsences["$idEleve"]['amidi_t2'])?0:1;
			//
			// Nouvel enregistrement ou Mise à jour
			if ($mode_ajout==true){
			$sql="INSERT INTO assiduite SET date='".$date."', idEleve='".$idEleve."', 
									presence_mat_t1='".$presence_mat_t1."',
									presence_mat_t2='".$presence_mat_t2."',
									presence_amidi_t1='".$presence_amidi_t1."',
									presence_amidi_t2='".$presence_amidi_t2."',
									
									nomProf_mat_t1 = '".$nomProf_mat_t1."',
									nomProf_mat_t2 = '".$nomProf_mat_t2."',
									nomProf_amidi_t1 = '".$nomProf_amidi_t1."',
									nomProf_amidi_t2 = '".$nomProf_amidi_t2."',

									nomMatiere_mat_t1 = '".$nomMatiere_mat_t1."',
									nomMatiere_mat_t2 = '".$nomMatiere_mat_t2."',
									nomMatiere_amidi_t1 = '".$nomMatiere_amidi_t1."',
									nomMatiere_amidi_t2 = '".$nomMatiere_amidi_t2."';";				
			} else {
				$sql="UPDATE assiduite SET 	
									presence_mat_t1='".$presence_mat_t1."',
									presence_mat_t2='".$presence_mat_t2."',
									presence_amidi_t1='".$presence_amidi_t1."',
									presence_amidi_t2='".$presence_amidi_t2."',
									
									nomProf_mat_t1 = '".$nomProf_mat_t1."',
									nomProf_mat_t2 = '".$nomProf_mat_t2."',
									nomProf_amidi_t1 = '".$nomProf_amidi_t1."',
									nomProf_amidi_t2 = '".$nomProf_amidi_t2."',

									nomMatiere_mat_t1 = '".$nomMatiere_mat_t1."',
									nomMatiere_mat_t2 = '".$nomMatiere_mat_t2."',
									nomMatiere_amidi_t1 = '".$nomMatiere_amidi_t1."',
									nomMatiere_amidi_t2 = '".$nomMatiere_amidi_t2."'
									
						WHERE date='".$date."' AND idEleve='".$idEleve."';";			
			}
			//
			//echo $sql;
			if (!@mysql_query($sql)) $message .= "<li>".$nomEleve." => Erreur : ".mysql_error()."</li>";
		}
		if (empty($message)) $message = "Enregistrement effectué avec succès"; 
		else $message = "<p>Les Erreurs suivantes sont rencontrées :</ul>" . $message . "</ul></p>";
	}
}

// crée la liste des classes
$listeClasses = "";
$sql = "SELECT DISTINCT idClasse FROM eleve ORDER BY idClasse;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['idClasse']==$idClasse? " selected " : "";
	$listeClasses .= "<option value=\"".$row['idClasse']."\" ".$selected." >".$row['idClasse']."</option>";
}

// crée la liste des élèves de la classe sélectionnée
$listeAssiduiteEleves = "";
if (isset($idClasse) && isset($date))
{
	// on fait une jointure externe à gauche du côté de la table client vers la table assiduité
	// pour afficher tous les élèves de la classe même si les données de présence sont NULL (cas nouvelle saisie)
	$sql = "SELECT a.*, total_ha.*, e.*
	FROM eleve e LEFT OUTER JOIN assiduite a ON e.idEleve=a.idEleve AND a.date=date('".$date."')
	LEFT OUTER JOIN total_heures_absence total_ha ON e.idEleve=total_ha.idEleve
	WHERE e.idClasse = '".$idClasse."'
	ORDER BY e.nom, e.prenom";
	//echo $sql;
	$result = mysql_query($sql) or die(mysql_error());
	while($result && $row=mysql_fetch_array($result))
	{		
		// si les données d'assiduité sont NULL (surtout la date) alors il s'agit d'une nouvelle feuille de présence
		// sinon affiche l'absence sous 4 tranches horaires : 2 le matin(mat_t1 et mat_t2) et 2 l'après-midi(amidi_t1 et amidi_t2)
		if (is_null($row["date"])) $mode_ajout = true; else $mode_ajout = false;
		// stat du total des nbre_heures_absence 
		$nbre_heures_absence = $row['nbre_heures_absence'];
		//
		$nomProf_mat_t1 = $row['nomProf_mat_t1'];
		$nomProf_mat_t2 = $row['nomProf_mat_t2'];
		$nomProf_amidi_t1 = $row['nomProf_amidi_t1'];
		$nomProf_amidi_t2 = $row['nomProf_amidi_t2'];
		//
		$nomMatiere_mat_t1 = $row['nomMatiere_mat_t1'];
		$nomMatiere_mat_t2 = $row['nomMatiere_mat_t2'];
		$nomMatiere_amidi_t1 = $row['nomMatiere_amidi_t1'];
		$nomMatiere_amidi_t2 = $row['nomMatiere_amidi_t2'];
		//
		$mat_t1_checked = $row['presence_mat_t1']!=1 && !is_null($row['presence_mat_t1']) ? " checked " : "";
		$mat_t2_checked = $row['presence_mat_t2']!=1 && !is_null($row['presence_mat_t2']) ? " checked " : "";
		$amidi_t1_checked = $row['presence_amidi_t1']!=1 && !is_null($row['presence_amidi_t1']) ? " checked " : "";
		$amidi_t2_checked = $row['presence_amidi_t2']!=1 && !is_null($row['presence_amidi_t2']) ? " checked " : "";
		//
		$listeAssiduiteEleves .= "<tr><td>".$row['nom']." ".$row['prenom']."</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][mat_t1]\" ".$mat_t1_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][mat_t2]\" ".$mat_t2_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][amidi_t1]\" ".$amidi_t1_checked." /> Absent(e)</td>
		<td><input type=\"checkbox\" name=\"absences[".$row['idEleve']."][amidi_t2]\" ".$amidi_t2_checked." /> Absent(e)</td>
		<td>" . $nbre_heures_absence . "</td></tr>";
	}
}
// crée les listes des matières
$listeMatieres_mat_t1 = "";
$listeMatieres_mat_t2 = "";
$listeMatieres_amidi_t1 = "";
$listeMatieres_amidi_t2 = "";
$sql = "SELECT * FROM matiere ORDER BY nom;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['nom']==$nomMatiere_mat_t1? " selected " : "";
	$listeMatieres_mat_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";	
	//
	$selected = $row['nom']==$nomMatiere_mat_t2? " selected " : "";
	$listeMatieres_mat_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomMatiere_amidi_t1? " selected " : "";
	$listeMatieres_amidi_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomMatiere_amidi_t2? " selected " : "";
	$listeMatieres_amidi_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
}

// crée les listes des profs
$listeProfs_mat_t1 = "";
$listeProfs_mat_t2 = "";
$listeProfs_amidi_t1 = "";
$listeProfs_amidi_t2 = "";
$sql = "SELECT * FROM prof ORDER BY nom;";
$result = mysql_query($sql) or die(mysql_error());
while($result && $row=mysql_fetch_array($result))
{
	$selected = $row['nom']==$nomProf_mat_t1? " selected " : "";
	$listeProfs_mat_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";	
	//
	$selected = $row['nom']==$nomProf_mat_t2? " selected " : "";
	$listeProfs_mat_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomProf_amidi_t1? " selected " : "";
	$listeProfs_amidi_t1 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
 	//
	$selected = $row['nom']==$nomProf_amidi_t2? " selected " : "";
	$listeProfs_amidi_t2 .= "<option value=\"".$row['nom']."\" ".$selected." >".$row['nom']."</option>";
}


// fin de connexion
mysql_close();

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Gestion d'assiduité des élèves</title>
<link rel="stylesheet" type="text/css" href="calendrier.css">
<script type="text/javascript" src="calendrier.js"></script>
</head>
<body>
<h1>Gestion d'assiduité des élèves</h1>

<form name="form1" action="" method="get">
<table>
<tr>
<th>Classe :</th><td><select name="idClasse" onchange="form1.submit();" value="<?php echo $idClasse; ?>" >
<option value="" ></option>
<?php echo $listeClasses; ?>
</select></td>

<th>Date : </th><td><input type="text" id="dateLib" name="date" value="<?php echo $date; ?>" style="width:180px"
        onfocus="visuCal(this,{'format' : '%a-%m-%j'})" onblur="masqueCal(this);"  />
		<input type="submit" name="action" value="Valider la date" />
		</td>
</tr>
</table>
<hr />
<?php if ($mode_ajout==true) { ?>
<h2>Nouvelle Feuille de présence du <?php echo date("d-m-Y",strtotime($date)); ?></h2>
<p>Veuillez cocher une case pour désigner une absence.<br />
Pour ajouter cette feuille dans la base de données, appuyer sur le bouton Enregistrer</p>
<?php } else { ?> 
<h2>Feuille de présence existante du <?php echo date("d-m-Y",strtotime($date)); ?></h2>
<p>Veuillez cocher une case pour désigner une absence.<br />
Vous pouvez modifie cette feuille puis appuyer sur le bouton Enregistrer pour mettre à jour la base de données.</p>
<?php } ?> 
<table border="1">
<tr><th>Nom - Prenom</th><th>8h00 - 10h00</th><th>10h00 - 12h00</th><th>13h30 - 15h30</th><th>15h30 - 17h30</th><th>Total heures d'absences</th></tr>
<?php echo $listeAssiduiteEleves; ?>
<tr>
<th>Prof : </th>
<td><select name="nomProf_mat_t1" value="<?php echo $nomProf_mat_t1; ?>" >
<option value="" ></option>
<?php echo $listeProfs_mat_t1; ?>
</select></td>
<td><select name="nomProf_mat_t2" value="<?php echo $nomProf_mat_t2; ?>" >
<option value="" ></option>
<?php echo $listeProfs_mat_t2; ?>
</select></td>
<td><select name="nomProf_amidi_t1" value="<?php echo $nomProf_amidi_t1; ?>" >
<option value="" ></option>
<?php echo $listeProfs_amidi_t1; ?>
</select></td>
<td><select name="nomProf_amidi_t2" value="<?php echo $nomProf_amidi_t2; ?>" >
<option value="" ></option>
<?php echo $listeProfs_amidi_t2; ?>
</select></td>
</tr>
<tr>
<th>Matière : </th>
<td><select name="nomMatiere_mat_t1" value="<?php echo $nomMatiere_mat_t1; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_mat_t1; ?>
</select></td>
<td><select name="nomMatiere_mat_t2" value="<?php echo $nomMatiere_mat_t2; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_mat_t2; ?>
</select></td>
<td><select name="nomMatiere_amidi_t1" value="<?php echo $nomMatiere_amidi_t1; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_amidi_t1; ?>
</select></td>
<td><select name="nomMatiere_amidi_t2" value="<?php echo $nomMatiere_amidi_t2; ?>" >
<option value="" ></option>
<?php echo $listeMatieres_amidi_t2; ?>
</select></td>
</tr>
</table>

<input type="hidden" name="mode_ajout" value="<?php echo $mode_ajout; ?>" />
<input type="submit" name="action" value="Enregistrer" />
</form>
<div id="message"><?php echo isset($message)?$message:''; ?></div>
</body>
</html>
Pour rappel voici la dernière mise à jour de la base de données:
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Ven 22 Avril 2011 à 10:15
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.4

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `bd_eleves`
--

-- --------------------------------------------------------

--
-- Structure de la table `assiduite`
--

CREATE TABLE IF NOT EXISTS `assiduite` (
  `date` date NOT NULL,
  `idEleve` int(11) NOT NULL,
  `presence_mat_t1` int(11) NOT NULL DEFAULT '1',
  `presence_mat_t2` int(11) NOT NULL DEFAULT '1',
  `presence_amidi_t1` int(1) NOT NULL DEFAULT '1',
  `presence_amidi_t2` int(11) NOT NULL DEFAULT '1',
  `nomProf_mat_t1` varchar(50) NOT NULL,
  `nomProf_mat_t2` varchar(50) NOT NULL,
  `nomProf_amidi_t1` varchar(50) NOT NULL,
  `nomProf_amidi_t2` varchar(50) NOT NULL,
  `nomMatiere_mat_t1` varchar(50) NOT NULL,
  `nomMatiere_mat_t2` varchar(50) NOT NULL,
  `nomMatiere_amidi_t1` varchar(50) NOT NULL,
  `nomMatiere_amidi_t2` varchar(50) NOT NULL,
  UNIQUE KEY `idAssiduite` (`date`,`idEleve`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `assiduite`
--

INSERT INTO `assiduite` (`date`, `idEleve`, `presence_mat_t1`, `presence_mat_t2`, `presence_amidi_t1`, `presence_amidi_t2`, `nomProf_mat_t1`, `nomProf_mat_t2`, `nomProf_amidi_t1`, `nomProf_amidi_t2`, `nomMatiere_mat_t1`, `nomMatiere_mat_t2`, `nomMatiere_amidi_t1`, `nomMatiere_amidi_t2`) VALUES
('2011-04-18', 1, 1, 1, 1, 1, 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Anglais', 'Anglais', 'Anglais', 'Anglais'),
('2011-04-18', 2, 1, 1, 1, 1, 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Anglais', 'Anglais', 'Anglais', 'Anglais'),
('2011-04-18', 3, 0, 0, 0, 0, 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Mme. La Prof', 'Anglais', 'Anglais', 'Anglais', 'Anglais'),
('2011-04-18', 4, 1, 1, 0, 1, 'Mr. Le Prof', 'Mr. Le Prof', 'Mme. La Prof', 'Mme. La Prof', 'Programmation', 'Programmation', 'Anglais', 'Anglais'),
('2011-04-18', 5, 1, 1, 0, 1, 'Mr. Le Prof', 'Mr. Le Prof', 'Mme. La Prof', 'Mme. La Prof', 'Programmation', 'Programmation', 'Anglais', 'Anglais'),
('2011-04-20', 1, 1, 1, 1, 1, 'Mr. Le Prof', 'Mr. Le Prof', 'Mme. La Prof', 'Mme. La Prof', 'Programmation', 'Programmation', 'Anglais', 'Anglais'),
('2011-04-20', 2, 1, 1, 1, 1, 'Mr. Le Prof', 'Mr. Le Prof', 'Mme. La Prof', 'Mme. La Prof', 'Programmation', 'Programmation', 'Anglais', 'Anglais'),
('2011-04-20', 3, 0, 0, 0, 0, 'Mr. Le Prof', 'Mr. Le Prof', 'Mme. La Prof', 'Mme. La Prof', 'Programmation', 'Programmation', 'Anglais', 'Anglais');

-- --------------------------------------------------------

--
-- Structure de la table `eleve`
--

CREATE TABLE IF NOT EXISTS `eleve` (
  `idEleve` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(20) NOT NULL,
  `prenom` varchar(20) NOT NULL,
  `idClasse` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`idEleve`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Contenu de la table `eleve`
--

INSERT INTO `eleve` (`idEleve`, `nom`, `prenom`, `idClasse`) VALUES
(1, 'LABELLE', 'Aline', 'BTS-INF-A1'),
(2, 'BONHOMME', 'Olivier', 'BTS-INF-A1'),
(3, 'JAMAISLA', 'Stéphane', 'BTS-INF-A1'),
(4, 'RENAULT', 'Pascal', 'BTS-INF-A2'),
(5, 'DAHOU', 'Géraldine', 'BTS-INF-A2');

-- --------------------------------------------------------

--
-- Structure de la table `matiere`
--

CREATE TABLE IF NOT EXISTS `matiere` (
  `nom` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `matiere`
--

INSERT INTO `matiere` (`nom`) VALUES
('Programmation'),
('Anglais');

-- --------------------------------------------------------

--
-- Doublure de structure pour la vue `nbre_heures_absence`
--
CREATE TABLE IF NOT EXISTS `nbre_heures_absence` (
`date` date
,`idEleve` int(11)
,`nbre_heures_absence` decimal(37,0)
);
-- --------------------------------------------------------

--
-- Doublure de structure pour la vue `nbre_heures_presence`
--
CREATE TABLE IF NOT EXISTS `nbre_heures_presence` (
`date` date
,`idEleve` int(11)
,`nbre_heures_presence` decimal(36,0)
);
-- --------------------------------------------------------

--
-- Structure de la table `prof`
--

CREATE TABLE IF NOT EXISTS `prof` (
  `nom` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `prof`
--

INSERT INTO `prof` (`nom`) VALUES
('Mr. Le Prof'),
('Mme. La Prof');

-- --------------------------------------------------------

--
-- Doublure de structure pour la vue `total_heures_absence`
--
CREATE TABLE IF NOT EXISTS `total_heures_absence` (
`idEleve` int(11)
,`nbre_heures_absence` decimal(37,0)
);
-- --------------------------------------------------------

--
-- Doublure de structure pour la vue `total_heures_presence`
--
CREATE TABLE IF NOT EXISTS `total_heures_presence` (
`idEleve` int(11)
,`nbre_heures_presence` decimal(36,0)
);
-- --------------------------------------------------------

--
-- Structure de la vue `nbre_heures_absence`
--
DROP TABLE IF EXISTS `nbre_heures_absence`;

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `nbre_heures_absence` AS select `assiduite`.`date` AS `date`,`assiduite`.`idEleve` AS `idEleve`,sum((8 - ((((`assiduite`.`presence_mat_t1` * 2) + (`assiduite`.`presence_mat_t2` * 2)) + (`assiduite`.`presence_amidi_t1` * 2)) + (`assiduite`.`presence_amidi_t2` * 2)))) AS `nbre_heures_absence` from `assiduite` group by `assiduite`.`date`,`assiduite`.`idEleve`;

-- --------------------------------------------------------

--
-- Structure de la vue `nbre_heures_presence`
--
DROP TABLE IF EXISTS `nbre_heures_presence`;

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `nbre_heures_presence` AS select `assiduite`.`date` AS `date`,`assiduite`.`idEleve` AS `idEleve`,sum(((((`assiduite`.`presence_mat_t1` * 2) + (`assiduite`.`presence_mat_t2` * 2)) + (`assiduite`.`presence_amidi_t1` * 2)) + (`assiduite`.`presence_amidi_t2` * 2))) AS `nbre_heures_presence` from `assiduite` group by `assiduite`.`date`,`assiduite`.`idEleve`;

-- --------------------------------------------------------

--
-- Structure de la vue `total_heures_absence`
--
DROP TABLE IF EXISTS `total_heures_absence`;

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `total_heures_absence` AS select `assiduite`.`idEleve` AS `idEleve`,sum((8 - ((((`assiduite`.`presence_mat_t1` * 2) + (`assiduite`.`presence_mat_t2` * 2)) + (`assiduite`.`presence_amidi_t1` * 2)) + (`assiduite`.`presence_amidi_t2` * 2)))) AS `nbre_heures_absence` from `assiduite` group by `assiduite`.`idEleve`;

-- --------------------------------------------------------

--
-- Structure de la vue `total_heures_presence`
--
DROP TABLE IF EXISTS `total_heures_presence`;

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `total_heures_presence` AS select `assiduite`.`idEleve` AS `idEleve`,sum(((((`assiduite`.`presence_mat_t1` * 2) + (`assiduite`.`presence_mat_t2` * 2)) + (`assiduite`.`presence_amidi_t1` * 2)) + (`assiduite`.`presence_amidi_t2` * 2))) AS `nbre_heures_presence` from `assiduite` group by `assiduite`.`idEleve`;
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

26 avr. 2011, 09:46

Bonjour,
Merci!!Pourquoi supprime tu les tables "total " etc après les avoir créées? et à quoi serve ces algorithmes?
De plus les deux dernière commandes :
DROP TABLE IF EXISTS `total_heures_absence`;

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `total_heures_absence` AS SELECT `assiduite`.`idEleve` AS `idEleve`,sum((8 - ((((`assiduite`.`presence_mat_t1` * 2) + (`assiduite`.`presence_mat_t2` * 2)) + (`assiduite`.`presence_amidi_t1` * 2)) + (`assiduite`.`presence_amidi_t2` * 2)))) AS `nbre_heures_absence` FROM `assiduite` GROUP BY `assiduite`.`idEleve`;

-- --------------------------------------------------------

--
-- Structure de la vue `total_heures_presence`
--
DROP TABLE IF EXISTS `total_heures_presence`;

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `total_heures_presence` AS SELECT `assiduite`.`idEleve` AS `idEleve`,sum(((((`assiduite`.`presence_mat_t1` * 2) + (`assiduite`.`presence_mat_t2` * 2)) + (`assiduite`.`presence_amidi_t1` * 2)) + (`assiduite`.`presence_amidi_t2` * 2))) AS `nbre_heures_presence` FROM `assiduite` GROUP BY `assiduite`.`idEleve`;
et maintenant que j'ai les commandes pour les nombres d'heure il me reste plus qu'à mettre un bouton qui exécute la commande ??
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Eléphant du PHP | 150 Messages

26 avr. 2011, 10:04

je crois que tu avais raison il y a des problème de redondance quand on recherche la liste des élèves, il y a t'il un moyen de le contourner ?car j'aimerais pouvoir afficher la liste des élèves dans un menu déroulant et après pouvoir choisir le nombre d'heures d'absences ou présences pour un jour au choix ou au total !
Merci d'avance.
Tu veux mourir? OK!! Mais pas dans ma voiture, alors attache ta ceinture !! :pouce:
Tony :boire9:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 avr. 2011, 14:00

Pour la liste des élèves c'est pas un problème, tu peux alimenter ta liste par la requête de sélection sur la table 'eleve' :
$sql = "SELECT * FROM eleve";
Et pour les vues de calcul tu peux aussi faire une requête de sélection dessus car une VUE est considérée comme une table, voici comment sélectionner les absences par jour par élève donné :
$sql = "SELECT * FROM `nbre_heures_absence` WHERE date = '" . $date . "'  AND idEleve = '". $idEleve. "' ";
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène