TP no5 "Conception de Systèmes d'Information" - Introduction à l'interfaçage d'une BdD avec PHP

L'objectif de ce TP est d'apprendre à accéder à une base de données par le biais d'interfaces développées pour des navigateurs web. Nous emploierons pour cela le langage PHP (PHP: Hypertext Preprocessor) et ses instructions de connexion et d'interactions avec une base MySQL.

1. Écriture de pages web en HTML

Avant d'utiliser PHP pour accéder à une base de données, il nous faut écrire une page web définissant le contenu et la forme de son rendu. Le langage HTML (HyperText Markup Language) est utilisé à cet effet.

1.1. Structure générale d'un document HTML

La caractéristique primordiale du langage HTML est que c'est un langage à balises. Cela signifie qu'il définit un ensemble de balises permettant d'encadrer des parties de texte et interprétées par le navigateur pour l'affichage de la page web. Les balises s'utilisent sur une partie du texte par une balise ouvrante juste avant cette partie et une balise fermante juste après. Par exemple, la première phrase de ce paragraphe utilise la balise <B> pour mettre du texte en gras et s'écrit :

La caractéristique primordiale du langage HTML est que c'est un langage <B>à balises</B>.

Consultez le code source de la page web que vous êtes en train de lire pour avoir un aperçu d'une page complète. Vous pouvez accéder à ce code source depuis le navigateur en faisant un clic droit sur la page puis en sélectionnant Code Source de la page.

Une page web écrite en HTML a ainsi une structure hiérarchique par imbrication de balises. Le fichier HTML commence par la balise de plus haut niveau <HTML> et se termine par la balise fermante associée </HTML>.

Le corps de la page est ensuite précisé dans la balise <BODY>.

Copiez/Collez le texte ci dessous dans un nouveau fichier que vous appelerez premierepage.html. Ouvrez ce fichier dans un navigateur pour constater le rendu obtenu.

<HTML>
    <BODY>
        Ceci est une premiere page HTML tres simple.
    </BODY>
</HTML>

1.2. Formulaires

Les formulaires HTML sont utilisés pour saisir des informations dans un navigateur qui sont soumises au serveur web et déclenchent une action. Souvent, cette action consiste à orienter vers une autre page choisie ou générée en fonction des informations saisies. Nous allons principalement nous intéresser aux formulaires pour utiliser le navigateur pour saisir les paramètres de requêtes SQL.

Un formulaire est déclaré dans une balise <FORM>. Deux paramètres sont associés à cette balise ACTION qui détermine la page réceptrice des valeurs saisies dans le formulaire et METHOD qui détermine le mode de déclenchement de l'action (nous ne détaillerons pas ici ce paramètre et le fixerons toujours à la valeur POST).

Les champs de saisie sont définis dans cette balise <FORM> dans des balises <INPUT>. Les principales options de la balise <INPUT> sont :

Un exemple de formulaire est donné ci-dessous. Copier ce formulaire au sein d'un fichier formulaire.html en incluant les balises nécessaires pour définir une page HTML.

<H1>Saisie d'une nouvelle finition</H1>
<FORM ACTION="insertion_finition.php" METHOD="post">
    Code: <INPUT TYPE="TEXT" NAME="code" />
    <BR />
    Pack: <INPUT TYPE="TEXT" NAME="pack" />
    <BR />
    Climatisation : <INPUT TYPE="RADIO" NAME="clim" VALUE="vrai" /> Oui
    <INPUT TYPE="RADIO" NAME="clim" VALUE="faux" /> Non
    <BR />
    Divers: <TEXTAREA NAME="divers" ROWS="4">Texte initial</TEXTAREA>
    <BR />
    <INPUT TYPE="SUBMIT" />
</FORM>

Cet exemple fait intervenir deux nouvelles balises sur la forme de l'affichage. <H1> pour un titre de section et <BR> pour un retour à la ligne.

Pour le moment une soumission sur ce formulaire provoquera une erreur car la page mentionnée dans le champ ACTION n'existe pas.

1.3. Pour aller plus loin en HTML

