Partie 3 : manipulation de bases de données mySql avec PhP

Transcription

Partie 3 : manipulation de bases de données mySql avec PhP
Initiation à PhP
Séquence 3
Partie 3 : manipulation de bases de données mySql avec PhP
Si je reprends le schéma explicatif et que je le complète, voici ce que cela donne lorsqu’on utilise
une (ou plusieurs) base(s) de données pour construire dynamiquement des pages :
Notre machine
Apache
1. Requête de la forme :
http :// localhost/.../...php
6. Transmission
3. Transmission de la
Notre navigateur, qui
joue le rôle du client
web.
pour traduction Interpréteur
Serveur http.
de scripts
11. Transmission PhP.
page htlm générée
4. Envoi du formulaire contenant
de la page html
une requête de la forme : http:
//.../.../..php
générée
12. transmission de la page
2.
html générée.
5.
7.
Répertoire par
défaut (pour nous,
c’est www.)
10.
Serveur mySql
8.
9.
Base de données
Ce qui change par rapport au schéma fonctionnel de la partie 2, ce sont les étapes 7, 8, 9 et 10.
Ces étapes se produisent si le script contient des instructions de connexion à des bases de données,
et des requêtes SQL.
Étape 7 : elle n’a lieu que si le script contient des instructions de connexion à des bases de
données. L’interpréteur de script détecte une instruction de connexion à des bases de données, et la transmet au serveur mySql.
Étape 8 : le serveur sollicite les bases de données concernées et leur soumet les requêtes SQL
figurant dans le script.
Étape 9 : le serveur mySql exécute les requêtes et récupère les résultats.
Étape 10 : le serveur mySql renvoie les résultats au script. Les résultats sont renvoyés au
script et celui-ci utilise éventuellement les résultats des requêtes SQL pour construire dynamiquement une page html et la renvoyer au serveur http, qui lui-même la renvoie au navigateur du poste client.
Nous sommes ici en plein dans l’architecture client/serveur.
Pour nous initier à cette technique, nous allons travailler avec un formulaire, un script et une base
de données très simple, base que je vous invite à créer sous mysql.
8 3951 TG PA 00
167
Initiation à PhP
Séquence 3
1. Le formulaire initialement envoyé par l’internaute
Vous le connaissez, on s’en est déjà servi pour faire pas mal de tests.
Voici le code source de ce formulaire :
<html>
<head><title> Formulaire n°1 de test </title></head>
<body>
<form action = ”http://localhost/exploitationFormulaire1AvecBase.php” method
= “get”>
Entrez votre nom : <input type = “text” name = “nom” size = 20> <br>
Entrez votre âge : <input type = “text” name = “age” size = 5> <br>
<input type = “submit” value = “Envoyer”>
<input type = “reset” value = “Annuler”>
</form>
</body>
</html>
Voici ce formulaire :
2. La base de données utilisée
On va l’appeler basinscrits. Elle est constituée d’une seule table, la table inscrits, qui comporte
deux champs, nom et age, tous deux de type chaîne de caractère.
Aucun des deux champs n’est pour le moment clé primaire, le null est autorisé pour les deux.
Bref, ce n’est pas une bonne base de données telle qu’on vous apprend à les concevoir, mais pour
le moment, faire une bonne base n’est pas le sujet.
Voici le détail des champs de la table inscrits :
Champ
Type
Taille/Valeurs
Interclassement
Attributs
Null
nom
VARCHAR
20
null
age
VARCHAR
3
null
Voici la requête de création de la table inscrits :
CREATE TABLE `inscrits` ( `nom` VARCHAR( 20 ) ,`age` VARCHAR( 3 ) );
Pour accéder à une base depuis un script, il faut que le script se connecte.
8 3951 TG PA 00
168
Séquence 3
Initiation à PhP
3. Connexion à la base de données
Pour pouvoir se connecter à mysql depuis un script, mysql doit être lancé.
Pour se connecter, à l’aide d’un script php, à une base de données mysql, on a deux possibilités :
– créer une source de données odbc et se connecter à la base en utilisant les fonctions php
de connexion aux sources de données odbc ;
– se connecter directement à mysql en utilisant les fonctions php de connexion spécifiques
à mysql.
3A. Connexion à la base de données via une source de données
odbc
Cette première technique est intéressante car elle est transposable à tout autre SGBD comme
interbase, access, sqlqerver…
Avec odbc, on va rajouter notre base dans les sources de données (si vous ne savez plus faire ça, je
vous renvoie à la séquence sur mySql, paragraphe 3B. Création d’une source de données).
La source de données doit être créée sur la machine hébergeant le serveur http.
Voici ce que je saisis pour créer la source de données ODBC :
Pour plus de confort, pour le moment, choisissez un utilisateur qui a tous les droits.
Pour se connecter à une source de données odbc, on utilise la fonction odbc_connect.
Cette fonction prend 3 paramètres : le nom de la source odbc, le nom d’utilisateur, son mot de
passe.
Notre script va s’appeler exploitationFormulaire1AvecBase.php.
<?
$connexion = odbc_connect(”lienSurBasinscrits“,“root“,“root“);
if ($connexion)
8 3951 TG PA 00
169
Séquence 3
Initiation à PhP
{
print ”connexion réussie“;
}
else print ”Echec de la connexion“;
// Lʼinstruction de fermeture de connexion ci-dessous est optionnelle
odbc_close($connexion);
?>
Ce script très simple tente de se connecter à la base basinscrits via la source de données odbc
lienSurBasinscrits qu’on vient de créer, en indiquant que c’est l’utilisateur root ayant le mot de
passe root qui demande cette connexion.
Si la connexion échoue, la fonction renvoie la valeur 0 et la variable $connexion vaut donc 0.
Si la connexion réussit, la variable $connexion a pour valeur un identifiant de connexion délivré
par le serveur mySql.
L’identifiant de connexion retourné par cette fonction est nécessaire pour toutes les autres fonctions ODBC.
Ensuite, selon la valeur de la variable $connexion, le script crée une page à la volée, qui indique
si la connexion a réussi ou non.
Si la connexion à la source de données odbc a réussi, on la referme à l’aide de l’instruction odbc_
close($connexion);.
L’instruction de fermeture de la connexion est optionnelle, la connexion est automatiquement
fermée à la fin du script.
Pour tester ça, ouvrez le formulaire html, cliquez sur Envoyer.
3B. Connexion directe à mySql, sans passer par la source de données odbc
Cette fois, le script est le suivant :
<?
$connexion = mysql_connect(”localhost“, ”root“, ”root“);
if ($connexion)
{
print ”connexion réussie“;
}
else print ”Echec de la connexion“;
// Optionnelle aussi
mysql_close($connexion);
?>
Le principe de cette fonction mysql_connect est exactement le même que celui de la fonction
odbc_connect, c’est pour cela que les deux scripts sont si ressemblants.
De même, la fonction mysql_close a pour effet de fermer la connexion au serveur mysql.
8 3951 TG PA 00
170
Séquence 3
Initiation à PhP
Alors qu’avec odbc_connect, on se connecte à une source de données, avec mysql_connect, on se
connecte au serveur mysql, et ce, sans spécifier quelle est la base de données concernée.
Remarque
Ne pas préciser quelle base de données est concernée par la connexion signifie qu’il faudra bien
préciser à un autre moment quelle base est concernée par les opérations, mais cela signifie aussi
qu’avec un seul identifiant de connexion, on peut manipuler plusieurs bases, ce qui n’est pas le
cas avec une connexion via odbc.
Autre remarque
Si, dans mysql, vous avez créé un utilisateur sans mot de passe (en laissant le mot de passe vide lors
de la création de l’utilisateur), alors, l’instruction de connexion passe, en guise de mot de passe,
une chaîne de caractères vide à la fonction de connexion.
Exemple : en supposant que vos ayez créé un utilisateur machin sans mot de passe, l’instruction
de connexion est mysql_connect(”localhost“, ”machin“, ”“); (”“ : deux doubles quottes qui se
suivent).
Passons à la suite des manips.
4. Manipulation de la base de données
Une fois la connexion établie, on peut exécuter des requêtes SQL.
4A. Insertion des données saisies par l’internaute
On va, par une requête, rajouter dans la table inscrits les données que l’internaute a saisies dans
les champs de formulaire nom et age.
4A1. Mise en jambes
Mais avant de faire ça, on va commencer simple : on va insérer la ligne (‘truc’,’42’) dans la table
inscrits.
La première version de ce script se connecte à la base via odbc :
<?
$connexion = odbc_connect(”lienSurBasinscrits“,“root“,“root“);
if ($connexion)
{print ”Connexion réussie <br>“;
// Si la connexion est réussie, alors on envoie la requête dʼinsertion
$resultatRequete = odbc_do($connexion,“insert into inscrits (nom, age)
values(ʻtrucʼ,ʼ42ʼ)“);
// si la requête sʼest exécutée correctement
if ($resultatRequete) print ”Votre saisie a été prise en compte“;
else print ”Impossible de prendre vos données en compte“;
}
else print ”Echec de la connexion“;
?>
8 3951 TG PA 00
171
Séquence 3
Initiation à PhP
On exécute des requêtes sql sur la base de données en utilisant la fonction odbc_do (on peut aussi
utiliser la fonction odbc_exec, qui est un synonyme de odbc_do).
Comme je vous l’ai annoncé tout à l’heure, on passe en paramètres à cette fonction :
– l’identifiant de connexion ;
– le texte de la requête. À ce propos, attention à ne pas encadrer les données à insérer de
doubles quottes si le texte de votre requête est lui-même entre doubles quottes, sinon
vous avez une erreur.
La fonction odbc_do (ou odbc_exec) renvoie une valeur booléenne fausse si la requête n’a pas
abouti, sinon, elle retourne un identifiant de résultat odbc.
C’est pour cela qu’on peut tester si la requête s’est bien exécutée, à l’aide du test if ($resultatRequete).
Pour tester votre script, il vous suffit de cliquer sur le bouton Envoyer de votre formulaire.
Ensuite, allez voir dans la base basinscrits si les données ont bien été rajoutées.
Maintenant, on va faire la version du script qui utilise la connexion directe à mySql. Observez bien
les différences avec le script ci-dessus :
<?
$connexion = mysql_connect(”localhost“, ”root“, ”root“);
if ($connexion)
{print ”Connexion réussie <br>“;
$resultatRequete = mysql_db_query(”basinscrits“,“insert into inscrits
(nom, age) values(ʻtrucʼ,ʼ42ʼ)“, $connexion);
if ($resultatRequete) print ”Votre saisie a été prise en compte ”;
else print ”Impossible de prendre vos données en compte“;
}
else print ”Echec de la connexion“;
?>
Voilà, quand on se connecte au serveur mysql avec la fonction mysql_connect, c’est lors de l’exécution de la requête qu’on passe, en paramètre, le nom de la base concernée.
Remarque
Dans les deux scripts ci-dessus, vous pouvez remplacer les instructions :
// première version, connexion à la source odbc
$resultatRequete = odbc_do($connexion,“insert into inscrits (nom, age)
values(ʻtrucʼ,ʼ42ʼ)“);
et :
// deuxième version, connexion directe à mysql
$resultatRequete = mysql_db_query(”basinscrits“,“insert into inscrits (nom,
age) values(ʻtrucʼ,ʼ42ʼ)“, $connexion);
8 3951 TG PA 00
172
Séquence 3
Initiation à PhP
par :
// première version
$requete = ”insert into inscrits (nom, age) values(ʻtrucʼ,ʼ42ʼ)“;
$resultatRequete = odbc_do($connexion, $requete);
et par :
// deuxième version
$requete = ”insert into inscrits (nom, age) values(ʻtrucʼ,ʼ42ʼ)“;
$resultatRequete = mysql_db_query(”basinscrits“, $requete, $connexion);
Dans ces deux derniers cas, au lieu de passer en paramètre la chaîne de caractères contenant le
texte de la requête sql, on l’affecte à une variable, et c’est cette variable que l’on passe en paramètre à la fonction.
Tiens, juste par curiosité, changez la requête sql dans un des deux scripts, ou dans les deux, en
enlevant les quottes autour de truc et de 42, juste pour voir…
$requete = ”insert into inscrits (nom, age) values(truc,42)”;
Et testez à nouveau… Cette fois, la connexion réussit, mais les données ne sont pas prises en
compte, problème de type, probablement…
4A2. Maintenant, la requête avec les données saisies par l’internaute
On reprend les deux scripts précédents et on les modifie de manière à ce que ce qui soit inséré
dans la base, soient les informations saisies par l’internaute dans les zones de saisie du formulaire.
En fait, c’est juste le texte de la requête qui change. Il doit être construit par concaténation entre
des parties fixes de la requête, et des parties qui changent.
Par exemple, si je saisis fred et 42 dans les champs nom et age, ma requête doit être :
$requete = ”insert into inscrits (nom, age) values(ʻfredʼ, ʻ42ʼ)“;
ou bien :
$requete = ʻinsert into inscrits (nom, age) values(”fred“, ”42“)ʼ;
mais en aucun cas, elle ne peut être :
$requete = ʻinsert into inscrits (nom, age) values(fred, 42)ʼ;
car on a bien vu dans le dernier test du paragraphe précédent que ça ne fonctionnait pas.
Commençons par essayer le texte de requête suivant :
$requete = ʻinsert into inscrits (nom, age)
values($_REQUEST[”nom“], $_REQUEST[”age“])ʼ;
On a à nouveau notre message :
Connexion réussie
Impossible de prendre vos données en compte
Bon, c’est parce que quand on fait ça, on lui passe les valeurs saisies mais elles ne sont pas encadrées par des quottes, et comme dans la base, les champs nom et age sont déclarés comme étant
de type chaîne de caractères, mysql n’en veut pas dans la table inscrits.
8 3951 TG PA 00
173
Séquence 3
Initiation à PhP
Pour php, le type d’une donnée dépend de sa valeur et du contexte, mais pas pour mysql.
Pour mysql, une chaîne de caractère, c’est un truc encadré par des quottes.
Il faut donc qu’on encadre chaque valeur issue de $_REQUEST avec des quottes.
Ce qu’on veut, si, par exemple, l’internaute a saisi lulu et 15, c’est que, une fois qu’on remplace
$_REQUEST[‘nom’] par lulu et $_REQUEST[‘age’] par 15, le texte de la requête soit ‘insert into
inscrits (nom, age) values(”lulu“, ”15“)’
Donc, il faut que dans le texte de la requête, on concatène des doubles quottes aux variables
$_REQUEST[‘nom’] et $_REQUEST[‘age’].
Voilà le résultat :
$requete = ʻinsert into inscrits (nom, age)
values(”ʼ.$_REQUEST[ʻnomʼ].ʼ“, ”ʼ.$_REQUEST[ʻageʼ].ʼ“)ʼ;
Dans la requête ci-dessus, la première fois que vous voyez “ ’, il s’agit d’une double puis d’une
simple quotte ; la deuxième fois, c’est une simple puis une double quotte, ensuite, c’est à nouveau
une double puis une simple quotte, et enfin, une simple puis une double quotte.
Vous pouvez tester, ça fonctionne. Mais ça veut dire aussi que pour construire ce type de requête,
il faut être à l’aise avec la concaténation.
Moi, maintenant, je me demande comment il faut rédiger le texte de la requête pour une donnée
de type numérique.
Alors je vous propose de modifier, dans la table inscrits, le type de la donnée age, que l’on va
mettre en numérique. Moi, je l’ai modifié en choisissant le type int.
Je garde le script avec la dernière version de la requête, et je teste.
Ça marche pas.
Ce qu’il faut, c’est faire en sorte que dans la requête, la donnée $_REQUEST[‘age’] ne soit plus
encadrée par des quottes quand on la remplace par sa valeur effective.
$requete = ʻinsert into inscrits (nom, age)
values(”ʼ.$_REQUEST[ʻnomʼ].ʼ“, ʻ.$_REQUEST[ʻageʼ].ʼ)ʼ;
Testez. Ça marche.
Voilà. Dans les deux requêtes précédentes, les parties variables du texte de la requête sont les
valeurs des données $_REQUEST[‘nom’] et $_REQUEST[‘age’].
Alors maintenant qu’on a inséré des données dans notre table, on va pouvoir faire des requêtes
de consultation. On a été très laxiste quand on a créé notre table inscrits : les enregistrements
n’ont pas de clé primaire, les doublons sont autorisés et les valeurs null aussi.
Un prof de MCD et de base de données s’arracherait le cheveu devant une telle table. Mais le but,
c’est de faire plein de tests, et plusieurs fois les mêmes, alors c’est plus facile avec une table aussi
bancale que la table inscrits.
Remarque importante
Toutes les requêtes ayant pour effet de modifier le contenu (update, delete….) ou la structure de
la base de données (alter, drop…) se construisent sur le même modèle que les requêtes insert.
8 3951 TG PA 00
174
Séquence 3
Initiation à PhP
4A3. En guise de conclusion à propos des requêtes de modification
Il y a tout de même un type particulier de requête dont il faut que je vous parle, ce sont les requêtes qui ne s’adressent à aucune base particulière, mais directement au serveur de base de données,
comme les requêtes demandant au serveur mysql de créer une nouvelle base de données.
Pour ces requêtes là, on n’utilise pas la fonction mysql_db__query, puisqu’on ne peut pas spécifier
une base de données particulière, mais mysql_query.
Exemple :
$requete = ”create database nouvelleBase;“;
mysql_query($requete, $connexion);
Ensuite, après avoir créé la base, on peut utiliser mysql_db_query pour toutes les autres requêtes.
L’équivalent n’est pas disponible avec odbc, puisqu’avec odbc, on se connecte à une source de
données, ce qui signifie que cette source existe déjà.
Remarque
Si on ne veut pas, à chaque requête, spécifier en paramètre quelle base elle concerne, en utilisant
mysql_db_query, on peut utiliser mysql_query pour ces requêtes, mais il faut alors, avant l’exécution de ces requêtes, spécifier quelle base est concernée à l’aide de l’instruction mysql_select_db.
Exemple : en supposant qu’on a créé la base de données nouvelleBase, et que maintenant, on
veuille utiliser la base (pour y ajouter des tables, par exemple), alors, avant d’écrire ces requêtes,
il faut écrire l’instruction mysql_select_db («nouvelleBase», $connexion);
Passons maintenant aux requêtes de consultation. Vous allez comprendre pourquoi je les aborde
après les requêtes de mise à jour : l’exploitation des données issues des requêtes de consultation
nécessite des structures de programmation un peu plus complexes que pour les requêtes abordées
ci-dessus.
4B. Consultation
Comme ci-dessus, pour consulter notre base de données, on va se contenter de modifier le texte
de notre requête.
Ceci fait que notre formulaire ne sert qu’à lancer la requête.
Si j’étais courageuse, je vous ferais modifier votre formulaire, de manière à ce qu’il soit cohérent
avec le fait qu’on consulte la base sans rien y insérer. Mais tout de suite, là, maintenant, je suis
prise de paresse. Vous, par contre, faites-le si vous voulez.
Lorsqu’on exécute une requête de consultation (une requête commençant par select), il y a généralement un ensemble de résultats qui est renvoyé.
Jusqu’à présent, lorsque vous faisiez une requête select, vous voyiez directement le résultat s’afficher à l’écran, parce que le logiciel que vous utilisez, dans ce cas, est client du SGBD, et se charge
d’afficher les résultats de requêtes que le serveur de base de données lui renvoie.
Ici, ça ne va pas fonctionner comme ça car c’est notre script qui est client de mysql. Lorsqu’on
exécute une requête select dans un script, le résultat est renvoyé au script, et c’est au script de se
charger d’afficher ce résultat, à l’aide de commandes spéciales.
8 3951 TG PA 00
175
Séquence 3
Initiation à PhP
4B1. Allez, on se fait une requête select * from maTable
Je reprends une des deux versions du script et je modifie sa requête :
<?
$connexion = mysql_connect(”localhost“, ”root“, ”root“);
if ($connexion)
{print ”Connexion réussie <br>“;
$requete = ”select * from inscrits“;
$resultatRequete = mysql_db_query(”basinscrits“,$requete, $connexion);
if ($resultatRequete)
{
print ”Votre saisie a été prise en compte ”;
// ici, il faut rajouter des instructions pour exploiter le résultat de la requête
// car pour le moment, même si la requête sʼexécute, le script
nʼaffiche pas son
// résultat
}
else print ”Impossible de prendre vos données en compte“;
}
else print ”Echec de la connexion“;
?>
Pour exploiter le résultat d’une requête de consultation, comme il se peut que ce résultat contienne plusieurs lignes, on doit faire une boucle.
Comme il se peut aussi que le résultat de la requête soit vide, on doit faire une boucle while.
En fait, le principe pour exploiter le résultat d’une requête est celui des curseurs, que vous avez
peut-être déjà vu au cours de vos formations sur les bases de données.
Pour ceux qui ne voient pas du tout de quoi je peux bien parler, le résultat d’une requête (dans
notre cas, ce résultat s’appelle $resultatRequete) se parcourt séquentiellement comme un fichier
de données, comme une collection de données du même type, comme un tableau… : tant qu’on
n’est pas à la fin, on lit le suivant.
Voici, ci-dessous, un exemple d’instruction permettant d’afficher, pour chaque ligne du résultat,
les deux champs de la table inscrits…
// Cette instruction est à mettre à la place des commentaires commençant
par :
// ici, il faut rajouter des instructions…
while($ligneResultat = mysql_fetch_array($resultatRequete))
print $ligneResultat[0].“, ”.$ligneResultat [1].“,<br> ”;
On peut écrire cette boucle while de façon moins concentrée, mais aussi plus lisible. La syntaxe
ci-dessous ressemble plus à ce que vous avez l’habitude d’écrire, mais les deux syntaxes sont totalement équivalentes.
8 3951 TG PA 00
176
Initiation à PhP
Séquence 3
Je vous ai rajouté des commentaires pour expliquer la structure.
…
// Lecture avancée du premier enregistrement issu du résultat de la
// requête
$ligneResultat = mysql_fetch_array($resultatRequete);
// Si on a pu lire un enregistrement, on entre dans le while
while($ligneResultat)
{
print $ligneResultat[0].“, ”.$ligneResultat [1].“,<br> ”;
// Tentative de lecture de lʼenregistrement suivant
$ligneResultat = mysql_fetch_array($resultatRequete);
}
}
…
La fonction mysql_fetch_array, que fait-elle ?
Elle lit la ligne courante (c’est à dire le ”n-uplet“ ou encore l’enregistrement courant) dans $resultatRequete et l’affecte à la variable $ligneResultat, qui contient donc, à chaque tour de boucle,
la ligne courante issue du résultat de la requête.
Le fait d’affecter une ligne de table à la variable $ligneResultat fait que cette variable devient un
tableau à une dimension, si la requête d’origine demande l’affichage de plusieurs champs. Dans
ce cas, l’indice du premier élément de $resultatRequete est 0 (zéro).
À chaque indice, on trouve la valeur d’un champ de table. Pour notre part, la table inscrits contient deux champs.
Donc, $ligneResultat contient deux éléments, un à l’indice zéro, l’autre à l’indice un, que l’on
affiche à l’aide de l’instruction :
print $ligneResultat[0].“, ”.$ ligneResultat [1].“,<br> ”;
Remarque
On pourrait aussi faire une boucle pour afficher les champs d’une ligne, suivant le morceau d’algo
suivant…
Pour i de 0 à 1
Faire Afficher $ligneResultat[i]
finPour
La fonction mysql_fetch_array, si elle n’arrive pas à affecter la valeur de la ligne courante à $ligneResultat, lui affecte une valeur booléenne fausse.
Si c’est le cas, on ne « re-rentre » pas dans le while.
La variable $ligneResultat peut être fausse :
– soit parce que le résultat de la requête est vide (dans ce cas, on n’entre jamais dans le
while) ;
– soit parce qu’on a lu le dernier enregistrement du résultat de la requête lors de la boucle
précédente.
8 3951 TG PA 00
177
Initiation à PhP
Séquence 3
Si mysql_fetch_array renvoie vrai, c’est qu’elle a pu lire l’enregistrement qui suit l’enregistrement
courant, qui devient à son tour l’enregistrement courant, que l’on affiche à l’intérieur du while,
etc. etc. À chaque lecture dans $resultatRequete , c’est l’enregistrement suivant qui est lu, jusqu’à
ce qu’on se trouve à la fin du résultat de la requête.
Et si le script s’est connecté en utilisant une connexion odbc ?
La fonction odbc_fetch_array est l’équivalent de la fonction mysql_fetch_array, sauf que si on
l’utilise, la variable $ligneResultat est un tableau de hachage dont les clés sont les noms des
champs spécifiés dans la requête.
Voici ci-dessous ce que ça donne :
<?
$connexion = odbc_connect(”lienSurBasinscrits“,“root“,“root“);
if ($connexion)
{print ”Connexion réussie<br>“;
$requete = ”select * from inscrits“;
$resultatRequete = odbc_do($connexion, $requete);
if ($resultatRequete)
{
print ”Votre saisie a été prise en compte <br> ”;
while($ligneResultat = odbc_fetch_array($resultatRequete))
print $ligneResultat[ʻnomʼ].“, ”.$ligneResultat[ʻageʼ].“<br>“ ;
}
else print ”Impossible de prendre vos données en compte“;
}
else print ”Echec de la connexion“;
?>
Remarque
Si vous souhaitez faire en sorte que $ligneResultat soit un tableau à indice numérique, vous pouvez, au lieu d’utiliser la fonction odbc_fetch_array, choisir d’utiliser la fonction odbc_fetch_into,
comme vous le montre le bout de code ci-dessous :
…
while(odbc_fetch_into($resultatRequete, $ligneResultat))
print $ligneResultat[0].“, ”.$ligneResultat [1].“,<br> ”;
…
4B2. Une requête construite à partir d’une saisie de l’internaute
Ce qu’on veut, c’est que la requête nous retourne uniquement les enregistrements de la table
inscrits tels que le nom soit le nom saisi par l’internaute dans la zone nom du formulaire, ou tels
que l’âge soit l’âge saisi par l’internaute dans la zone age du formulaire.
Exemple : si l’internaute saisit 42, la requête sql doit être :
select * from inscrits where age = 42
8 3951 TG PA 00
178
Séquence 3
Initiation à PhP
Les deux requêtes ci-dessous fonctionnent, que la connexion se fasse via odbc ou directement à
mysql. Testez-les l’une après l’autre.
// attention : dans la requête ci-dessous, ”ʼ : une double puis une simple
quotte,
// et ʻ“ʼ : une simple, une double, une simple quotte
$requete = ʻselect * from inscrits where age = ”ʼ.$_REQUEST[”age“].ʼ“ʼ;
$requete = ʻselect * from inscrits where age = ʻ.$_REQUEST[”age“];
Vous pouvez remarquer que bien que, dans la table inscrits, le champ age soit de type numérique,
on peut l’encadrer dans la requête par des quottes, ça fonctionne.
Autre exemple : ce qu’on veut maintenant, c’est que les enregistrements renvoyés soient tels que
le nom soit le nom saisi par l’internaute dans la zone nom du formulaire.
// Attention : dans les requêtes ci-dessous, ”ʼ : une double puis une simple
quotte,
// et ʻ“ʼ : une simple, une double, une simple quotte
$requete = ʻselect * from inscrits where nom = ”ʼ.$_REQUEST[”nom“].ʼ“ʼ;
// celle-là fonctionne aussi
$requete = ʻselect * from inscrits where nom = ”ʼ.$_REQUEST[ʻnomʼ].ʼ“ʼ;
// celles-là aussi
// Attention, ci-dessous, ʻ“ : une simple puis une double quotte,
// ”ʼ“ : une double, une simple, une double quotte
$requete = ”select * from inscrits where nom = ʻ“.$_REQUEST[ʻnomʼ].“ʼ“;
$requete = ”select * from inscrits where nom = ʻ“.$_REQUEST[”nom“].“ʼ“;
Maintenant qu’on a des requêtes qui fonctionnent, essayons de voir dans quel cas ça ne fonctionne pas :
//Celle-ci ne fonctionne pas :
$requete = ʻselect * from inscrits where nom =ʼ.$_REQUEST[ʻnomʼ];
Dans le cas de la requête ci-dessus, on a un intéressant message d’erreur qui s’affiche :
Connexion réussie
Warning: odbc_do(): SQL error: [MySQL][ODBC 3.51 Driver][mysqld-4.1.9max]Champ ʻfredʼ inconnu dans where clause, SQL state S0022 in SQLExecDirect
in c:\program files\easyphp1-8\www\exploitationformulaire1avecbaseodbc.php on
line 6
Impossible de prendre vos données en compte
En fait, l’erreur vient du fait que je n’ai pas fait en sorte que la valeur contenue dans $_
REQUEST[‘nom’] soit encadrée par des quottes.
Si, par exemple, je saisis truc dans mon champ de formulaire, cela donne la requête select * from
inscrits where nom = truc.
Mysql croit donc qu’on est en train de faire une jointure entre le champ nom de la table inscrits et
un autre champ de cette table, qui s’appellerait truc. Comme il ne trouve pas ce champ truc dans
la table inscrits, il nous le signale.
8 3951 TG PA 00
179
Séquence 3
Initiation à PhP
Remarque
Cette erreur nous montre comment construire dynamiquement une jointure dans une requête
sql !!
4B3. Habiller le résultat des requêtes de consultation
Pour le moment, les résultats s’affichent mais ne sont pas très présentables.
On peut, au fur et à mesure qu’on traite chaque enregistrement, construire des tableaux, des
listes, ou tout autre élément de page html, à l’aide de l’instruction print, avec des instructions du
genre de celles contenues dans le script ci-dessous, que je vous invite à tester :
<?
$connexion = odbc_connect(”lienSurBasinscrits“,“root“,“root“);
if ($connexion)
{print ”Connexion réussie<br>“;
$requete = ”select * from inscrits where nom = ʻ“.$_REQUEST[”nom“].“ʼ“;
$resultatRequete = odbc_do($connexion, $requete);
if ($resultatRequete)
{
print ”Votre saisie a été prise en compte <br> ”;
// on va compter le nombre de résultats
$nb=0;
print ”<H1>Liste des résultats</H1> <br>“;
print ʻ<P><TABLE BORDER=2 WIDTH=“75%“>ʼ;
print ”<TR><TH>NOM</TH><TH>AGE</TH></TR>“;
while(odbc_fetch_into($resultatRequete,$ligneResultat)) {
print ”<TR><TD>“. $ligneResultat[0].“ </TD><TD>“. $ligneResultat[1].
”</TD></TR>“;
$nb++;
}
print ”</TABLE><P>“;
print ”Il y a ”.$nb.“ résultats.“;
}
else print ”Impossible de prendre vos données en compte“;
}
else print ”Echec de la connexion“;
?>
Remarque
On peut parvenir à un résultat mis en forme de façon à peu près équivalente à la précédente à
l’aide de la fonction odbc_result_all, comme dans l’exemple de code suivant :
8 3951 TG PA 00
180
Initiation à PhP
Séquence 3
…
if ($resultatRequete)
{
print ”Votre saisie a été prise en compte <br> ”;
print ”<H1>Liste des résultats</H1> <br>“;
odbc_result_all($resultatRequete,“border=2“);
}
…
Mais dans ce cas, on ne peut pas compter combien de résultats on affiche… Il existe probablement
une fonction qui sait nous dire combien d’éléments contient l’ensemble résultat.
Note : l’équivalent de odbc_result_all n’existe pas si on s’est directement connecté à mysql sans
passer par odbc.
Bon, on a vu l’essentiel.
Avec toutes les connaissances acquises au cours de ce chapitre, je vous propose ci-dessous de mettre tout seuls les « mains dans le cambouis » avec quelques idées pour prolonger cette initiation.
5. Quelques idées pour prolonger cette initiation
Remarque importante
Il existe tout un tas de fonctions que l’on peut utiliser dans un script relativement aux bases de
données.
Je vous invite à consulter la documentation sur ces fonctions aux liens suivants (documentation
officielle) :
http://www.php.net/manual/fr/ref.mysql.php, pour les fonctions utilisables lorsqu’on s’est
directement connecté à mysql.
http://www.php.net/manual/fr/ref.uodbc.php, pour les fonctions utilisables lorsqu’on s’est
connecté à mysql via une source odbc.
Un exemple de fonction bien utile : la fonction mysql_affected_rows, qui, suite à l’exécution
d’une requête sql, retourne le nombre de lignes concernées par la requête, ce qui permet de faire
des tests.
Quels tests ? On peut, par exemple, tester si le nombre de lignes concernées par une requête est
différent de zéro. Si c’est le cas, on effectue le traitement d’affichage du résultat de la requête,
sinon, on indique par un message que la requête n’a pas de résultat.
On peut aussi afficher, dans la page html générée dynamiquement, combien la requête nous a
fourni de résultats.
8 3951 TG PA 00
181
Séquence 3
Initiation à PhP
Voici quelques idées pour prolonger cette initiation
• Mettre le champ nom en clé primaire, prévoir un test en cas de tentative d’insertion d’une ligne
où la clé primaire est déjà dans la table inscrits, ça donne un bout de code du genre :
…
// On suppose que lʼinternaute a saisi un nom dans le champ de formulaire
nom, et un âge
// dans le champ de formulaire age
$requete = ʻinsert into inscrits (nom, age)
values(” ʻ.$_REQUEST[ʻnomʼ].ʼ ”, ʻ.$_REQUEST[ʻageʼ].ʼ)ʼ;
$resultatRequete = odbc_do($connexion, $requete);
if ($resultatRequete)
print ”Votre saisie a été prise en compte <br> ”;
else print ”Impossible de rajouter cette information <br> ”;
…
• Faire des requêtes update sur des enregistrements figurant déjà dans la table inscrits.
• Changer l’instruction de connexion, en indiquant un utilisateur n’ayant pas les mêmes droits que
root (attention, dans ce cas, à bien adapter la source odbc).
• Rajouter une table et faire des requête avec des jointures.
• Reprendre nos tentatives de création de page comportant plusieurs formulaires et donc plusieurs instructions submit, pour voir si les deux instructions submit sont bien prises en compte.
• Rendre variables les valeurs de l’instruction de connexion : faire saisir à l’utilisateur son nom et
son mot de passe dans un premier formulaire.
• Dans un second script, construire l’instruction de connexion à l’aide des valeurs saisies par l’internaute dans le premier formulaire.
• Faire un test ayant pour rôle d’autoriser la connexion seulement si l’utilisateur a des droits sur
la base. S’il a les droits, effectuer les traitements et renvoyer le résultat, sinon, lui afficher un
message lui indiquant qu’il n’est pas autorisé à demander que ces traitements soient effectués,
• Gérer les erreurs se produisant lors de l’exécution des requêtes SQL, afin d’éviter l’écriture des
messages d’erreur dans la page html renvoyée à l’internaute.
Ce type d’erreur peut se produire quand l’internaute n’est pas autorisé à demander le traitement effectué par la requête.
Pour gérer ces erreurs, vous pouvez utiliser l’opérateur de gestion des erreurs que je vous avais
présenté dans la partie 1 de cette séquence.
Vous pouvez aussi chercher des fonctions php de gestion des erreurs en allant sur les liens que
je vous ai fournis ci-dessus.
• Continuer (et terminer) le site qu’on avait entrepris lors de la séquence javascript.
D’un site de présentation, il peut maintenant devenir un site commercial. Vous pouvez créer une
base de données où vous stockerez les internautes ayant rempli le formulaire d’inscription. Vous
pouvez aussi stocker quels sont ses artistes préférés.
Vous pouvez aussi mettre dans une table vos disques, films, livres, et leur affecter un prix.
Vous pouvez également permettre aux internautes de consulter ce catalogue et de passer des
commandes, ce qui nécessitera que vous gériez votre stock de produits à vendre (histoire de ne
pas vendre 2 fois le même CD à deux internautes différents).
8 3951 TG PA 00
182
Séquence 3
Initiation à PhP
Vous pouvez aussi confirmer la commande de l’internaute par envoi automatique d’un mail (il y
a des fonctions php spéciales pour générer et envoyer automatiquement des mails).
Etc. etc.
Vous avez toutes les connaissances techniques requises pour réaliser ces prolongements.
N’hésitez pas également à chercher des exemples sur le net pour vous en inspirer, car ce cours,
bien que déjà volumineux, reste très incomplet.
Commencez par vous inspirer d’exemples les plus simples possibles, car vous avez besoin de comprendre le code source des scripts de ces exemples.
Voilà, maintenant, on va attaquer la partie 4 de ce support, celle où on mélange du php, du sql,
du javascript. Je vais en faire une partie microscopique avec deux tous petits exemples, car maintenant que vous savez comment on construit une page html à partir d’un script php, l’écriture
d’instructions javascript se fait tout à fait de la même façon.
Partie 4 : on ajoute du javascript, on secoue, et on déguste
Dans cette partie 4, il s’agit d’intégrer du javascript dans les scripts php, afin que le javascript soit
envoyé dans le code source de la page générée dynamiquement par le script.
Trophacylle !!
Les instructions javascript, tout comme le html peuvent :
– s’écrire directement dans le code source du script ;
– s’écrire dans le code source de la page créée dynamiquement.
On peut, dans les deux cas, écrire des instructions javascript de manière conditionnelle : si on est
dans telle situation, alors on écrit telle instruction javascript, sinon, on écrit telle autre instruction
javascript.
Nous allons essentiellement travailler à partir du même exemple initial, que nous ferons évoluer
pour s’initier aux différentes possibilités.
1. Exemple 1 : du code javascript « en dur » dans le script
Voici un premier exemple. Il est intéressant pour plusieurs raisons :
– c’est un « deux en un » : il fait à la fois office de formulaire initial, et de script d’exploitation ;
– il contient des instructions javascript écrites directement dans le code source de la page, sans
passer par du php.
La première fois que l’internaute demande l’affichage du formulaire, dans la barre d’adresse de
son navigateur, il tape : http ://localhost/scriptPartie4.php. Un formulaire vierge, à remplir, lui est
alors envoyé, généré par le script scriptPartie4.php.
Le script est écrit de manière à savoir tenir compte du fait que l’internaute l’utilise, dans un premier temps, comme un formulaire.
8 3951 TG PA 00
183
Séquence 3
Initiation à PhP
J’ai commenté le code afin que vous compreniez comment ça fonctionne :
<html>
<head>
<title> Demande de renseignements </title>
<script language = javascript>
function envoi(form)
{
form.submit();
}
</script>
</head>
<?
// cʼest seulement ici que le php commence
// on compte le nombre de champs de formulaires non renseignés ou inexistants
$nbVidesOuInexistants = 0;
// si lʼinternaute nʼa encore pas renvoyé le formulaire ou sʼil nʼa pas coché
dʼoption
// pour le sexe
if (!array_key_exists(ʻsexeʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
// si lʼinternaute vient dʼenvoyer sa première requête http concernant ce
formulaire, cʼest quʼil
// ne lʼa pas encore renvoyé,
// donc, la clé dateNaiss nʼexiste pas dans le tableau $_REQUEST
if (!array_key_exists(ʻdateNaissʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
// si, par contre, il a déjà renvoyé le formulaire, on vérifie sʼil a renseigné sa date de naissance
else if
($_REQUEST[ʻdateNaissʼ] == ʻʼ) $nbVidesOuInexistants += 1;
// cas où lʼinternaute a bien rempli et renvoyé son formulaire
if ($nbVidesOuInexistants == 0)
print ʻBien reçu <br>ʼ;
// on va dans le else si cʼest la première requête demandant le formulaire
vierge
// ou si lʼinternaute a mal renseigné certains champs du formulaire
else
{
printʼ<form name = ”formrep“ action = ”http://localhost/scriptPartie4.php“
method = ”get“>ʼ;
// si cʼest le sexe qui nʼa pas été renseigné...
if (!array_key_exists(ʻsexeʼ,$_REQUEST))
{
print ʻIndiquez votre sexe : <BR>ʼ;
print ʻH: <Input type = ”radio“ name = ”sexe“ value = ”h“>ʼ;
8 3951 TG PA 00
184
Séquence 3
Initiation à PhP
print ʻF: <Input type=“radio“ name = ”sexe“ value = ”f“> <br>ʼ;
}
else {
// si le sexe a été renseigné, on restitue ce qui a été saisi par
lʼinternaute
// en cochant lʼoption quʼil avait cochée
print ʻSexe : <BR>ʼ;
if ($_REQUEST[ʻsexeʼ] == ʻhʼ)
{
print ʻH: <Input type = ”radio“ name = ”sexe“ value = ”h“
checked>ʼ;
print ʻF: <Input type = ”radio“ name = ”sexe“ value = ”f“>
<br>ʼ;
}
else {
print ʻH: <Input type = ”radio“ name = ”sexe“ value = ”h“
>ʼ;
print ʻF: <Input type = ”radio“ name =“sexe“ value = ”f“
checked> <br>ʼ;
}
}
// fin traitement sexe
// si la date de naissance est inexistante
if (!array_key_exists(ʻdateNaissʼ,$_REQUEST))
print ʻIndiquez votre date de naissance : <Input type = ”date“
name = ”dateNaiss“ size = 8 > <br>ʼ;
// si lʼinternaute nʼa pas renseigné sa date de naissance
else if ($_REQUEST[ʻdateNaissʼ] == ʻʼ) // 2 simples quottes
print ʻIndiquez votre date de naissance : <Input type =
”date“ name = ”dateNaiss“ size = 8 > <br>ʼ;
else
print ʻDate de naissance : <Input type = ”date“ name =
”dateNaiss“ size = 8 value = ” ʻ.$_REQUEST[ʻdateNaissʼ].ʼ ”
> <br>ʼ;
// fin traitement date
// on rajoute le bouton submit
print ʻ<input type = ”BUTTON“ name = ”envoyer“ value = ”Envoyer“ OnClick
= ”envoi(this.form);“><br>ʼ;
print ʻ</form>ʼ;
}
print ʻ</html>ʼ;
?>
8 3951 TG PA 00
185
Séquence 3
Initiation à PhP
Pour tester, commencez par taper la requête http suivante dans la barre d’adresse de votre navigateur : http ://localhost/scriptPartie4.php.
Vous pouvez constater qu’en réponse, vous recevez un formulaire à remplir.
Par curiosité, affichez le code source de ce formulaire.
Vous pouvez constater deux choses :
– on a bien le code source de la fonction javascript ;
– le code html généré dynamiquement tient entièrement sur une seule ligne. On a bien mis
nos <br> pour que les composants soient les uns en dessous des autres dans le formulaire
généré, mais on n’a pas utilisé \n dans les instructions php, de façon à ce que le code
source généré dynamiquement soit propre. Dans votre script php, réparez cette erreur
afin que le code html généré soit présentable.
Voici le code source généré dynamiquement lors de l’envoi de la requête http :
http ://localhost/scriptPartie4.php…
<html>
<head>
<title> Demande de renseignements </title>
<script language = javascript>
function envoi(form)
{
form.submit();
}
</script>
</head>
<form name = ”formrep“ action = ”http://localhost/scriptPartie4.php“ method =
”get“>
Indiquez votre sexe : <BR>
H: <Input type = ”radio“ name = ”sexe“ value = ”h“>
F: <Input type=“radio“ name = ”sexe“ value = ”f“> <br>
Indiquez votre date de naissance : <Input type = ”date“ name = ”dateNaiss“
size = 8 > <br>
<input type = ”BUTTON“ name = ”envoyer“ value = ”Envoyer“ OnClick =
”envoi(this.form);“><br>
</form>
</html>
Maintenant, pour tester la réaction de notre script, cocher une des options concernant le sexe,
mais ne renseignez pas la date de naissance, puis cliquez sur Envoyer.
Voici ce qui est envoyé au script :
http://localhost/scriptPartie4.php?sexe=f&dateNaiss=.
En réponse, le script nous renvoie un formulaire où il nous demande de saisir une date de naissance.
8 3951 TG PA 00
186
Séquence 3
Initiation à PhP
Affichez le code source du formulaire que vous avez reçu.
Vous pouvez constater que la partie variable du formulaire, celle qui a changé par rapport au
formulaire issu de la première requête http, c’est la partie générée dynamiquement à l’aide de
tests en php.
Enfin, pour terminer ce test, renseignez la date de naissance et cliquez sur Envoyer.
Vous recevez, en réponse, une page affichant le message Bien reçu.
Affichez également le code source de cette page. Il est encore différent.
Vous avez pu observer trois versions d’un formulaire, générées par notre script scriptPartie4.php.
Maintenant, nous allons faire en sorte, dans le deuxième exemple, que les instructions javascript
fassent aussi partie de la partie variable du formulaire.
2. Exemple 2 : présence conditionnelle de javascript dans
la page générée
Je veux faire évoluer l’exemple précédent, en faisant le constat suivant.
Il est inutile de créer la fonction envoi lorsque l’internaute a bien renseigné toutes les zones.
Nous n’allons donc écrire cette fonction que si certaines zones sont vides ou inexistantes.
Je reprends le script précédent et je le modifie comme ci-dessous (j’ai mis en gras les nouveautés).
<html>
<head>
<title> Demande de renseignements </title>
<?
// on compte le nombre de champs de formulaires non renseignés
$nbVidesOuInexistants = 0;
if (!array_key_exists(ʻsexeʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
if (!array_key_exists(ʻdateNaissʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
else if
($_REQUEST[ʻdateNaissʼ] == ʻʼ) $nbVidesOuInexistants += 1;
if ($nbVidesOuInexistants == 0)
{
print ʻBien reçu <br>ʼ.“\n“;
// on ferme la balise head seulement ici
print ʻ</head>ʼ;
}
else
{
print ʻ<script language = javascript>ʼ.“\n“;
print ʻfunction envoi(form)ʼ.“\n“;
print ʻ{ʻ.»\n».ʼform.submit();ʼ.“\n“.ʼ}ʼ.“\n“;
8 3951 TG PA 00
187
Séquence 3
Initiation à PhP
print ʻ</script>ʼ.“\n“;
// on ferme la balise head seulement ici
print ʻ</head>ʼ.“\n“;
printʼ<form name = “formrep“ action = «http://localhost/scriptPartie4.php“
method = “get“><br>ʼ.“\n“;
// si cʼest le sexe qui nʼa pas été renseigné ...
if (!array_key_exists(ʻsexeʼ,$_REQUEST))
// la suite du script ne change pas
Vous voyez qu’ici, on a écrit les instructions javascript dans des instructions print. On a fait comme
pour les balises html.
Testez cette version de la façon suivante :
– envoyez une requête http ://localhost/scriptPartie4.php ;
– regardez le code source de ce qui nous est renvoyé, notre fonction y figure en bonne
place ;
– ensuite, renseignez bien le sexe et la date de naissance ;
– cliquez sur Envoyer ;
– regardez le code source de la page qui vous est renvoyée en réponse, la fonction javascript
n’y figure pas.
Voilà un exemple d’écriture conditionnelle d’instructions javascript.
On pourrait aussi provoquer des écritures itératives d’instructions javascript !!
Je souhaite maintenant faire évoluer une dernière fois cet exemple en faisant en sorte que les
instructions javascript ne soient pas toujours les mêmes selon la situation. On va prendre un cas
simple.
3. Exemple 3 : instructions javascript variant selon la
situation
Disons que nous allons faire évoluer la version précédente de notre script de la façon suivante :
quand l’internaute oublie de renseigner la date, on lui affiche Cette fois, pensez à bien renseigner
votre date de naissance, et quand il a oublié de cocher un des deux sexes, on lui affiche N’oubliez
pas de renseigner le sexe.
C’est simpliste, mais ça vous permettra de voir que même les instructions javascript peuvent être
générées de façon conditionnelle.
Voici ci-dessous un début de solution, qui, je vous préviens tout de suite, ne fonctionne pas, mais
on va voir ensemble pourquoi. Comme d’habitude, j’ai mis en gras les changements.
<html>
<head>
<title> Demande de renseignements </title>
<!-- on remet la balise head en haut, car son écriture ne peut pas survenir
après ouverture de la balise <form>-->
</head>
8 3951 TG PA 00
188
Séquence 3
Initiation à PhP
<?
// on compte le nombre de champs de formulaires non renseignés
$nbVidesOuInexistants = 0;
if (!array_key_exists(ʻsexeʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
if (!array_key_exists(ʻdateNaissʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
else if
($_REQUEST[ʻdateNaissʼ] == ʻʼ) $nbVidesOuInexistants += 1;
if ($nbVidesOuInexistants == 0)
print ʻBien reçu <br>ʼ.“\n“;
else
{
printʼ<form name = “formrep“ action = “http://localhost/scriptPartie4.php“
method = “get“><br>ʼ.“\n“;
// si cʼest le sexe qui nʼa pas été renseigné ...
if (!array_key_exists(ʻsexeʼ,$_REQUEST))
{
print ʻ<script language = javascript>ʼ.“\n“;
print ʻfunction envoi(form)ʼ.“\n“;
print ʻ{ʻ.“\n“;
print ʻalert(“N\ʼoubliez pas de renseigner votre sexe!“);ʼ.“\n“;
print ʻform.submit();ʼ.“\n“.ʼ}ʼ.“\n“;
print ʻ</script>ʼ.“\n“;
print ʻIndiquez votre sexe : <BR>ʼ.“\n“;
print ʻH: <Input type = “radio“ name = “sexe“ value = “h“>ʼ.“\n“;
print ʻF: <Input type=“radio“ name = “sexe“ value = “f“> <br>ʼ.“\
n“;
}
else {
// si le sexe a été renseigné, on restitue ce qui a été saisi par
lʼinternaute
// en cochant lʼoption quʼil avait cochée
print ʻSexe : <BR>ʼ.“\n“;
// etc…la suite ne change pas pour lʼinstant
Allez, on teste.
À la première requête http://localhost/scriptPartie4.php, tout se passe bien, le formulaire s’affiche correctement.
Quand on regarde le code source de ce formulaire, on voit notre fonction :
<html>
<head>
<title> Demande de renseignements </title>
<!-- on remet la balise head en haut, car son écriture ne peut pas survenir
8 3951 TG PA 00
189
Séquence 3
Initiation à PhP
après ouverture de la balise <form>-->
</head>
<form name = “formrep” action = “http://localhost/scriptPartie4.php” method =
“get”><br>
<script language = javascript>
function envoi(form)
{
alert(“Nʼoubliez pas de renseigner votre sexe!”);
form.submit();
}
</script>
Indiquez votre sexe : <BR>
H: <Input type = “radio” name = “sexe” value = “h”>
F: <Input type=”radio” name = “sexe” value = “f”> <br>
Indiquez votre date de naissance : <Input type = “date” name = “dateNaiss”
size = 8 > <br>
<input type = “BUTTON” name = “envoyer” value = “Envoyer” OnClick =
“envoi(this.form);”><br>
</form>
</html>
Pour tester, je saisis une valeur dans la date de naissance et je clique sur Envoyer.
Je vois bien le message N’oubliez pas de renseigner votre sexe ! S’afficher.
Je clique sur OK et ça fonctionne.
Je recommence le test depuis le début, mais cette fois, lors de la saisie des informations dans le
formulaire qui m’a été envoyé, je renseigne le sexe, mais pas la date de naissance, je clique sur
Envoyer, et cette fois, crac, j’ai une erreur javascript.
Regardons le code source :
<html>
<head>
<title> Demande de renseignements </title>
<!-- on remet la balise head en haut, car son écriture ne peut pas survenir
après ouverture de la balise <form>-->
</head>
<form name = “formrep” action = “http://localhost/scriptPartie4.php” method =
“get”><br>
Sexe : <BR>
H: <Input type = “radio” name = “sexe” value = “h” >
F: <Input type = “radio” name =”sexe” value = “f” checked> <br>
Indiquez votre date de naissance : <Input type = “date” name = “dateNaiss”
size = 8 > <br>
8 3951 TG PA 00
190
Séquence 3
Initiation à PhP
<input type = “BUTTON” name = “envoyer” value = “Envoyer” OnClick =
“envoi(this.form);”><br>
</form>
</html>
Ah !! Évidemment !!
J’appelle une fonction envoi, dans l’événement OnClick de mon bouton, mais cette fonction
n’existe pas puisqu’elle n’est générée que lorsque l’internaute ne renseigne pas son sexe !!
Bon, alors on n’a pas le choix, on ne peut pas écrire cette fonction au fur et à mesure qu’on construit le formulaire à renvoyer à l’internaute.
On doit la construire avant la construction du formulaire, de manière conditionnelle :
head>
<title> Demande de renseignements </title>
<!-- on remet la balise head en haut, car son écriture ne peut pas survenir
après ouverture de la balise <form>-->
</head>
<?
// on compte le nombre de champs de formulaires non renseignés
$nbVidesOuInexistants = 0;
if (!array_key_exists(ʻsexeʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
if (!array_key_exists(ʻdateNaissʼ,$_REQUEST)) $nbVidesOuInexistants += 1;
else if
($_REQUEST[ʻdateNaissʼ] == ʻʼ) $nbVidesOuInexistants += 1;
if ($nbVidesOuInexistants == 0)
{
print ʻBien reçu <br>ʼ.”\n”;
}
else
{
print ʻ<script language = javascript>ʼ.”\n”;
print ʻfunction envoi(form)ʼ.”\n”;
print ʻ{ʻ.”\n”;
print ʻalert(“N\ʼoubliez pas de renseigner votreʼ;
// on continue ici lʼinstruction alert quʼon avait commencé à créer cidessus
if (!array_key_exists(ʻsexeʼ,$_REQUEST)) print ʻ sexe!”);ʼ.”\n”;
else printʼ date de naissance.”);ʼ.”\n”;
print ʻform.submit();ʼ.”\n”.ʼ}ʼ.”\n”;
print ʻ</script>ʼ.”\n”;
printʼ<form name = “formrep” action = “http://localhost/scriptPartie4.php”
method = “get”><br>ʼ.”\n”;
8 3951 TG PA 00
191
Séquence 3
Initiation à PhP
// si cʼest le sexe qui nʼa pas été renseigné ...
if (!array_key_exists(ʻsexeʼ,$_REQUEST))
{
print ʻIndiquez votre sexe : <BR>ʼ.”\n”;
print ʻH: <Input type = “radio” name = “sexe” value = “h”>ʼ.”\n”;
print ʻF: <Input type=”radio” name = “sexe” value = “f”> <br>ʼ.”\
n”;
}
else { // Etc… la suite du script ne change pas
Voilà. Pour tester, comme d’habitude, testez une fois en renseignant le sexe mais pas la date de
naissance, regardez le code source de ce qui vous est renvoyé.
Puis recommencez le test en renseignant la date de naissance et pas le sexe, et regardez à nouveau le code source de la page qui vous est renvoyée.
Vous pouvez constater que le code source de la fonction envoi est adapté à la situation.
Je vous laisse le soin de rajouter du SQL dans votre script, cela ne change rien aux manipulations
javascript que l’on vient de faire.
Notre partie 4 est donc terminée, et comme c’était la dernière partie de cette séquence sur php,
cela signifie que nous avons terminé l’initiation à php, qui était le gros morceau de ce support
de cours.
Nous allons maintenant aborder les feuilles de style, dans la séquence suivante et enfin, pour
terminer cette initiation à la programmation web, nous ferons un petit bout de xml.
8 3951 TG PA 00
192