Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. PHP et MySQL
  3. Corrigé 2
Extrait - PHP et MySQL Entraînez-vous à développer une application collaborative
Extraits du livre
PHP et MySQL Entraînez-vous à développer une application collaborative Revenir à la page d'achat du livre

Corrigé 2

Prérequis

1.

c.

C’est l’attribut action qui détermine l’URL vers laquelle le navigateur transmet les données. 

2.

d.

Dans un envoi selon la méthode POST, les données sont transmises dans le corps de la requête HTTP.

3.

b.

La variable $_POST contient les données transmises selon la méthode POST.

4.

b.

Les fonctions d’accès aux données intégrées à PHP comportent un suffixe qui rappelle le type de base de données. Dans notre cas, elles commencent par mysql_, c’est donc la réponse b qui est juste, les autres sont fausses.

5.

a.

Les appels de service web REST pour retourner des données sont généralement effectués avec le verbe GET.

6.

a. et b.

Un service web retourne généralement des données et non pas des instructions ni des présentations. Les bonnes réponses sont XML et JSON.

7.

c.

C’est bien l’utilitaire phpMyAdmin qui sert à créer des bases de données, à exécuter des requêtes et à administrer le serveur MySQL

Corrigé 2.1 Création de la base de données

 Il existe un raccourci depuis le menu WampServer pour lancer phpMyAdmin :  

images/C02TP01.png

 Depuis le navigateur, le login par défaut de MySQL est généralement root, sans mot de passe.

images/C02TP02.png

Naviguez dans le menu Comptes utilisateurs et suivez le lien Ajouter un compte utilisateur. Indiquez le login et choisissez un mot de passe assez robuste. L’interface propose d’en générer au besoin. Dans la rubrique Privilèges globaux, cochez la case Tout cocher. Terminez l’opération en cliquant sur le bouton Exécuter.

images/C02TP03.png

 L’onglet Bases de données présente un formulaire pour créer une nouvelle base. Indiquez le nom de la base et choisissez un classement (interclassement dans la terminologie MySQL) suffixé par ci, soit case insensitive.

images/C02TP04.png

 Après avoir sélectionné la base teamup, l’interface s’ouvre directement sur la création de table. Indiquez le nom de la table et le nombre de champs :

images/C02TP05.png

Depuis l’assistant, renseignez les attributs de chaque champ (nom, type, taille, index, accepte NULL). A_I signifie auto-increment ; autrement dit, la valeur de la colonne id_utilisateur est définie au moment de l’insertion de la ligne dans la table, elle est déterminée par MySQL et il n’est donc pas nécessaire d’indiquer la colonne dans...

Corrigé 2.2 Saisie d’un utilisateur avec un template HTML simple

 Il est utile de renseigner un en-tête sous forme de commentaire au début de chaque fichier :

<?php 
/* 
* userdao.php 
* @author BAGs 
* 2019 
*/ 
class UserDAO { 
 
} 
?> 

 Sous Linux, les majuscules et les minuscules sont différenciées pour les noms de fichiers. Attention donc à l’écriture, sous peine de message d’erreur à l’appel d’un fichier par require ou include.

<?php 
/* 
* userservice.php  
* @author BAG 
* 2019 
*/ 
 
class UserService { 
 
} 
?> 

 Les champs de cette classe doivent être déclarés publics.

<?php 
/* 
* userentity.php 
*/ 
 
class UserEntity { 
   public $id_utilisateur; 
   public $utilisateur_nom; 
   public $utilisateur_login; 
   public $utilisateur_pwd; 
   public $utilisateur_email; 
   public $utilisateur_creation; 
} 
?> 

 Le fichier est pour l’instant assez court :

<?php require_once 'config.php'; ?><?php require_once 
'../comfpl/main.php';?><html> 
<head> 
<title>Team up - Index</title> 
<?php require_once 'phpinclude/commonmeta.php';?> 
<?php require_once 'phpinclude/theme.php';?> 
<?php FPLGlobal::render_bundle_css()?>  
<?php FPLGlobal::render_bundle_script()?> 
</head> 
<body> 
   <?php require_once 'phpinclude/navbar.php';?> 
 
 
</body> 
</html> 

 La mise en page s’appuie sur les classes CSS de Boostrap, mais ce n’est aucunement...

Corrigé 2.3 Affichage d’un utilisateur avec template réactif (responsive)

 La fonction suit la logique de l’énoncé : connexion, requête, lecture des résultats. L’opérateur SQL like peut s’utiliser avec des caractères jokers % de part et d’autre de l’expression à rechercher.

