Interrogation écrite (11/05/2013) :

Soit un classeur de type Excel (version 12.0) contenant les 2 feuilles (tables) suivantes:
- Table Etudiant : Feuil1 (mat Numérique, nom Texte, section Numérique)
- Table Notes: Feuil2 (codem Numérique, note Decimal , mat Numérique)
Ce classeur est accessible via la source ODBC nommée scol.

1. Donner le script pour :
- Créer la table Moyenne avec MySQL qui contiendra la moyenne de chaque étudiant;
- Calculer les moyennes des étudiants à partir du classeur excel en enregistrant les résultats dans la table Moyenne;
- Afficher ces moyennes par ordre décroissant.

Solution :

<?php
$s = mysql_connect ( "localhost","root","" ) or die ( mysql_error() );

mysql_query("drop database `bdd`",$s);
$r = "create database `bdd`" ;
mysql_query ( $r , $s ) or die ( "erreur mysql" ) ;

mysql_select_db ("bdd" , $s ) or die ( "erreur bdd" );

mysql_query("drop table `moyenne`",$s);
$r="create table `moyenne` ( `mat` int ( 3 ) , `nom` varchar ( 30 ) , `moy` decimal (5,2) )" ;
mysql_query ( $r , $s ) or die ( "erreur table".mysql_error() ) ;

$c = odbc_connect ( "scol" ,"" ,"" ) or die ( "erreur de source de donné" );

$req="select `Feuil1$`.`mat`, `Feuil1$`.`nom`, avg(`note`) as `moyc`
from `Feuil1$`,`Feuil2$`
where `Feuil1$`.`mat` = `Feuil2$`.`mat`
group by `Feuil1$`.`mat`,`Feuil1$`.`nom`
order by avg(`note`) desc ";
$R = odbc_do ( $c , $req ) or die ( "erreur select" );

while (odbc_fetch_row($R)) {
     $m=odbc_result ( $R, "moyc");
     $n=odbc_result ( $R, "mat");
     $p=odbc_result ( $R,"nom");
     echo "$n $m $p <br>";

     $req= "insert into `moyenne` ( `mat` , `nom` , `moy` ) values ('$n','$p','$m')";
     mysql_query ( $req ) or die ( "erreur insert" );
}
mysql_close($s);
odbc_close($c);
echo "Fin des traitements ";
?>

2. Nous voulons améliorer le calcul de la moyenne en ajoutant dans le classeur excel le coefficient de chaque module pour le calcul de la moyenne :
- Table Etudiant : Feuil1 (mat Numérique, nom Texte, section Numérique)
- Table Notes: Feuil2 (codem Numérique, coef Numérique, note Decimal , matri Numérique)
Re-donner le script ci-dessus en n'affichant que les étudiants ayant une moyenne supérieure ou égale à 10.

Solution :

<?php
$c=mysql_connect("localhost","root","") or die ("erreur connexion mysql");

mysql_query("drop database `scol`",$c);
mysql_query("create database `scol`",$c) or die ( mysql_error() );

mysql_select_db("scol",$c)or die(mysql_error());

mysql_query("drop table `moyenne`",$c);
mysql_query("create table `moyenne`(`mat` int(4),`nom`char(30),`moy` decimal(5,2))", $c)
or die(mysql_error());

$p=odbc_connect ( "scol","","" ) or die ("erreur connexion odbc");

$f="select `mat`,`nom`, sum(`note`*`coef`) / sum(`coef`) as `moy`
from `Feuil1$`,`Feuil2$`
where `mat`=`matri`
group by `mat` ,`nom`
having sum(`note`*`coef`)/sum(`coef`) > 10
order by sum ( `note`*`coef` ) / sum ( `coef` ) desc";
$res = odbc_do ( $p , $f ) or die ("erreur sql odbc");

while ( odbc_fetch_row ( $res ) ) {
    $m=odbc_result($res,'mat');
    $n=odbc_result($res,'nom');
    $y=odbc_result($res,'moy');
    echo "$m ,$n ,$y <br>";

    mysql_query( "insert into `moyenne` ( `mat` ,`nom`,`moy` ) values ('$m' ,'$n' ,'$y')", $c)
    or die ( mysql_error() );
}
odbc_close($p);
mysql_close($c);
echo "Fin des traitements ";
?>