Ce TP n'ayant pas pour objectif d'étudier le langage HTML, nous nous contenterons des instructions minimales nécessaires à l'inclusion des instructions PHP. Pour ceux qui souhaitent en savoir plus sur HTML et améliorer l'apparence des interfaces, par exemple pour le développement final du projet CSI, vous pouvez vous réferrer à de nombreuses ressources disponibles sur le web tel que : http://nephi.unice.fr/CoursHTML/index.php.

2. Introduction à PHP

Les instructions écrites en PHP sont interprétées par le serveur web (et donc pas directement par le navigateur du client) s'il est muni de l'extension PHP de manière à générer automatiquement un fichier HTML envoyé au navigateur client.

Pour tester vos pages PHP, il faut exécuter un serveur Web disposant de l'extension PHP. Le serveur EasyPHP est installé sur vos postes de travail à cet effet. Lancez EasyPHP accessible parmi les programmes du menu Démarrer. Cette exécution fait apparaître un icône en bas à droite correspondant à EasyPHP. Effectuez un clic droit sur cet icône et sélectionnez Web local pour faire un test local. Cela ouvre une page d'un navigateur web sur le contenu du serveur local. Ce contenu correspond au répertoire C:\Program Files\EasyPHP-5.3.5.0\www. Vos fichier PHP à tester devront se situer dans ce répertoire.

Pour que les instructions soient interprétées par le serveur, il faut que le fichier ait pour extension .php (et non .html).

Le code PHP commence par une balise ouvrante <?PHP et se termine par la balise ?>

2.1. Affichage et variables

L'instruction echo est utilisée pour afficher du texte dans la page générée. Par exemple :

<?PHP
    echo 'Hellow World !';
?>

Les variables sont représentées par un $ suivi du nom de variable. Elles ne sont pas typées à leur déclaration. Par exemple :

<?PHP
    $nom = 'Laurent';
    echo 'Bonjour ';
    echo $nom;
?>

2.2. Accès aux données d'un formulaire

