EXAMEN PROGRAMMATION WEB                                                                        26 mai 2012

Problème 1
Lire attentivement le script suivant et répondre aux questions correspondantes :

// Script1.php
<?php
session_start ();
if ( ! isset($_SESSION['x1'])) {
      $_SESSION['x1']= 0; echo "msg1" ; }

function Fonction1($p) {
        $fd= fopen("Sortie.txt", "w");
        if ($fd) { fputs($fd,$p); fclose($fd); echo "msg2"; }
        else echo "msg3";
}
if (isset($_GET['var'])) {
        $v = $_GET ['var'];
        if ($v <= 0) die("msg4 ") ;
        if ($_SESSION['x1'] < $v) {
                 Echo "msg5";
                 $_SESSION['x1']=$v;
                 Fonction1($v); } }
echo "msg6";
?>
<form method="get" action="script1.php" >
       <input type="Text" name="var">
       <input type="Submit" value="Valider">
</form>

1. Donner les messages appropriés à associer aux chaines msg1, msg2, msg3, msg4, msg5, msg6. (3 points) (Solution)
2. Script1 s’exécute-t-il récursivement ? Si oui, expliquer pourquoi et montrer la condition d’arrêt. (1 point) (Solution)
3. Si dans le navigateur, l’utilisateur saisit consécutivement les valeurs suivantes : 10, 9, 11, 13, -8, 14, quelle sera la valeur finale de la variable session x1 et quel sera le contenu du fichier Sortie.txt ? (1 point) (Solution)
4. En déduire le rôle de script1. (1 point) (Solution)
5. Modifier la fonction Fonction1 pour enregistrer (avec des sauts de lignes) toutes les valeurs reçues en paramètre dans le fichier Sortie.txt . (2 points) (Solution)
6. Modifier le code du script pour arrêter son exécution sans condition d’arrêt. (2 points) (Solution)

Problème 2

On vous demande de réaliser un site Web dynamique remplissant les fonctionnalités suivantes :

- Enregistrement des clients et des factures
- Consultation et mise à jour de l’état de facturation d’un client

Une base de données appropriée appelée BDD est déjà créée avec MySQL et contient, entre autres, les tables
suivantes :

- la table Client contenant les informations sur les clients Client (codecli entier(5), nom Texte(30), adresse Texte(50))
- la table Facture contenant les factures associées aux clients Facture (numfact entier(4), datefact Date(10),codecli entier(5), montant Décimal(8,2), versé Décimal (8,2) )

1. Donnez les scripts suivants :

a- Ajout d’un nouveau client. On supposera que les informations à enregistrer se trouvent dans des variables Session de mêmes noms que les champs. (1.5 point) (Solution)
b- Ajout d’une nouvelle facture. On supposera que les informations à enregistrer sont lues à partir du tableau de la méthode GET de mêmes noms que les champs. (1.5 point) (Solution)
c- Afficher la liste des noms des clients ayant au moins une facture dont le montant versé de la facture est strictement inférieur au montant de celle-ci. (2 points) (Solution)

2. On vous demande de transférer la liste des clients dont l’adresse == "ALGER" et ayant au moins une facture impayée (versé == 0) vers une table existante de type ACCESS nommée AClient et accessible via la source de données"SourceA". La structure de cette table est donnée comme suit :
                   AClient (numcli entier(5), adr_cli Texte(60), nom_cli Texte(50))

a- Donner le script correspondant. (3 points) (Solution)
b- Modifier ce script pour obtenir une table AClient triée par nom_cli. (1 point) (Solution)

3. On vous demande de faire le même travail de la question 2 mais vers une table existante de type dBase ayant le même nom (AClient) et la même structure accessible via la source de données "SourceD". Donner les modifications à apporter dans le script de la question précédente. (1 point) (Solution)


Solution

Problème 1
1. msg1= "Variable session x1 non définie et initialisée à 0" ;
msg2= "Enregistrement dans le fichier Sortie.txt effectué avec succès" ;
msg3= "Erreur ! Impossible d’enregistrer dans le fichier Sortie.txt" ;
msg4= "Fin d’exécution du script" ;
msg5= "$v est le nouveau nombre positif maximum" ;
msg6= "Formulaire de saisie. Tapez un nombre nul ou négatif pour arrêter l’exécution" ;