public function getuserlist($filtrenom=null) { 
       $cx = mysqli_connect($this->db_connection["cx_server"], 
           $this->db_connection["cx_login"], 
           $this->db_connection["cx_pwd"], 
           $this->db_connection["cx_dbname"]); 
 
 
       // construit la requête 
       $query = "select * from utilisateur"; 
       if(isset($filtrenom) && $filtrenom!=null && $filtrenom!='') { 
           // supprime les signes dangereux 
           $like = str_replace(';','', $filtrenom); 
           $like = str_replace('\'','', $filtrenom); 
            
           $query.=" where utilisateur_nom like '%$like%'"; 
       } 
        
       // exécute la requête 
       $result = mysqli_query($cx, $query); 
        
       $list = array(); 
   ...

Corrigé 2.4 Gestion des équipes

 Dans le cas de la table equipe, la colonne id_equipe peut être auto_increment (A_I dans l’interface de gestion de la base de données).

images/C02TP13.png

En revanche, les colonnes de la table utilisateur_equipe ne sont ni l’une ni l’autre auto_increment.

 S’agissant d’une entité, ses champs sont déclarés publics :

/* 
* teamentity.php 
*/ 
 
class TeamEntity { 
   public $id_equipe; 
   public $equipe_nom; 
} 

 La classe TeamDAO suit le même principe que la classe UserDAO, avec une méthode de modification en plus. Nous profitons également du support d’Eclipse pour documenter le contenu de la classe à l’aide de la syntaxe /** */ de façon à ce qu’Eclipse affiche de l’aide contextualisée.

/* 
* teamdao.php 
*/ 
require_once 'config.php'; 
require_once 'models/teamentity.php'; 
 
class TeamDAO { 
   private $db_connection; 
    
   public function __construct() { 
       $this->db_connection = get_default_connection(); 
   } 
 
   /** 
    * Obtient la liste des équipes 
    * @return TeamEntity[] 
    */ 
   public function getteamlist(){ 
       $cx = mysqli_connect($this->db_connection["cx_server"], 
           $this->db_connection["cx_login"], 
           $this->db_connection["cx_pwd"], 
           $this->db_connection["cx_dbname"]); 
        
        
       // construit la requête 
       $query = "select * from equipe"; 
        
       // exécute la requête 
       $result = mysqli_query($cx, $query); 
        
 ...

Corrigé 2.5 Un service web pour lister les utilisateurs

 Voici le canevas de notre premier contrôleur :

/* 
* userController.php 
*/ 
 
namespace teamup\Controllers\users; 
use comfpl\controllers\BaseController; 
 
require_once 'models/userentity.php'; 
 
class userController extends BaseController { 
    
} 

 Il y a sans doute peu d’utilisateurs dans la table, le traitement de pagination réalisé en PHP n’est donc pas trop pénalisant.

/** 
* Obtient la liste paginée des utilisateurs 
* @param int $page 
* @param int $limit 
* @return array 
*/ 
function getusersdata($page=null,$limit=null){ 
   $userservice = new \UserService(); 
   $p = $userservice->getuserlist(); 
 
   $r=array(); 
   if($page!=null && $limit!=null) 
   { 
       $start = ($page - 1) * $limit; 
   } else { 
       $start = 0; 
       $limit = count($p); 
   } 
   for($i = $start; $i < $start + $limit && $i < count($p); $i++) 
       $r[] = $p[$i]; 
 
   return array("records" => $r, "total" => count($p)); 
}...

Corrigé 2.6 Une page HTML 5 pour afficher les utilisateurs

 Bien entendu, le tableau sera alimenté par du HTML dynamique.

<?php require_once 'config.php'; ?><?php require_once 
'../comfpl/main.php';?><?php 
/* 
* muser.php 
*/ 
?><html> 
<head> 
<title>Team up - Ajout utilisateur</title> 
<?php require_once 'phpinclude/commonmeta.php';?> 
<?php require_once 'phpinclude/theme.php';?> 
<?php FPLGlobal::render_bundle_css()?>  
<?php FPLGlobal::render_bundle_script()?> 
</head> 
<body> 
   <?php require_once 'phpinclude/navbar.php';?> 
 
   <div class="container"> 
       <div class="row"> 
           <div class="col"> 
               <table id="grid"></table> 
           </div> 
       </div> 
   </div> 
 
</body> 
</html> 

 Le script inséré de préférence dans la balise <head>, le tableau est bien alimenté après chargement de la page. C’est donc le navigateur qui déclenche la requête...