Lorsqu'une page PHP est appelée comme action résultant de la soumission d'un formulaire HTML, les valeurs des champs du formulaire peuvent être récupérées. Ces valeurs sont stockées dans un tableau accessible par la variable $_POST (dans le cas d'une soumission du formulaire par la méthode POST). Par exemple, le champ code inséré dans le formulaire précédent est accessible par :

$_POST['code']

Créez le fichier insertion_finition.php correspondant à celui attendu par la soumission du formulaire précédent. Dans ce fichier, affichez la valeur de tous les champs du formulaire. Pour indiquer si la climatisation est présente ou non, vous pouvez utiliser l'instruction if avec comme syntaxe :

IF ($_POST['clim'] == "vrai") {
    
instructions si vrai
} ELSE {
    
instructions si faux
}

2.3. Pour aller plus loin en PHP

Ici encore, l'objectif n'est pas d'étudier en détail le langage PHP mais d'apprendre à accéder à une base de données en PHP. Vous trouverez plus d'éléments sur le PHP dans de nombreuses ressources disponibles sur le web, tel que : http://www.lephpfacile.com/cours/.

3. PHP et MySQL

Notre objectif est d'utiliser PHP pour créer des interfaces conviviales d'accès à une base de données. Ces interfaces doivent permettre :

Dans un premier temps nous allons créer une base avec des enregistrements de manière à tester la connexion par PHP. Lancez un serveur MySQL et MySQLWorkbench pour créer un schéma et une base similaire à celle utilisée lors du TP précédent. Pour la création des tables et des enregistrements téléchargez et exécutez les instructions des fichiers suivants : TP-CSI-5-tables.sql et TP-CSI-5-insertions.sql.

3.1. Connexion à une base de données

La connexion à une base de données utilise l'instruction mysql_connect avec trois paramètres d'entrée : la machine hôte du serveur, un nom d'utilisateur et son mot de passe. Cette fonction renvoie une référence à la connexion que l'on peut garder dans une variable. Il faut ensuite sélectionner la base à laquelle on souhaite se connecter par la fonction mysql_select_db avec comme paramètres le nom de la base et la connexion. Par exemple :

$base = mysql_connect('localhost', 'root', '');
mysql_select_db('tp-csi-4', $base) ;

Une fois que toutes les requêtes sont terminées, il faut fermer la connexion par :

mysql_close();

3.2. Insertion d'enregistrements

L'expression de requêtes SQL se fait en PHP par le passage d'une chaîne de caractères contenant la requête en paramètre de la fonction mysql_query. Par exemple, l'ajout d'un nouvel enregistrement se fera comme suit :

$requete = "INSERT INTO Finition(CodeFi,Pack,Clim,Divers) VALUES(7,'eco','non','')";
mysql_query($requete) ;

Copier le fichier insertion_finition.php sous un autre nom de fichier .php et modifiez le formulaire pour qu'il soit invoqué lors d'une soumission. Modifiez son contenu pour que les données envoyées par le formulaire ne soient plus affichées dans une page web de retour mais directement insérées dans la base de données par une requête INSERT INTO.

Pour vérifier le bon fonctionnement de cette page PHP, ouvrez MySQL Workbench et consultez le contenu de la table Finition.

Dans le cas d'une requête d'insertion, la fonction mysql_query renvoie le nombre de lignes modifiées. ce résultat peut être stocké dans une variable pour tester si la requête a fonctionné. Si elle n'a pas fonctionné, la variable recevant le retour de la fonction ne sera pas créé. On peut tester le bon fonctionnement d'une requête de la manière suivante :

$requete = "INSERT INTO Finition(CodeFi,Pack,Clim,Divers) VALUES(7,'eco','non','')";
$ajout = mysql_query($requete);
if (!$ajout) {
    
traitement de l'erreur
}

Modifiez votre page PHP pour qu'elle considère le résultat de la requête d'insertion et affiche "Enregistrement inséré" ou "Insertion invalide" selon le cas. Vous pouvez faire des tests en essayant d'insérer des enregistrements dont la clé existe déjà.

3.3. Interrogation de la base de données

La même fonction est utilisée en PHP pour exprimer des requêtes de sélection. Le type de retour est cependant plus complexe car il contient les données renvoyées par la base. La fonction mysql_fetch_array est utilisée pour y accéder sous la forme d'un tableau. Son utilisation et l'accès aux données du tableau se fait comme dans l'exemple suivant :

$requete = "SELECT Pack, Clim FROM Finition WHERE CodeFi=5";
$retour = mysql_query($requete);
$donnees = mysql_fetch_array($retour);
mysql_free_result($retour);
echo 'Le pack est '.$donnees['Pack'].'<br>';
echo 'Sa climatisation est '.$donnees['Clim'].'<br>';

L'instruction mysql_free_result($retour) a pour effet de libérer la mémoire utilisée pour stocker le résultat.

Écrivez un formulaire HTML demandant de saisir le numero d'une agence. Écrivez une page PHP invoquée lors de la soumission de ce formulaire et qui affiche la Ville et le numero de telephone de l'agence correspondant au code saisi.

Cet exemple fonctionne pour consulter les résultats d'une requête renvoyant un enregistrement. Il est néanmoins possible que plusieurs enregistrements soient dans le résultat. La fonction mysql_fetch_array renvoie alors le premier enregistrement du retour de la requête et doit être rappelée pour accéder au second enregistrement. Lorsque la fonction mysql_fetch_array n'a plus d'enregistrement à renvoyer comme retour de la requête, la variable utilisée pour recevoir son type de retour ne sera plus affectée. Un exemple est donné ci-dessous.

$requete = "SELECT Pack FROM Finition WHERE Clim='auto'";
$retour = mysql_query($requete);
$donnees = mysql_fetch_array($retour);
if (!$donnees) echo 'Aucune finition ne propose de climatisation automatique';
else {
    echo 'Les finitions ayant une climatisation automatique sont :<br>';
    while ($donnees) {
        echo '- '.$donnees['Pack'].'<br>';
        $donnees = mysql_fetch_array($retour);
    }
}
mysql_free_result($retour);

Écrivez un formulaire HTML et une page PHP similaires aux précédents, mais où le formulaire demandera la saisie d'un numéro de département. Le résultat de la soumission sera d'afficher les villes et numero de téléphone de toutes les agences du département.