2. Oui, Script1 s’exécute récursivement car le formulaire du script envoie les données à lui-même (action="script1.php"). La condition d’arrêt est assurée dans la ligne : if ($v <= 0) die("msg4 ") ;
3. La valeur finale de la variable session x1 est : 13 (14 ne sera pas prise en considération). Le contenu du fichier Sortie.txt : une seule ligne contenant la valeur 13.
4. Le script cherche le maximum dans une suite de valeurs positives saisies et l’enregistre dans le fichier texte Sortie.txt.
5. function Fonction1($p) {
        $old= readfile("Sortie.txt").$p."<br>";
        $fd= fopen("Sortie.txt", "w");
        if ($fd) { fputs($fd, $old); fclose($fd); echo "msg2"; }
        else echo "msg3"; }
6. Remplacer le code après la ligne : echo "msg6"; ?> par celui-ci :
<script language="javascript">
function arret() { document.write("Fin d’exécution. Au revoir") ; }
</script>
<form method="get" action="script1.php" >
<input type="Text" name="var">
<input type="Submit" value="Valider">
<input type="button" value="Arrêter" onclick="arret()">
</form>


Problème 2
1.
a- <?php
$con=mysql_connect("localhost","root","") or die ("Connexion au serveur impossible");
$bdd=mysql_select_db("BDD",$con) or die ("Impossible d'accéder à la base de données.");
$sql="insert into `client` values (' ".$_SESSION['codecli']." ', ' ".$_ SESSION ['nom']." ', ' ".$_ SESSION ['adresse']." ')";
$res= mysql_query($sql, $con) or die("Erreur dans l’exécution de la requête");
mysql_close($con);
echo "Client ajouté avec succès ";
?>

b- <?php
$con=mysql_connect("localhost","root","") or die ("Connexion au serveur impossible");
$bdd=mysql_select_db("BDD",$con) or die ("Impossible d'accéder à la base de données.");
$sql="insert into `facture` values (' ".$_GET['numfact']." ', ' ".$_ GET ['datefact']." ', ' ".$_ GET ['codecli']." ', ' ".$_ GET ['montant']. " ', ' ".$_ GET ['versé']." ')";
$res=mysql_query($sql, $con) or die("Erreur dans l’exécution de la requête");
mysql_close($con);
echo "Facture ajoutée avec succès";
?>

c- <?php
$con=mysql_connect("localhost","root","") or die ("Connexion au serveur impossible");
$bdd=mysql_select_db("BDD",$con) or die ("Impossible d'accéder à la base de données.");
$sql="select `nom` from `client`,`facture` where `client`.`codecli`=`facture`.`codecli` and `versé` < `montant` " ;
$res=mysql_query($sql, $con) or die("Erreur dans l’exécution de la requête");
while ( $lig=mysql_fetch_array($res) ) echo $lig['nom']."<br>";
mysql_close($con);
?>

2.
a- <?php
$con1=mysql_connect("localhost","root","") or die ("Connexion au serveur MySQL impossible");
$bdd=mysql_select_db("BDD",$con1) or die ("Impossible d'accéder à la base de données MySQL.");
$con2=odbc_connect("SourceA","","") or die ("Connexion à la source de données SourceA impossible");
$sql1="select `client`.`codecli`,`nom` ,`adresse` from `client`,`facture`
where `client`.`codecli`=`facture`.`codecli` and `adresse`=’ALGER’ and `versé`= ‘0’ " ;
$res1=mysql_query($sql1, $con1) or die("Erreur dans l’exécution de la requête MySQL");
while ( $lig=mysql_fetch_array($res1) ) {
       $cc= $lig['codecli']; $a= $lig['adresse']; $n= $lig['nom'];
       $Sql2=" insert into `aclient` values ('$cc', '$a', '$n')";
       $res2= odbc_do($con2,$sql2) ;
       if ( ! res2) echo "Erreur dans la requête ODBC" ; }
mysql_close($con1);
odbc_close($con2);
?>

b- On modifie uniquement la requête sql1 comme suit :
$sql1="select `client`.`codecli`,`nom` ,`adresse` from `client`,`facture`
where `client`.`codecli`=`facture`.`codecli` and `adresse`=’ALGER’ and `versé`= ‘0’ order by `nom` " ;

3. On modifie uniquement la ligne de connexion ODBC comme suit :
$con2=odbc_connect("SourceD","","") or die ("Connexion à la source de données SourceD impossible");