PHP : Le tutoriel pour grands débutants pressés

Sylvie Vauthier

Ce tutoriel, comme son nom l'indique, est intégralement conçu pour des grands débutants pressés.

Appelons grand débutant celui qui n'a jamais programmé ni entamé aucune initiation sur les notions générales de la programmation.
Nous ambitionnons donc de satisfaire ce public, s'il est prêt à travailler régulièrement et à y consacrer une semaine intensive, par exemple...

Mais bien entendu, qui peut le plus peut le moins !

Aussi ce tutoriel ne devrait pas rebuter l'informaticien qui connaît déjà un ou plusieurs autres langages, mais souhaiterait se mettre à PHP,
langage devenu incontournable pour la programmation web.
Ce lecteur-là pourra parcourir à son rythme le tuto qui suit et y trouver réponses à ses questions...

Dans tous les cas, bonne lecture !

Commentez

- Titre : PHP : Le tutoriel pour grands débutants pressés

- Auteur : Sylvie Vauthier

- Parution : 1 février 2009

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2009 VAUTHIER Sylvie. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. PHP ETAPE 1 : INTRODUCTION

- I-0. Les pré-requis

- I-0-a. Ce qu'il vous faut connaître

- I-0-b. Ce qu'il vous faut installer

- I-0-b-a. Si vous êtes sous Windows

- I-0-b-b. Si vous êtes sur Mac

- I-0-b-c. Si vous êtes sous Linux

- I-0-c. Et c'est tout pour ce tutoriel !

- I-1. Que fait PHP ?

- I-2. Quand PHP intervient-il ?

- I-3. Un zeste d'algorithmique

- I-3-a. Tout d'abord le concept de variable

- I-3-b. La programmation

- I-3-c. L'instruction en boucle

- I-3-d. L'instruction en condition

- I-3-e. Pour conclure sur la programmation

- I-4. TP1

- I-5. Correction du TP1

- II. PHP ETAPE 2

- II-1. Comment ça marche ?

- II-2. Les variables

- II-3. echo

- II-4. Guillemets ou Apostrophes ?

- II-4-a. Ce que je ne conseille pas

- II-4-b. Ce que je conseille

- II-5. TP2

- II-6. Correction du TP2

- III. PHP ETAPE 3

- III-1. Les formulaires

- III-2. La syntaxe de la condition if

- III-3. Les formulaires, suite

- III-4. Les formulaires, fin

- III-5. TP3

- III-6. Correction du TP3

- IV. PHP ETAPE 4

- IV-1. Les tableaux simples

- IV-2. Les commentaires

- IV-3. Les tableaux associatifs

- IV-4. La boucle foreach

- IV-5. Boucle foreach et variables POST

- IV-6. TP4

- IV-7. Correction du TP4

- V. PHP ETAPE 5

- V-1. Les opérateurs

- V-2. Les fonctions

- V-2-a. Les fonctions dans la page

- V-2-b. Plusieurs paramètres passés à la fonction

- V-2-c. Les fonctions dans un fichier à part

- V-2-d. Fonction qui renvoie une valeur de retour

- V-3. La boucle for

- V-4. La commande switch

- V-5. TP5

- V-6. Correction du TP5

- VI. PHP ETAPE 6

- VI-1. Les bases de données : introduction

- VI-1-a. A quoi ça sert ?

- VI-1-b. Comment ça marche ?

- VI-2. Alimenter sa base via PHP

- VI-2-a. Présenter le formulaire

- VI-2-b. Se connecter à notre base via PHP

- VI-2-c. Pour travailler proprement (Généralités)

- VI-2-d. Insérer des données dans notre base via PHP

- VI-2-e. On récapitule le code ?

- VI-3. TP6

- VI-4. Correction du TP6

- VII. PHP ETAPE 7

- VII-1. Les bases de données : suite et fin

- VII-1-a. Pour travailler proprement (Généralités)

- VII-1-b. Le code pour récupérer toutes les filles

- VII-2. Un exemple (plus complexe) de relation dynamique entre PHP et SQL

- VII-3. TP7

- VII-4. Correction du TP7

- VIII. PHP ETAPE 8 : CONCLUSION

- VIII-1. En guise de conclusion

- VIII-1-a. PHP, un langage qui ne peut pas tout

- VIII-1-b. Conceptualisation d'un projet PHP

- VIII-2. Quelques réflexes pour progresser en PHP

- VIII-3. TP8

- VIII-4. Correction du TP8

- VIII-5. Mes liens favoris pour l'apprentissage du développement web

- VIII-5-a. Les tutos et cours Developpez.com

- VIII-5-b. D'autres tutos et cours qui m'ont beaucoup appris

- VIII-6. Remerciements

I - PHP ETAPE 1 : INTRODUCTION

I-0 - Les pré-requis

I-0-a - Ce qu'il vous faut connaître

Pour profiter de ce tutoriel PHP pour grand débutant pressé, il faut répondre aux critères suivants :

a) Connaître le langage d'affichage HTML dans les grands principes...
Si ça n'est pas le cas, commencez par là. (Voir liste tutos recommandés sur la question dans le chapitre conclusion de ce cours)

b) Posséder un ordinateur et une connexion internet

I-0-b - Ce qu'il vous faut installer

I-0-b-a - Si vous êtes sous Windows

a) Wamp server 2 : un environnement (gratuit bien sûr) qui vous permettra de programmer PHP en local...

http://www.wampserver.com/

b) Notepad++

Un éditeur de texte (gratuit aussi) qui colore automatiquement le code que l'on entre en fonction de la logique de votre langage informatique, ce qui vous permettra une relecture facile... Cette aide indispensable s'appelle la coloration syntaxique.

http://notepad-plus.sourceforge.net/fr/site.htm

I-0-b-b - Si vous êtes sur Mac

Equivalent Wamp server

http://www.mamp.info/en/mamp.html

Equivalent Notepad++

http://tuppis.com/smultron

I-0-b-c - Si vous êtes sous Linux

Equivalent Wamp server

http://doc.ubuntu-fr.org/lamp

Equivalent Notepad++

http://bluefish.openoffice.nl/download.html

I-0-c - Et c'est tout pour ce tutoriel !

Pour le reste, on va essayer d'avancer, même si vous n'avez jamais programmé.
Ce tuto ne prétend pas être un topo savant et encore moins exhaustif : c'est une initiation, une première couche de peinture, indispensable pour faire vos premiers pas dans PHP, voire dans la programmation sans trop de souffrance, et pour que les couches suivantes tiennent.

Il se découpe en 8 étapes, avec des travaux pratiques. Il est bien évident que si vous êtes un grand débutant et que vous ne faites pas les travaux pratiques vous-mêmes, tout ce que vous lirez vous sortira par la tête aussi vite que c'est entré.

Il est donc recommandé, pour les grands débutants bien évidemment, de travailler un jour par étape, et de faire les travaux pratiques, pas simplement de se précipiter sur les réponses.

Amusez-vous bien durant votre semaine d'apprentissage !

I-1 - Que fait PHP ?

Vous avez de bonnes notions de HTML et CSS, vous savez donc que ces deux langages ne sont pas des langages de programmation, mais des langages de simple affichage statique.

Facile d'afficher pour vous une page web qui dit : "bonjour, on est lundi." Le seul souci, c'est que l'on sera toujours lundi sur votre page...

Pas très dynamique tout ça. C'est là qu'intervient PHP qui est un langage de programmation web.

Il produit du code HTML.

En quoi est-il utile ?

Parce que le code HTML que produit PHP change en fonction des circonstances que vous avez programmées. On dira qu'il introduit du dynamisme dans la page web.

I-2 - Quand PHP intervient-il ?

Le code PHP que vous avez inséré dans vos pages agit à chaque chargement (et donc rafraîchissement) de page web. Ceci pour relativiser son "dynamisme".
L'interactivité avec l'utilisateur se limite à certaines actions de l'utilisateur.

Un rafraîchissement de page, c'est par exemple le clic de l'utilisateur sur le bouton 'submit' inclus dans une balise form, ou bien une première arrivée sur une page web.

I-3 - Un zeste d'algorithmique

Il faut enfin aborder dans cette introduction quatre notions clés de la programmation.

I-3-a - Tout d'abord le concept de variable

Un exemple suffira. On a tous eu entre les mains une publicité faussement personnalisée du type :

"Bonjour Madame Michu
Vous avez gagné notre canapé extra-cuir lors du tirage du 20/12/2008."

Il est clair que l'entreprise qui envoie cette pub possède une base de données avec des tas de noms. Et que c'est un programme automatique qui stocke les valeurs de Madame, de Michu, et la date dans des variables. Le reste est du texte figé. On va dire que civilité, nom et date sont des variables...

I-3-b - La programmation

Autre chose, programmer, c'est donner une suite d'instructions à la machine. Exactement comme l'on construirait une recette de cuisine. Sauf que l'on écrit la recette à l'usage d'une machine qui ne comprend que le binaire et qu'une instruction à la fois. On avance, on avance, instruction par instruction, de façon linéaire.

Dans la structure du programme, deux types de construction peuvent s'éloigner de cette linéarité :

I-3-c - L'instruction en boucle

On a une action affreusement répétitive. Du genre, découpe les trois plaques de chocolat en carrés individuels. En programmation, on ne va pas dire 150 fois, détache le carré de chocolat, détache le carré de chocolat, détache le carré de chocolat...

Alors on va faire ce que l'on nomme une boucle (il y en a de plusieurs sortes), du genre :

Boucle tant que

tant qu'il y a une plaquette de chocolat{
détache le carré de chocolat
}

Une boucle parce que le programme lit la condition, entre dans la boucle après la première accolade (si la condition est vraie) et "boucle" tant que la condition est vraie...

I-3-d - L'instruction en condition

On a une condition. Restons sur notre recette de mousse au chocolat.

Si j'ai 6 gourmands, je casse 8 oeufs, si j'ai 6 personnes au régime, je casse 4 oeufs, mais par défaut, une bonne mousse, c'est 6 oeufs pour 6...

Conditions qui s'excluent l'une l'autre

Sors le plat.
si gourmand{
casse 8 oeufs
}
sinon si régime{
casse 4 oeufs
}
sinon{
casse 6 oeufs
}
Bien mélanger...

Cette fois, vous comprendrez que le cheminement logique linéaire se sépare en trois voies parallèles, un peu comme des rails, puis se regroupe à nouveau à la fin.
Le programme ne doit passer que par une et une seule des trois voies.

I-3-e - Pour conclure sur la programmation

Programmer, c'est finalement ramener toute problématique à l'une des trois possibilités suivantes :
- une instruction qui s'exécute automatiquement,
- une instruction qui s'exécute autant de fois que nécessaire dans une boucle,
- une instruction qui s'exécute dans une condition.

Ajouté à tout cela un certain nombre de variables que l'on manipule joyeusement...
Et vous avez les grandes lignes de la programmation.

I-4 - TP1

Selon la méthode que vous venez de lire, pourriez-vous tracer la structure générale du programme qui gère la distribution de carburant d'une pompe à essence automatisée qui ne distribuerait que ces trois carburants : Diesel, Super, et GPL ?

Attachez-vous à la logique suivante : telle action de l'utilisateur : telle partie du programme s'enclenche...

Disons que ça commencerait ainsi :

//commentaire : affichage permanent
affiche 'Merci d'avoir choisi Vroum-Vroum !
Choisissez votre carburant :
Gazole, SuperSP ou GPL ?';

Si réponse{
recueille carburant choisi
//etc. etc.
}

I-5 - Correction du TP1

Retenez déjà que dans toutes les propositions de correction, il y a toujours plusieurs possibilités, celle-ci n'est qu'un exemple.

Vous pourrez également vous imprégner de cette idée : ça n'est pas simple de penser à tout à la place d'une machine !

Ca exige des trésors de rigueur et de patience ! Mais bon, ça devient vite passionnant.

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

Distributeur automatique de carburant

//affichage permanent
affiche 'Merci d'avoir choisi Vroum-Vroum !
Choisissez votre carburant :
Gazole, SuperSP ou GPL ?';

//réaction quand il y a utilisateur
Si réponse {
recueille carburant_choisi;
affiche 'Entrez votre carte bleue';
tantque info carte bleue pas entrée{
affiche 'Entrez votre carte bleue';
}
Sinon si info carte bleue entrée {
affiche 'Entrez votre code';
tant que code pas entré ou pas bon{
affiche 'Entrez votre code';
}
Sinon si code bon{
affiche 'Vous pouvez vous servir en ';
affiche carburant_choisi;

//Pour la suite, initialisation de ma variable nb_litres
nb_litres=0;

//Réaction quand utilisateur décroche le pistolet
Si user a décroché robinet{

si réponsechoisie="Gazole"{
prix_au_litre=1.12;
}
sinonsi réponsechoisie="SuperSP"{
prix_au_litre=1.21;
}
//réponsechoisie="GPL", le dernier cas par défaut
sinon{
prix_au_litre=0.69;
}
tantque robinet coule{
//le compteur tourne
nb_litres=nb_litres+1;

prix_temporaire=nb_litre * prix_au_litre;
affiche prix_temporaire;
}
}
//quand on arrive à cette ligne du programme, user a raccroché le pistolet
prix_total=prix_temporaire;
débite le prix total de son compte;
affiche 'Merci, et à la prochaine fois chez Vroum-Vroum !';
}
}

II - PHP ETAPE 2

II-1 - Comment ça marche ?

L'ossature de toute page HTML

<html>
<head>
<title>Ma page de test</title>
</head>
<body>
<h1>Bienvenue sur le site de toto </h1>
<p>Le blabla de ma page...</p>
</body>
</html>

Voici une page HTML bien traditionnelle comme on les aime.
Copiez-collez en le contenu dans votre éditeur de texte notepad++.
Enregistrez et nommez-la test.html

Vous remarquerez que le code de la page se colore de façon syntaxique, ce qui le rend bien plus compréhensible. C'était l'intérêt de vous faire télécharger cet éditeur de texte.
Vous apprécierez beaucoup dès que l'affaire se corsera.

Pour l'instant, enregistrez ce fichier sur votre bureau, fermez notepad++, et double-cliquez maintenant directement sur votre fichier test.html, cela vous ouvrira une page web comme si vous étiez sur internet... Pourtant, vous n'y êtes pas, sur internet. Vous êtes "en local", bref, sur votre ordi, et vous ne faites que voir votre fichier à la façon d'une page web.

Rouvrez maintenant l'éditeur de texte et copiez/collez le bout de code suivant dans lequel on a introduit des balises PHP.

test.php contient des balises PHP

<html>
<head>
<title>Ma page d'accueil </title>
</head>
<body>
<h1>Bienvenue sur le site de toto </h1>
<p> Toto fait de l'anglais :</p>
<?php
echo '<p>Hello ! What is the day today ? It is '.date("l").' !</p>';
?>
</body>
</html>

Quand vous l'enregistrez, sur votre bureau, renommez-le test.php, (changez l'extension de .html en .php).
Ainsi, le serveur php est avisé que cette page contient du code PHP (que le navigateur ne sait pas afficher en ce qui le concerne).

Fermez votre éditeur. Double-cliquez directement sur votre page test.php : Quelle déception !
Cela ne vous ouvre pas une page web mais... le code que vous venez de quitter, sous un éditeur de texte qui est probablement bloc-notes sans coloration syntaxique.
(Au passage, profitez-en pour paramétrer votre ordi pour ouvrir notepad++ par défaut pour les fichiers PHP)...

C'est ici que le fait d'avoir installé WampServer sur votre machine va vous être utile. En effet, il vous faut un interpréteur PHP installé en local.

Ouvrez votre serveur wamp. Une fois démarré, cliquez sur son icône dans la barre d'état à droite, une sorte de demi-sphère jaune, un peu comme un demi-pamplemousse.
Choisissez www directory.

Dans la fenêtre qui s'ouvre, crééz un dossier PHP et glissez-y votre fichier test.php.

Vous passerez toujours par cette icône "pamplemousse" pour accéder à vos fichiers.

Cliquez maintenant sur cette icône, puis sur localhost. Dans la fenêtre qui s'ouvre, rubrique vos projets, ouvrez le dossier PHP...
Cliquez sur votre fichier test.php et admirez le travail... Le jour affiché en anglais, date qui sera toujours à jour...

Cliquez affichage/source sur votre navigateur : Vous pouvez constater qu'il n'y a plus trace de PHP, il ne reste que du code HTML...

Voici rapidement ce qui se passe à chaque rafraichissement :

le serveur PHP va droit aux fichiers qui ont une extension PHP, puis il va droit aux balises PHP de ce fichier, et interprète ce qu'il y a dedans :
ici, il affiche (echo) tout ce qui est entre parenthèses, puis concatène ou colle si vous voulez (le point) le résultat de la fonction date qui renvoie le jour en anglais...

Il a donc interprété du PHP pour le traduire en HTML.
Ensuite, il repasse le fichier au navigateur, qui lui ne sait afficher QUE du HTML (ou du CSS)... et bien ça tombe bien, il ne voit que du HTML dorénavant...

Mais si vous revenez demain sur cette page, la fonction date affichera un autre jour dans le HTML. Voici pour l'aspect technique.

Pour la prise en main de Wamp, ne retenez que ceci pour l'instant :

Prise en main de Wamp

1. Quand vous voulez retrouver votre code : icône puis wwwdirectory et PHP/votre fichier...

2. Quand vous voulez voir le produit de votre travail, bref, tester votre code : icône puis localhost, répertoire PHP et votre fichier...

Ca deviendra vite un réflexe...

Maintenant que tout tourne, notre première étape portera sur les variables et sur la structure echo qui signifie donc affiche et que l'on utilise en permanence...
Voici quelques exemples... que vous testerez en les rajoutant sur votre fichier au sein des balises PHP bien entendu.

II-2 - Les variables

$ devant une chaîne de caractères signifie que nous parlons d'une variable, on la nomme comme on veut ensuite, mais jamais d'accent ni d'espace dans un nom de variable.
Une variable est typée : elle peut prendre 4 types (dans l'ordre ci-dessous) :

Les types des variables

- string (chaîne de caractères)

- integer (nombre entier)

- bool (booléen qui signifie logique binaire genre vrai ou faux)

- float (nombre réel)

syntaxe des variables

<?php
$nom='Mickaël';
$age=17;
$gars=true;
$taille=1.75;
?>

Étudiez bien chaque détail

- Toutes les instructions (toutes) se terminent par un point virgule.

- Seule la variable string exige les guillemets (simples ou doubles, préférez les apostrophes pour l'instant, nous verrons pourquoi un peu plus loin)...

- La booléenne prend la valeur true, mais sans guillemets, elle a pour contraire... false.

- Le nombre réel prend un point à l'anglo-saxonne et non une virgule...

N'hésitez pas à personnaliser ces exemples et à les triturer en en changeant les données pour les assimiler.

II-3 - echo

Bien maintenant que nous avons défini le type des variables en même temps que nous leur avons affecté une valeur, affichons les grâce à echo, dans un environnement HTML :

syntaxe de la commande echo

<?php
echo'<p>Bonjour à tous.<br/>
Mon vrai nom n\'est pas Toto.<br/>
Mon vrai nom est '.$nom.'<br/>
J\'ai '.$age.' ans et je mesure '.$taille.'m.<br/>
Et comme mon nom l\'indique, je suis ';
if ($gars==true){
echo 'un garçon.</p>';
}
else{
echo 'une fille. </p>';
}
?>

Commentaires sur cette instruction echo :

Ici je n'ai fait que deux instructions 'affiche' : Une automatique, et une conditionnelle.

Vous remarquerez que je suis allée à la ligne au sein de l'affichage grâce à la balise br/. Vous remarquerez que toutes les apostrophes qui sont seulement du texte ont été neutralisées en plaçant \ devant chacune d'elle pour qu'elles ne soient pas considérées comme la fin de la chaîne de caractères.

Vous remarquerez que l'affichage du contenu de la variable se fait automatiquement, en mettant la variable nue dans le code.

Vous remarquerez que le point sert à concaténer (ou coller du texte bout à bout).

Il vous faut gérer les espaces à l'affichage au sein des guillemets. Ici la coloration syntaxique devient indispensable.

Enfin vous remarquerez que ma condition (si c'est un garçon ou une fille), bien qu'écrite à la ligne dans mon code et ouvrant une seconde instruction echo, s'affiche tout de même dans la continuité de mon précédent echo...

Autrement dit, c'est toujours au niveau du code HTML que se gèrent les retours à la ligne de l'affichage (balises br/, balises p ou autres).
Les retours à la ligne que vous faites spontanément dans votre code PHP après chaque instruction ne sont que des retours à la ligne à destination du programmeur pour une meilleure lisibilité de son code.

Dernière remarque : Prenez bien l'habitude de savoir à quel niveau vous êtes : au niveau du méta-langage PHP ou bien au niveau du code HTML qui aboutit à un affichage.

II-4 - Guillemets ou Apostrophes ?

II-4-a - Ce que je ne conseille pas

Si vous êtes un peu flemmard, vous trouverez bien pratique de savoir que les guillemets "" (contrairement aux guillements simples ou apostrophes) permettent ceci en PHP:

Le guillemet double permet ce code raccourci

<?php
$age=18;
//Ceci affichera directement
//J'ai 18 ans.
echo"J'ai $age ans.";
?>

Alors vous allez peut-être trouver cela un peu tordu d'utiliser les guillemets simples pour PHP du coup, puisque l'exemple ci-dessus règle en un seul coup de cuiller à pot le problème de l'interprétation directe de la variable et le problème de l'apostrophe du texte "J'ai"...

Pourtant, je pense que vous devrez procéder de façon plus rigoureuse si vous êtes amené à continuer avec PHP, aussi je vous prie d'adopter la convention suivante, pour ce tuto du moins :

II-4-b - Ce que je conseille

A l'avenir, vous allez fréquemment produire du HTML avec votre code PHP, puisque c'est sa fonction essentielle. Ainsi en adoptant la convention suivante, vous saurez toujours si vous êtes au niveau de PHP ou bien de HTML.

Gestion des apostrophes et des guillemets recommandée

<?php
echo'<div class="contenu">blablabla</div>';
?>

Quand vous utilisez un ' : on est au niveau de PHP.
Quand vous utilisez un " : on est au niveau du HTML.

Pour la clarté de vos idées, je conseille donc ceci :

Un code logique

<?php
$age=18;
echo'J\'ai '.$age.' ans.';
?>

Bien sûr, il vous restera du coup à avoir le réflexe :

Attention, dans le contenu de mon HTML, entre deux balises, si j'ai une apostrophe dans mon texte (ce qui revient somme toute assez rarement) :
il faut que je pense au caractère d'échappement.

Mais ça ne devrait pas poser de problème majeur, toutes les phrases ne contenant pas autant d'apostrophes que dans l'exemple ci-dessous...

Une apostrophe ne fait pas le printemps

<?php
echo'<div class="contenu">L\'hirondelle vole à tire d\'ailes vers l\'Europe du Nord : L\'hiver s\'éteint.</div>';
?>

II-5 - TP2

Pour vos premiers travaux pratiques, vous programmerez ceci :
A partir d'une page vierge de notepad++ et sans copier-coller, vous ferez la page emploi.php qui devra afficher ceci :

Bien entendu les données suivantes : 2000, L'informatique, et 11.5 ainsi que mon option (dans laquelle je travaille ou souhaite travailler) sont des variables car on peut les modifier à souhait.
Vous prendrez soin de les afficher en gras, ces variables...

Bon courage... Et interdiction de courir à la solution au premier échec.

Lisez bien les messages d'erreur, ils indiquent la ligne à modifier (ou parfois la ligne du dessus).
Il est inévitable de faire beaucoup d'erreurs de ce type au début...
Donc patience, relisez le cours, mais ne venez à la solution que quand votre code produit quelque chose de satisfaisant et sans copier/coller.

II-6 - Correction du TP2

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

emploi.php

<html>
<head><title>Ma page d'accueil </title></head>
<body>
<h1>BONJOUR </h1>
<?php
//Initialisation des variables
$travail='L\'informatique';
$salaire=2000;
$etude=false;
$bac=11.5;
//affichage
echo'Le salaire auquel j\'aspire pour bien vivre : <b>'.$salaire.'</b>€<br/>
La branche dans laquelle je travaille ou souhaiterais travailler : <b>'.$travail.'</b><br/>
Pour préciser : <b>'.$travail.'</b>';
if ($etude==true){
echo' <b>est la branche dans laquelle je souhaiterais travailler.</b><br/>';
}
else{
echo' <b>est la branche dans laquelle je travaille.</b><br/>';
}
echo'La note moyenne que j\'ai obtenue au bac : <b>'.$bac.'</b>';
?>
</body>
</html>

III - PHP ETAPE 3

Pour l'instant, on a manipulé des variables que l'on entrait "à la main" soi-même.
Il nous faut maintenant voir comment manipuler véritablement des variables, entrées par l'utilisateur.

III-1 - Les formulaires

Vous le savez, un formulaire en HTML, c'est la suite de balises suivante :

un formulaire typique sur la page saisie.php

<form name="inscription" method="post" action="saisie.php">
Entrez votre pseudo : <input type="text" name="pseudo"/> <br/>
Entrez votre ville : <input type="text" name="ville"/><br/>
<input type="submit" name="valider" value="OK"/>
</form>

Ici, ce formulaire présente une zone de saisie pour entrer son pseudo, va à la ligne, une zone de saisie pour entrer sa ville, va à la ligne, et enfin un bouton pour valider sur lequel sera écrit 'OK'...

Le but, vous l'aurez compris, c'est de récupérer, via PHP, les infos entrées par n'importe quel usager.

Voici comment les choses vont se découper :

Les attributs dans la balise form précisent le nom du formulaire, puis précisent que les variables contenues dans ce formulaire seront envoyées par la méthode POST (au moment où l'utilisateur cliquera sur le bouton "submit") à la page saisie.php (disons que c'est notre page de départ, oui, celle où il y a le formulaire)...

Quelles variables y aura-t-il, que comporteront-elles et surtout, quels noms porteront ces variables ?

Il y aura la variable $_POST['pseudo'], qui constitue le texte entré dans la zone pseudo par l'utilisateur avant d'avoir cliqué sur submit...
Et on continue ainsi, selon la formule immuable $_POST['name'] pour chaque input, car les variables sont automatiquent nommées ainsi.
Pareil pour $_POST['ville']...
Enfin $_POST['valider'] sera la variable qui dira, si elle existe bien entendu, qu'il y a eu clic sur la validation, et si elle n'existe pas, qu'il n'y a pas eu clic...
Information très importante, nous y reviendrons souvent...
Les choses sont claires ?

Comment allons-nous donc récupérer maintenant cette affaire, sur le fichier qui se nomme donc saisie.php et comporte ceci ?

saisie.php

<html>
<head><title>Ma page d'accueil</title></head>
<body>
<h1>Bienvenue sur le site de toto </h1>
<h2>Commencez-donc par vous inscrire :</h2>
<form name="inscription" method="post" action="saisie.php">
Entrez votre pseudo : <input type="text" name="pseudo"/> <br/>
Entrez votre ville : <input type="text" name="ville"/><br/>
<input type="submit" name="valider" value="OK"/>
</form>
</body>
</html>

En PHP, il faut toujours commencer par classer vos idées ainsi :
Quelle est la condition pour que mon code s'exécute ?
Autrement dit, quelle action de l'utilisateur va déclencher mon code...

Ah, tout ça sera donc dans une condition, voyons donc immédiatement la syntaxe du si :

III-2 - La syntaxe de la condition if

Structure d'une condition if basique

if(user a cliqué sur valider){
récupère la variable pseudo;
récupère la variable ville;
écris 'Salut (son pseudo) de (sa ville). Bienvenue sur mon site !';
}

Voilà donc la structure d'une condition...

On entoure la condition entre des parenthèses, on encadre toutes les instructions dans des accolades.
Et encore une fois bien sûr, chaque instruction se termine toujours par un point-virgule.

Oubliez un détail de ce genre, et tout plante... Alors la syntaxe d'un truc aussi fréquent, il vaut mieux la répéter jusqu'à la savoir par coeur...

Tout en restant près de notre formulaire, imaginons que nous compliquons un peu notre condition :

Dans le premier si (il a cliqué), nous aimerions dire qu'en plus, si sa ville est Paris, nous lui proposons de le rencontrer...
Ce sera un 'si' imbriqué.

Même principe, mais cette fois, pensez à indenter votre code dès son élaboration, pour ne pas vous prendre les pieds dans le tapis.
Indenter, c'est décaler d'un cran le code pour raisonner par niveau d'imbrication...

Une condition imbriquée

if(user a cliqué sur valider){
récupère la variable pseudo;
récupère la variable ville;
écris 'Salut (son pseudo) de (sa ville). Bienvenue sur mon site !';
if(sa ville)=='Paris'{
écris 'On est plusieurs de Paris sur le site. Si tu veux qu'on se voie, contacte-nous !';
}
}

Remarquez une chose essentielle :

if($ville=='Paris') comporte deux signes =
C'est indispensable pour une comparaison.
La variable ne reçoit pas 'Paris' (signe = d'affectation), elle est comparée (==) à Paris.

Vous ferez forcément cette erreur au début, d'autant plus difficile à repérer qu'elle ne provoquera pas de message d'erreur :
Le programme comprendra => Si la variable reçoit Paris, et ce sera toujours vrai.
Autrement dit, votre programme ne fera pas ce que vous voulez, mais le langage ne pourra pas vous préciser votre bug...

Donc bien penser à ça en premier quand une condition ne tourne pas comme on veut.
(Ai-je bien mis un double égal dans la comparaison pour la condition ?)

Une dernière chose pour les si, s'il y a un si, il faut parfois un ou plusieurs sinonsi, puis un sinon pour conclure en tout dernier...

Restons toujours dans notre thématique formulaire :
Mettons que j'ai un formulaire qui m'a renvoyé l'âge entré par l'utilisateur :

<?php
$age=$_POST['age'];
?>

La syntaxe donnera ceci :

Conditions successives qui s'excluent l'une l'autre

<?php
if($age<5){
$verdict='Ouh le bébé !';
}
elseif($age<13){
$verdict='Vous êtes un enfant !';
}
elseif($age<18){
$verdict='Vous êtes un(e) ado !';
}
else{
$verdict='Ah ! enfin un(e) adulte !';
}
echo $verdict;
?>

Ici, pas d'imbrication, puisque ce sont des conditions successives et non imbriquées l'une dans l'autre.
La dernière (le else), c'est bien sûr 'sinon', le truc par défaut...

Ici, que signifie-t-il concrètement ?
Que user a 18 ans ou plus, n'importe quel entier > ou = à 18...

Dans tous les cas, il est affecté une valeur à $verdict au moment où il parvient à l'instruction 'affiche moi le verdict'...
L'instruction n'est pas dans une condition, elle s'exécute à tous les coups.
Mais la variable $verdict elle, n'est pas initialisée de la même façon selon que c'est l'une ou l'autre des 4 conditions de ce système de conditions qui l'a initialisée.

En d'autres termes, dès l'instant où le programme tombe sur une condition qui se réalise, il cesse de tester la suite et passe à l'exécution de l' instruction...

III-3 - Les formulaires, suite

Revenons maintenant sur le traitement de notre formulaire de départ, avec une toute petite condition bien classique :

if(user a cliqué sur valider){
récupère la variable pseudo;
récupère la variable ville;
écris 'Salut (son pseudo) de (sa ville). Bienvenue sur mon site !';
}

Comment allons-nous dire en PHP la condition ou les instructions ? De la façon suivante, que je commenterai ensuite :

la syntaxe pour récupérer une variable POST

<?php
if(isset($_POST['valider'])){
$pseudo=$_POST['pseudo'];
$ville=$_POST['ville'];
echo 'Salut '. $pseudo.'de '. $ville.'<br/>Bienvenue sur mon site !';
}
?>

Traduction :

s'il existe une variable POST qui a pour nom 'valider' et que donc user a validé,
$pseudo reçoit la variable POST qui a pour nom 'pseudo'
$ville reçoit la variable POST qui a pour nom 'ville'
affiche... bon la fonction echo n'a plus de secret pour vous...

Remarque :

On peut très bien se passer de ranger la variable de type $_POST['name'] dans une variable au nom simplifié de type $name, et la manipuler directement !
Mais si on doit la manipuler sans arrêt, c'est plus agréable (et plus stable) de la renommer...

Autre remarque :

Puisque c'est l'attribut name dans la balise d'un objet type formulaire qui va déterminer le nom de la variable POST, pensez-bien à ne pas y mettre d'accent, ni d'espace...
Le name ne sert pas à l'affichage, le user ne le verra pas ! C'est pour le programmeur, pour vous...

III-4 - Les formulaires, fin

On remet tout ça bout à bout dans le code maintenant !

Fichier saisie.php : un formulaire et son traitement

<html>
<head><title>Ma page d'accueil</title></head>
<body>
<h1>Bienvenue sur le site de toto </h1>
<h2>Commencez-donc par vous inscrire :</h2>
<form name="inscription" method="post" action="saisie.php">
Entrez votre pseudo : <input type="text" name="pseudo"/> <br/>
Entrez votre ville : <input type="text" name="ville"/><br/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php
if(isset($_POST['valider'])){
$pseudo=$_POST['pseudo'];
$ville=$_POST['ville'];
echo 'Salut '. $pseudo.'de '. $ville.'<br/>Bienvenue sur mon site !';
}
?>
</body>
</html>

Vous expérimentez tout ça en local bien entendu...
Changez des détails, triturez, appropriez-vous la méthode et la syntaxe...

D'autant que le TP3 est un véritable travail de programmation cette fois.
Prenez bien votre temps...

III-5 - TP3

Sans copier, ni copier/coller le cours, concevez une page qui s'appelle imc.php, et propose un formulaire sous la forme suivante :

Entrez votre prénom :
Entrez votre taille (sous la forme 1.70) :
Entrez votre poids (en kilos) :
OK

Ensuite vous traiterez le formulaire en PHP pour que quand la personne clique, elle voit apparaître :

Bonjour (son prénom)
Votre IMC (indice de masse corporelle) est exactement : (son imc)
Vous avez (une corpulence normale ou bien Vous êtes en surpoids, ou bien Vous êtes obèse etc...)

Pour la petite opération, l'IMC, c'est le poids divisé par la taille divisé par la taille...

En voici la syntaxe :
$poids/($taille*$taille)

(Nous reviendrons plus tard sur les opérateurs)...

Pour les conditions qui déterminent les tranches de l'IMC, consultez wikipedia par exemple, rubrique : interprétation de l'IMC, classification de l'OMS.
N'omettre aucune tranche bien entendu !

http://fr.wikipedia.org/wiki/Indice_de_masse_corporelle

III-6 - Correction du TP3

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

imc.php

<html>
<head><title>Votre IMC</title></head>
<body>
<h1>Déterminez votre IMC et sachez quelle est votre corpulence d'un point de vue médical</h1>
<h2>Entrez les données suivantes </h2>
<form name="formulaire" method="post" action="imc.php">
Entrez votre prénom : <input type="text" name="prenom"/> <br/>
Entrez votre taille (sous la forme 1.70) : <input type="text" name="taille"/> <br/>
Entrez votre poids (en kilos) : <input type="text" name="poids"/> <br/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php
if(isset($_POST['valider'])){
$prenom=$_POST['prenom'];
$taille=$_POST['taille'];
$poids=$_POST['poids'];

$imc=$poids/($taille*$taille);

echo 'Bonjour '.$prenom.'<br/>
Votre IMC (indice de masse corporelle) est exactement : '.$imc.'<br/>';

if ($imc<16.5){
$verdict='Vous êtes en dénutrition.';
}
elseif ($imc<18.5){
$verdict='Vous êtes maigre.';
}
elseif ($imc<25){
$verdict='Vous avez une corpulence normale.';
}
elseif ($imc<30){
$verdict='Vous êtes en surpoids.';
}
elseif ($imc<35){
$verdict='Vous êtes en état d\'obésité modérée.';
}
elseif ($imc<40){
$verdict='Vous êtes en état d\'obésité sévère.';
}
else{
$verdict='Vous êtes en état d\'obésité massive.';
}

echo $verdict;
}
?>
</body>
</html>

IV - PHP ETAPE 4

Vous avez un formulaire qui propose des saisies au client (client au sens informatique du mot, par opposition à serveur). Disons une dizaine.
Vous vous en souvenez, cela créera une dizaine de variables $_POST['nom_de_l_input'].
Il se trouve que PHP range automatiquement ces variables dans un tableau. Nous y reviendrons à la fin de cette étape.

Commençons par voir ce qu'est un tableau :

IV-1 - Les tableaux simples

Un tableau, c'est un moyen de stocker plusieurs variables, selon un plan qui vous paraît logique.

C'est comparable à un meuble avec ses tiroirs.
Dans le tiroir 0, (oui, le tableau commence par le tiroir zéro), vous rangez la variable lundi par exemple, dans le tiroir 1, vous rangez la variable mardi etc.

En informatique, on appelle index ou indice le numéro de tiroir (la position de la variable dans le tableau), et valeur la valeur de la variable entreposée.

Voici la syntaxe d'un tableau tout simple

On construit le tableau des jours de la semaine

<?php
$semaine=array('lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche');
?>

Par cette simple ligne, vous venez de construire un tableau (qui vous le remarquerez, est une variable en lui même puisqu'il commence par $, mais une variable complexe, organisée).

$semaine est le nom du tableau entier.

Vous lui avez affecté des valeurs, (via la commande array, il sait que c'est un tableau).
Et ici, par défaut, l'index commence à 0, donc dimanche aura pour index... 6 et non 7.

Une fois construit ce tableau, comment convoquer une valeur ?
$semaine[2] sera...mercredi et ainsi de suite... selon la règle : $semaine[index]

Vous pouvez le vérifier en tapant la commande suivante :

<?php
echo $semaine[2];
?>

Bien sûr ici, nous avons construit un tableau contenant des variables string (les jours de la semaine) et des indices numériques (0,1,2 etc...).

On peut tout-à-fait ranger des valeurs numériques dans un tableau.
Ainsi ce tableau qui stocke quelques années marquantes de l'histoire de France...

Histoire de France

<?php
$dates=array(1789,1830,1848,1851,1871,1914,1918,1936,1939,1945,1958,1968);
echo $dates[3];
?>

La commande echo renverra... 1851 ici.

IV-2 - Les commentaires

Au sein de votre code, il est bon de poser parfois quelques commentaires, quelques lignes d'explication qui ne seront bien entendu pas considérées par la machine comme des lignes de programmation à exécuter mais des lignes qu'elle pourra zapper, et qui ne sont destinées qu'au programmeur, qui remet le nez dans son programme parfois dix ans après et ne sait plus pourquoi ou comment il a conçu son code.

Parfois, c'est une autre personne qui hérite du programme. Dans tous les cas, il faut donc commenter son code.

Deux sortes de syntaxe pour des commentaires en PHP

- Petit commentaire sur une seule ligne // en début de ligne

- Commentaire sur plusieurs lignes /* au début et */ en dernier...

Comment rédiger des commentaires dans son code

<?php
/*
TOUS LES TABLEAUX
TOUTES LES DATES
TOUS LES PAYS
*/

//tableau dates marquantes en France

$datesF=array(1789,1830,1848,1851,1871,1914,1918,1936,1939,1945,1958,1968);

//tableau dates marquantes aux Etats-unis

$datesUS=array(1861,1865,1917,1918,1929,1934,1941,1945,1959,1975);
?>

PS : à partir de maintenant dans ce tuto, les commentaires me permettront également d'insérer mes commentaires didactiques directement dans mon code...

C'est-y-pas plus facile ?

IV-3 - Les tableaux associatifs

Ici, la seule différence, par rapport à un tableau simple, c'est que l'index n'est plus numérique, mais lui-même une variable string :

Par exemple, votre tableau veut stocker une adresse.
Sachant que chaque adresse comporte en gros et dans cet ordre, un nom, un prénom, un numéro, une rue, un code postal et une ville...

On peut construire le tableau suivant :

Un tableau associatif pour stocker une adresse

<?php
//On signale que notre variable $adresse4 sera un tableau
$adresse4 = array();
//on le remplit
$adresse4 ['nom']='DUPONT';
$adresse4 ['prenom']='Mickaël';
$adresse4 ['num'] = 12;
$adresse4 ['rue']  = 'rue des églantines';
$adresse4 ['cp']  = 93000;
$adresse4 ['ville'] = 'SAINT-DENIS';
?>

'num' est ici un index du tableau adresse. 12 est la valeur stockée à l'index 'num'.

<?php
//Pour convoquer 12
echo $adresse4['num'];
?>

Bien entendu, l'intérêt d'un tableau d'adresses, c'est d'en stocker plus d'une !

Alors nous procèderons... à un tableau de tableaux, un tableau imbriqué en fait...

Nous venons de voir que $adresse4 est un tableau.

Construction d'un tableau de tableaux

<?php
//construction de mon tableau $agenda
$agenda=array($adresse0, $adresse1, $adresse2, $adresse3 ,$adresse4);
?>

Je procède ensuite en deux étapes :

Convoquer une donnée dans un tableau de tableaux - Méthode 1

<?php
//récupérer l'adresse totale de Mickaël
$adresseMick= $agenda[4];
/*
En effet, l'adresse de Mickaël se trouve dans notre agenda à l'index 4 (l'index numérique construit automatiquement)...
*/
//Récupérer enfin le nom de famille de Mickaël
echo $adresseMick['nom'];
?>

Compris ? Allez, même si ça pique un peu la tête, signalons au passage que l'on aurait pu retrouver le nom de Mickaël dans ce tableau de tableaux par la syntaxe suivante, plus condensée :

Convoquer une donnée dans un tableau de tableaux - Méthode 2

<?php
echo $agenda[4]['nom'];
?>

IV-4 - La boucle foreach

Bien sûr, l'idéal pour parcourir les valeurs d'un tableau, c'est une boucle.
La boucle foreach (pour chaque élément) présente l'avantage de parcourir la totalité d'un tableau, même si l'on n'a aucune idée du nombre d'éléments qu'il contient.

Reprenons notre tableau des jours de la semaine, comment le parcourir ?

Égrener les jours de la semaine

<?php
//construction du tableau semaine
$semaine=array('lundi','mardi','mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche');

//parcours du tableau

foreach($semaine as $jour){
echo'- '.$jour.'<br/>';
}
/*
Pour chaque valeur du tableau $semaine, compose la variable $jour et affiche le jour puis va à la ligne...
*/
?>

Copiez, collez maintenant le gros morceau de code qui suit, dont nous avons vu l'essentiel tout à l'heure, la construction à la main d'un agenda d'adresses :

L'agenda : un tableau de tableaux

<html>
<head><title>Mon agenda</title></head>
<body>
<?php
$adresse0 = array();
//on le remplit
$adresse0 ['nom']='ZERO';
$adresse0 ['prenom']='Toto';
$adresse0 ['num'] = 10;
$adresse0 ['rue']  = 'rue des rosiers';
$adresse0 ['cp']  = 94000;
$adresse0 ['ville'] = 'IVRY-SUR-SEINE';

$adresse1 = array();
//on le remplit
$adresse1 ['nom']='AIN';
$adresse1 ['prenom']='Anne';
$adresse1 ['num'] = 11;
$adresse1 ['rue']  = 'rue des moineaux';
$adresse1 ['cp']  = 57000;
$adresse1 ['ville'] = 'METZ';

$adresse2 = array();
//on le remplit
$adresse2 ['nom']='DEUX';
$adresse2 ['prenom']='Al';
$adresse2 ['num'] = 2;
$adresse2 ['rue']  = 'rue des arbres';
$adresse2 ['cp']  = 88000;
$adresse2 ['ville'] = 'EPINAL';

$adresse3 = array();
//on le remplit
$adresse3 ['nom']='TROIS';
$adresse3 ['prenom']='Léa';
$adresse3 ['num'] = 3;
$adresse3 ['rue']  = 'rue des éléphants';
$adresse3 ['cp']  = 69000;
$adresse3 ['ville'] = 'LYON';

$adresse4 = array();
//on le remplit
$adresse4 ['nom']='DUPONT';
$adresse4 ['prenom']='Mick';
$adresse4 ['num'] = 4;
$adresse4 ['rue']  = 'rue des églantines';
$adresse4 ['cp']  = 93000;
$adresse4 ['ville'] = 'SAINT-DENIS';

//on déclare et remplit l'agenda avec toutes les adresses précédentes :
$agenda=array($adresse0,$adresse1,$adresse2,$adresse3,$adresse4);
?>
</body>
</html>

Ceux qui ont suivi le devinent, qui dit tableau de tableaux dit... boucles imbriquées pour la lecture du tableau :

Une boucle pour lire chaque champ dans l'adresse imbriquée dans une boucle pour lire chaque adresse

<?php
//pour chaque élément de $agenda crée la variable $adresse
foreach($agenda as $adresse){
//pour chaque élément de $adresse crée la variable $element
foreach($adresse as $element){
//écris le $element sur la même ligne avec un tiret et des espaces
echo '- '.$element.'  ';
}
//A chaque nouveau $adresse, saute une ligne
echo'<br/>';
}
?>

Et voici notre agenda qui s'affiche de façon assez lisible...

Bien, nous arrivons maintenant au coeur de notre problème, et nous revenons à notre formulaire :

Comment récupérer des variables $_POST, résultats d'un formulaire de saisie, quand elles sont nombreuses ?

IV-5 - Boucle foreach et variables POST

PHP construit automatiquement un tableau associatif dès que l'on soumet un formulaire.
Ce tableau se nomme $_POST, chaque élément a pour index le 'name' d'un élément du formulaire, et chaque valeur, la valeur entrée par l'utilisateur dans chaque champ avant de cliquer sur le bouton 'submit'.

On peut donc égrener tranquillement notre tableau de variables POST de cette façon :

Une boucle foreach pour récupérer les variables POST

<?php
/*pour chaque élement du tableau $_POST,
récupère et affecte la valeur de l'index,
puis récupère et affecte la valeur associée à cet index*/

foreach($_POST as $index=>$valeur){
echo '- '.$valeur.'<br/>';
}
?>

Pour vous en convaincre, reprenons le formulaire sur l'IMC, (correction du TP3) et voyons ce que cette boucle produit :

Récupérons tout le tableau $_POST de notre petit code sur l'IMC

<html>
<head><title>Votre IMC</title></head>
<body>
<h1>Déterminez votre IMC et sachez quelle est votre corpulence d'un point de vue médical</h1>
<h2>Entrez les données suivantes </h2>
<form name="formulaire" method="post" action="tableau.php">
Entrez votre prénom : <input type="text" name="prenom"/> <br/>
Entrez votre taille (sous la forme 1.70) : <input type="text" name="taille"/> <br/>
Entrez votre poids (en kilos) : <input type="text" name="poids"/> <br/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php
echo'Vos données entrées : '.'<br/>';

if(isset($_POST['valider'])){
foreach($_POST as $index=>$valeur){
echo '- '.$index.' : '.$valeur.'<br/>';
}
}
?>
</body>
</html>

Ce petit bout de code ne fait qu'afficher la valeur des variables que le client vient d'entrer plus la valeur (permanente) de valider qui est 'ok'...

IV-6 - TP4

Sur le fichier tp4.php, offrez via un formulaire la saisie du nom, du prénom, de l'âge, de la ville et de l'activité.

Quand l'utilisateur clique sur le bouton valider, il voit apparaître en dessous du même formulaire le message suivant :
'Vous venez de saisir :' puis à la ligne à chaque fois un tiret son nom, un tiret son prénom etc...

Comme d'habitude sans copier... De mémoire seulement...
Par ailleurs, on ne veut pas voir 'ok' dans la liste de ce que l'on vient de saisir...

IV-7 - Correction du TP4

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

tp4.php

<html>
<head><title>Identité</title></head>
<body>
<h1>Identité</h1>
<form name="formulaire" method="post" action="tp4.php">
Entrez votre nom : <input type="text" name="nom"/> <br/>
Entrez votre prénom : <input type="text" name="prenom"/> <br/>
Entrez votre âge: <input type="text" name="age"/> <br/>
Entrez votre ville : <input type="text" name="ville"/> <br/>
Entrez votre activité : <input type="text" name="activite"/> <br/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php
if(isset($_POST['valider'])){
echo '<h3>Vous venez d\'entrer : </h3>';
foreach($_POST as $index=>$valeur){
if ($index!='valider'){
echo '- '.$valeur.'<br/>';
}
}
}
?>
</body>
</html>

V - PHP ETAPE 5

V-1 - Les opérateurs

Rapidement les opérateurs essentiels :

Presque tous les opérateurs

<?php
/*
LES OPERATEURS ARITHMETIQUES
*/
//la variable reçoit 5 (simple égal : opérateur d'affectation)
$valeur=5;

//plus et moins
$nombre=(4+6)-2;
//$nombre vaudra 8;

//multiplier ou diviser
$nombre=(4*6)/2;
//$nombre vaudra 12;

//Priorités si vous ne mettez pas de parenthèses :

$valeur=4+6*2;
//multiplier ou diviser est prioritaire.
//Si vous risquez d'oublier, sécurisez avec des parenthèses...
$valeur=4+(6*2);
//Sans parenthèses, cela revient à 16;

//Si vous souhaitez une autre priorité, déplacez les parenthèses :
$valeur=(4+6)*2;
//Cela revient à 20;

//modulo ou ce qui reste après division entière
$nombre=6%2;
//$nombre renverra 0 (car 6 est divisible par 2 donc reste zéro).
$nombre=27%4,
//$nombre renverra 3 (car 6x4=24 reste 3).

//comparer
//RAPPEL IMPORTANT : penser au double égal
if ($nombre==4)

//son contraire
if($nombre!=4)
//Différent de

//inférieur, supérieur
if($nombre<4)
if($nombre>4)

//inférieur ou égal, supérieur ou égal
if($nombre<=4)
if($nombre>=4)

/*
LES COMPARAISONS LOGIQUES
*/
//si l'âge est compris entre 15 et 25 ans :
if (($age>=15)&& ($age<=25))
//Notez && pour le 'et' logique (AND marche aussi)
//Notez les parenthèses imbriquées pour chaque sous-condition

//si $truc est 'papa' ou 'maman'
//RAPPEL IMPORTANT : penser au double égal de comparaison

if(($truc=='papa')||($truc=='maman')){
echo'Chouette, mes parents !';
}
//Notez || (2 fois la touche AltGr+6)  pour le 'ou' logique
//on l'appelle aussi le ou inclusif (OR marche aussi)
//Notez les parenthèses imbriquées pour chaque sous-condition
?>

V-2 - Les fonctions

V-2-a - Les fonctions dans la page

Imaginons le problème suivant. Votre programme affiche les notes/20 d'un élève.

Vous souhaitez mettre en rouge toutes les notes (strictement) inférieures à 10.
Vous souhaitez mettre en vert toutes les notes supérieures (ou égales) à 15.

Cela veut dire qu'à chaque apparition d'une note, il faut la tester et lui appliquer la couleur adéquate.
Comme c'est une tâche répétitive, on va la mettre en forme dans une fonction.

Voici comment opérer :

On place évidemment la fonction que l'on va construire au début du code, avant de l'utiliser.
Par exemple, dans le début du body (au sein de balises PHP bien sûr).
Mais on ne la crée qu'une fois, tandis qu'on la convoque autant qu'on veut un peu plus loin sur le même fichier PHP.
C'est pourquoi on va lui donner un nom simple à retenir (comme les variables, les noms de fonctions sont libres, il faut juste bannir les espaces et les accents.)
Bien entendu, il faut aussi retenir une chose : c'est que si le nom de votre fonction est libre, une fois que vous l'avez choisi, vous ne pourrez le convoquer qu'en ne changeant rien (ni une lettre, ni une majuscule ou minuscule)...

Mais bon, vous devez commencer à comprendre que comme tout langage de programmation, PHP ne supporte aucune coquille.

Le cadre de notre fonction se présentera ainsi :

function colore($nombre){
toutes les instructions se situeront à l'intérieur de ces accolades;
et se termineront par un ;
}

Dans la création de la fonction, il est obligatoire de commencer par écrire function, ensuite vient le nom (libre).

Enfin ici, notre fonction comporte un paramètre (une variable imaginaire, $nombre, dont on ne connaît pas encore la valeur)...
On fait comme si $nombre existait déjà, et on fait le petit bout de code qui effectue ce qu'on veut obtenir :

Ma fonction qui colore les notes

<?php
function colore($nombre){
if($nombre<10){
echo'<font color="red">'.$nombre.'</font>';
}
elseif($nombre>=15){
echo'<font color="green">'.$nombre.'</font>';
}
//cas par défaut(noir)
else{
echo $nombre;
}
}
?>

Vous voulez tester jusqu'au bout cette nouvelle fonction ?

Convoquer notre fonction dans une boucle

<?php
//Construisons notre tableau de notes :

$notes=array(2,5,7,10,11,13,15,17,18);

/*Scannons-le grâce à une boucle foreach du type

echo 'Vos notes du trimestre :<br/>';
foreach($notes as $note){
echo '- '.$note.'<br/>';
}*/

//Et maintenant, précisons notre boucle foreach pour y convoquer notre fonction.

echo 'Vos notes du trimestre :<br/>';
foreach($notes as $note){
echo '- '.colore($note).'<br/>';
}
?>

En définitive, notre fichier notes.php complet donnera ceci :

Le fichier complet

<html>
<head><title>Notes du trimestre</title></head>
<body>
<?php
//Cette fonction colore en rouge les notes<10
//et en vert les notes >=15
function colore($nombre){
if($nombre<10){
echo'<font color="red">'.$nombre.'</font>';
}
elseif($nombre>=15){
echo'<font color="green">'.$nombre.'</font>';
}
//cas par défaut(affiche sans modifier couleur)
else{
echo $nombre;
}
}

//Construisons notre tableau de notes :
$notes=array(2,5,7,10,11,13,15,17,18);

//La boucle foreach scanne le tableau
//en appliquant la fonction colore
echo 'Vos notes du trimestre :<br/>';
foreach($notes as $note){
echo '- ';
colore($note);
echo '<br/>';
}

?>
</body>
</html>

Vous serez peut-être étonné du fait que cela fonctionne, bien que votre fonction disait colore($nombre) et que lorsque vous la convoquez, vous dites colore($note)...

Mais ça ne pose aucun problème. Le nom même de l'attribut au sein de la fonction est celui que vous voulez.
Quand vous la convoquez, il remplace de toute façon la variable 'théorique' de la fonction par la variable courante que vous lui passez en attribut...

V-2-b - Plusieurs paramètres passés à la fonction

Une remarque importante, en ce qui concerne les fonctions : elle peuvent être définies avec plusieurs paramètres.

Par exemple, je peux définir une fonction moyenne annuelle telle qu'elle soit la moyenne des trois trimestres scolaires :

<?php
function MoyenneAnnuelle($trim1, $trim2, $trim3){
$MA=($trim1+$trim2+$trim3)/3;
echo 'Votre moyenne annuelle : '.$MA;
}
?>

Dans ce cas, pour la convoquer, on pourra écrire :

<?php
MoyenneAnnuelle(8,10,12);
//ceci aura pour résultat :
// Votre moyenne annuelle : 10
?>

V-2-c - Les fonctions dans un fichier à part

Si vous développez un programme un peu ambitieux, vous aurez un certain nombre de fonctions.
Vous pouvez tout-à-fait les mettre à part dans un fichier voisin que vous appelleriez fonctions.php par exemple, ou comme vous voulez en fait.
Il vous suffira ensuite de le convoquer une seule fois au tout début de chacune de vos pages php, au sein de balises PHP bien entendu :

Par la formule suivante

<?php
include('fonctions.php');
?>

Ceci vous permet ensuite de convoquer n'importe quelle fonction définie dans votre page fonctions.php.

Par exemple, vous avez développé tout un site et vous souhaitez sur chacune des pages signaler le dernier événement mis à jour.

Vous pourriez procéder ainsi :

Dans fonctions.php, vous rédigez cette fonction :

une fonction de simple affichage

<?php
function DerniereMaj(){
echo'Dernière parution mise à jour :<br/>
PIF GADGET<br/>
le 10/01/2009';
}
?>

Dans chacune des pages de votre site maintenant, vous vous contentez de mettre, à l'endroit où vous souhaitez que votre avis de mise à jour (maj) apparaisse, la ligne suivante :

Pour convoquer la fonction

<?php
DerniereMaj();
?>

Bien entendu aussi, vous aurez songé auparavant à mettre votre "include" de la page fonctions.php dans chaque page de votre site...
Ceci vous permettra, à chaque nouvel avis de maj, de changer centralement et une seule fois dans fonctions.php votre texte.
Et cela aura pour conséquence de le changer sur chacune de vos pages.

Par exemple :

<?php
function DerniereMaj(){
echo'Dernier publication mise à jour :<br/>
PIF ET PIFOU<br/>
le 13/01/2009';
}

//etc...
?>

Vous remarquerez que la fonction DerniereMaj n'a pas de paramètres. C'est une simple fonction d'affichage.
Une fonction sans paramètres conserve toutefois les parenthèses vides, dans sa définition comme à chaque convocation.

V-2-d - Fonction qui renvoie une valeur de retour

Une dernière chose sur les fonctions : Si l'on ne veut pas une fonction qui affiche, mais une fonction qui par exemple calcule et renvoie une valeur, on utilisera le mot clé return.
Par exemple, réalisons une fonction qui nous retourne le verdict du nombre que l'on vient d'entrer : pair ou impair ?

Un formulaire de saisie, et une analyse du nombre entré

<html>
<head><title><Pair ou impair ?</title></head>
<body>
<?php
//fonction qui fait le diagnostic
function parite($nombre){
//si le reste de la division est zéro, c'est pair
if (($nombre%2)==0){
//on initialise les deux valeurs de verdict
$verdict='pair';
}
else{
$verdict='impair';
}
//on renvoie le verdict, tout à la fin
return $verdict;
}
?>
<form method="POST" action="fonction.php">
Entrez votre nombre<input type="text" name="num"/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php
//si user a cliqué OK
if(isset($_POST['valider'])){
//récupère la valeur entrée
$nombre=$_POST['num'];
//place dans $toto la valeur de retour de ma fonction
$toto=parite($nombre);
//affiche le verdict entier
echo 'Ce nombre est '.$toto.'.';
}
?>
</body>
</html>

Quelques commentaires supplémentaires : return stoppe la fonction.
Il faut donc le placer en tout dernier, juste avant l'accolade finale qui ferme la fonction.

Pour la même raison, return ne peut renvoyer qu'une seule valeur, libre à vous cependant de rendre cette valeur complexe comme un tableau.

Une dernière chose, au moment de la convocation d'une fonction qui retourne une valeur, bien penser à "ranger" la valeur retournée dans une variable "réception", peu importe son nom (c'est bien pourquoi je l'ai appelée ici $toto)...

V-3 - La boucle for

Une boucle for, c'est une boucle qui dit "pour chaque valeur de tant à tant, recommence".

Traditionnellement, $i est le nom de la variable qui sert un peu de compteur pour une boucle for, mais rien n'interdit de lui donner un nom plus explicite.
La syntaxe de cette boucle est la suivante :

Ca serait sympa si on pouvait faire les punitions en PHP

<?php
//Copiez-moi 50 fois la punition !!!

//pour i égal zéro, i inférieur à 50, i plus plus
for($i=0;$i<50;$i++){
echo 'Je ne tricherai plus à un devoir. Limite je meurs de honte là.<br/>';
}
?>

Plusieurs remarques :

Puisque $i commence à 0 et non à 1 (oui, pareil que pour les indices de tableaux), pensez bien à mettre ensuite strictement inférieur à la valeur de la limite supérieure de la boucle.
Ici on peut traduire par : pour $i de 0 à 49, ce qui fait bien... 50 tours de boucle.

Bon en plus, si vous en avez marre de commencer à zéro, vous pouvez commencer à 1 ou à ce que vous voulez pour les boucles (c'est pas comme les tableaux)...

Mais c'est la syntaxe suivante : $i++ qui doit vous sembler un peu surprenante.
Elle signifie $i=$i+1;

Autrement dit, augmente notre compteur de 1 à chaque tour de boucle, cela se nomme aussi l'incrémentation.

V-4 - La commande switch

Voici une commande qui est une condition, en tout cas, qui gère très simplement, le principe des conditions multiples un peu lourd à gérer avec des if, elseif, else, if imbriqués, ordre des if, cas particulier qui vient faire planter tout notre échaffaudage laborieux de conditions etc.

Nous verrons plus tard pourquoi cette commande switch est quasiment vitale en PHP.
Pour l'instant, contentons-nous d'en comprendre la structure.

Switch, c'est un interrupteur.

Prenons le cas d'un "verdict" du genre de notre TP sur l'IMC (voir correction du TP3).

Dans ce cas, le switch s'écrirait ainsi :

Un switch pour des conditions qui s'excluent l'une l'autre

<?php
switch($corpulence){
case 'denutrition':
$verdict='Vous êtes en dénutrition.';
//placer ici un lien vers un centre d'aide aux troubles du comportement alimentaire
break;
case 'maigre':
$verdict='Vous êtes maigre.';
//placer ici quelques conseils d'hygiène de vie
//MANGEZ bougez
break;
case 'normal':
$verdict='Vous avez une corpulence normale.';
//placer ici quelques conseils "Continuez commme ça"
break;
case 'surpoids':
$verdict='Vous êtes en surpoids.';
//placer ici quelques conseils d'hygiène de vie
//BOUGEZ mangez
break;
case 'obese_modere':
$verdict='Vous êtes en état d\'obésité modérée.';
//placer ici quelques conseils d'hygiène de vie
//BOUGEZ BOUGEZ mangez
break;
case 'obese_severe':
$verdict='Vous êtes en état d\'obésité sévère.';
//placer ici quelques conseils d'hygiène de vie
//BOUGEZ BOUGEZ BOUGEZ REVOYEZ TOUT VOTRE MODE DE VIE
break;
case 'obese-massive':
$verdict='Vous êtes en état d\'obésité massive.';
//placer ici un lien vers un centre d'aide aux troubles du comportement alimentaire
}
?>

Et voici l'explication :

Dans le cas (case) où la variable $corpulence est égale à 'denutrition' : affecte telle 'formule' à la variable verdict et procède à telle série d'instructions, dans le case 'maigre' affecte telle autre valeur à $verdict etc. etc.

On sait que ces conditions s'excluent l'une l'autre grâce à l'instruction break; qui signifie : 'quand tu as finis, sors de ce switch'.
D'où la raison pour laquelle le dernier case 'obese_massive' ne nécessite pas de break, il pourrait en prendre un, mais disons que ça ne sert à rien, on est en fin de switch (accolade finale)...

Bien sûr, avant ce switch, il faudrait s'assurer que $corpulence, via des conditions, se voit bien affecter tout cet éventail de valeurs...

Bien sûr, après ce switch, il faudrait placer la suite des instructions, suite commune quelle que soit la valeur de $corpulence et/ou $verdict ...

instruction après le switch, qui a initialisé $verdict

<?php
echo '<h3>'.$verdict.'</h3><br/>';
echo '<p>Mais ne prenez pas ce constat, aussi brut soit-il, trop à coeur. <br/>
Une corpulence, s\'il en est besoin, peut changer grâce aux conseils ci-dessus.</br></br>
Ce n\'est qu\'une norme qui doit vous indiquer si votre hygiène de vie est à faire évoluer ou non.
<br/><br/>
Pas le verdict du tribunal d\'inquisition !.</p>';
?>

Nous y reviendrons dans la conclusion de ce tutoriel, mais le switch a ceci de très agréable que quand vous développerez des sites ou des applications un peu plus costaudes en PHP :

Il rendra votre code beaucoup plus lisible.

Vous pourrez caser des lignes et des lignes d'instructions à l'intérieur d'un case, au nom parlant, lui même à l'intérieur d'un switch($procedure) qui fait que l'on ne sera pas perdu en relisant votre code...

V-5 - TP5

Dans fonctions.php, vous créerez une fonction qui, quand on lui passe un nombre, affiche le verdict "est un nombre premier" ou "n'est pas un nombre premier";

Pour rappel, un nombre premier est un nombre qui n'est divisible QUE par lui-même et par 1 (et ce, de façon distincte, donc 1 n'est pas un nombre premier).
A ce propos, 0 n'est pas un nombre premier non plus (car on ne peut pas le diviser par zéro), mais vous le gérerez comme une exception...

Dans premiers.php, vous proposerez un formulaire pour que l'utilisateur entre un nombre, disons entre 1 et 10 000, puis traiterez le nombre entré en appelant la fonction en cas de clic sur validation.

Vous afficherez alors le verdict sous la forme :

"99 n'est pas un nombre premier." ou bien "59 est un nombre premier" etc...

Si vous bloquez vraiment, après avoir cherché, lisez le préambule de la correction avant de vous replonger dans la réflexion... Cela devrait vous aider sans tout vous mâcher...

V-6 - Correction du TP5

Petit préambule avant la correction (abondamment commentée) des deux fichiers :

Un flag (que l'on peut appeller $flag pour plus de lisibilité) est une variable logique qui fonctionne un peu comme un drapeau qui est en berne ($flag=0;) et se soulève à l'événement qu'on lui a indiqué ($flag=1;).

Ici, on souhaite que dès qu'il repère un multiple (un seul), hop, il initialise le flag à 1, et il sort de la boucle.

A ce propos, un autre tuyau : au sein d'une boucle, la commande break; permet de sortir sans finir les tours de boucle.
Le programme cesse de tester les autres multiples, c'est devenu superflu pour l'objectif que nous poursuivons, et qui est de chercher quand un nombre cesse d'avoir une chance d'être premier...
Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

fonctions.php

<?php
function premiers($nombre){
/*Cette variable fait office de flag (voir explications plus haut)
Ici flag est "éteint"*/

$flag=0;

/*Cette boucle teste toutes les valeurs inférieures à $nombre
Pour voir si ce sont des multiples potentiels
Donc ici, $i représente le multiple potentiel*/

for($i=2;$i<$nombre;$i++){
//si $nombre modulo $i égal zéro
//revient à dire : si $i est un diviseur de $nombre
if($nombre%$i==0){
//initialise le verdict
$verdict='n\'est pas premier';
//allume le flag
$flag=1;
//Quitte la boucle immédiatement
break;
}
}

/*Si après la boucle entière
Le flag est toujours éteint
C'est un nombre premier !*/

if ($flag==0){
$verdict='est premier';
}

/*Gérer l'exception zéro
qui est un peu un cas particulier*/

if($nombre==0){
$verdict='n\'est pas premier';
}

//renvoie le verdict en sortant de la fonction
return $verdict;
}
?>

premiers.php

<html>
<head><title>Nombres premiers</title></head>
<body>
<?php
//intègre toutes les fonctions du fichier voisin
include('fonctions.php');
//présente le formulaire
?>
<form method="POST" action="premiers.php">
Entrez votre nombre (entre 1 et 10 000 SVP)<input type="text" name="num"/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php
//si user a cliqué OK
if(isset($_POST['valider'])){
//récupère la valeur entrée
$nombre=$_POST['num'];
//convoque la fonction premiers
$verdict=premiers($nombre);
//affiche le verdict entier mis en forme.
echo $nombre.' '.$verdict.'.';
}
?>
</body>
</html>

VI - PHP ETAPE 6

VI-1 - Les bases de données : introduction

VI-1-a - A quoi ça sert ?

Pour rappel, le code HTML ne sert qu'à l'affichage.
Le code PHP sert à créer un HTML dynamique jusqu'à un certain point, en tout cas, PHP peut organiser à chaque chargement de votre page web le HTML de façon différente.

Cependant, PHP n'a pas le "pouvoir" de mémoriser des données entre deux chargements de page (en dehors de celles que vous transmettez à chaque fois d'une page web à l'autre, via un formulaire HTML !)...

Alors si vous voulez conserver sur la durée les données entrées par les visiteurs de votre site via votre formulaire, de façon automatique et sans plus vous occuper de rien, il va falloir encore intégrer de bonnes notions des bases de données.

VI-1-b - Comment ça marche ?

Cliquez sur l'icône de WampServer, puis cliquez sur phpMyAdmin.

Accès à phpMyAdmin

C'est le troisième et dernier lien que nous suivrons sur wampServer, après wwwdirectory (le code) et localhost (le test comme si on était sur le web).

C'est ici, sur phpMyAdmin, que vous allez gérer tout ce qui concerne les bases de données.

Une base de données, qui possède un nom, c'est l'ensemble des tables qui recensent vos données.
Une table, qui a un nom également, c'est une structure qui organise vos données de la façon citée en exemple ci-dessous.

Nous allons commencer par une base qui ne comporte qu'une seule table, pour faire simple.

Cliquez le bouton "Créer une base", nommez-la MaBase, puis cliquez "Créer".
Créez une nouvelle table "Utilisateurs" avec 5 champs...
Ils se découperont ainsi (ce qui nous intéresse surtout, c'est le type des champs)...

Nos 5 champs et leur type respectif

- ID, qui est un INT (integer : entier), cochez AI (auto-incrémenté pour que phpMyAdmin gère ce champ tout seul)

- pseudo qui est un VARCHAR (caractères dont le nombre varie), entrez 15 à taille/longueur (nombre maximum de carcactères autorisés)

- sexe qui est un CHAR (caractères dont le nombre est fixe), entrez 1 à taille/longueur (nous mettrons simplement G ou F)

- age qui est un INT, entrez 3 à taille (le nombre de chiffres). Pour un âge, c'est sympa de penser aux centenaires...

- et enfin dateInscription (sélectionnez date)...

Ca y est ? Votre table est créée avec sa structure ?

Maintenant, on va la remplir "à la main", enfin, pour les 5 premières personnes.

A gauche dans votre arborescence, sélectionnez votre table 'inscriptions'.
Vous voyez la structure de votre table qui s'affiche... sous forme de tableau.
Cliquez 'Insérer' dans le menu du haut... Par défaut, phpMyAdmin vous donne un formulaire d'insertion deux entrées par deux entrées...

Laissez toujours le champ ID vide. On a dit qu'il se remplirait automatiquement.
Et remplissez ainsi vos 5 insertions :
Si les dates vous paraissent bizarres, c'est qu'elles sont à l'anglaise (année/mois/jour)...

Nos 5 premiers enregistrements

- Lili F 18 2009-01-02

- Toto G 13 2008-01-02

- Loulou G 25 2008-12-30

- Zézette F 20 2009-01-02

- Mimi F 15 2009-01-10

On dira que dans votre table Utilisateurs (qui compte donc 5 champs), il y a 5 enregistrements, 5 personnes enregistrées autrement dit, avec toutes leurs données.
La seule façon certaine de les distinguer, c'est leur ID (identification data).

Pour le reste, deux personnes peuvent avoir le même pseudo, le même sexe, ou la même date d'inscription...

Pour convoquer un enregistrement, ou un morceau d'enregistrement, on passera donc toujours par l'ID.

Ma première table

Le langage qu'on va maintenant utiliser, pour faire des requêtes ou des insertions ou des suppressions dans notre base, se nomme SQL.
Il est assez intuitif et pour l'étude sommaire que nous allons en faire, il consistera en cinq-six mots d'anglais de base...

Je veux récupérer le jour d'inscription de Zézette ?

La requête sera la suivante :

Sélectionne le champ dateInscription dans la table Utilisateurs qui correspond à l'ID 4 :

SELECT dateInscription FROM Utilisateurs WHERE ID="4"

Je veux récupérer toutes les infos sur les filles ?

Sélectionne tous les enregistrements dans la table Utilisateurs qui correspondent au sexe F :

SELECT * FROM Utilisateurs WHERE sexe="F"

Je ne veux récupérer que les pseudos des filles ?

Sélectionne tous les pseudos dans la table Utilisateurs qui correspondent au sexe F :

SELECT pseudo FROM Utilisateurs WHERE sexe="F"

Voilà pour l'essentiel des requêtes de base en SQL, nous verrons au cours de la suite quelques syntaxes supplémentaires...

VI-2 - Alimenter sa base via PHP

De même que PHP vous permet de créer un langage HTML plus dynamique et personnalisé, PHP vous permet maintenant de créer vos requêtes SQL de façon à automatiser l'alimentation de vos bases.

Voici un exemple très concret :

Vous allez créer un formulaire qui permettra de continuer à remplir automatiquement votre base de données MaBase, plus précisément sur votre table Utilisateurs, table que pour l'instant vous avez commencé à remplir à la main, via l'interface PHPMyAdmin.

En voici les étapes :

VI-2-a - Présenter le formulaire

Sur un fichier form.php, entrez ce code :

Notre formulaire de saisie utilisateur

<html>
<head><title>Formulaire de saisie utilisateur </title></head>
<body>
<h1>Inscrivez-vous !</h1>
<h2>Entrez les données demandées :</h2>
<form name="inscription" method="post" action="form.php">
Entrez votre pseudo : <input type="text" name="pseudo"/> <br/>
Garçon ou fille ?     <input type="radio" name="sexe" value="G"/>Garçon<input type="radio" name="sexe" value="F"/>Fille<br/>
Entrez votre age : <input type="text" name="age"/><br/>
<input type="submit" name="valider" value="OK"/>
</form>
</body>
</html>

Vous remarquerez que nous ne demandons que 3 éléments d'identification à l'utilisateur, alors que la base en comporte 5 par enregistrement :
C'est normal, le premier champ de notre base est rempli automatiquement par mysql et le dernier, la date d'inscription, nous allons le remplir aussi automatiquement, via PHP cette fois, en entrant la date du jour dès que l'utilisateur clique 'OK'.

Vous remarquerez que pour des données aussi peu variées que le sexe de la personne, nous avons préféré contrôler la saisie en proposant à l'utilisateur deux boutons radio.
Pour limiter les erreurs dans la base SQL, bien songer à proposer des listes déroulantes ou des cases à cocher quand le champ s'y prête...

Qu'allons-nous faire ensuite quand l'utilisateur va cliquer "ok" ?

VI-2-b - Se connecter à notre base via PHP

A chaque fois que nous voulons que PHP se connecte à notre base, on lui donnera une série d'instructions...
Donc on va commencer par coller les paramètres de connexion dans une fonction pour ne pas trop rabâcher dans notre code...

On crée donc un fichier fonctions.php, dans lequel (entre autres) on insère la fonction suivante :

Ma fonction de connection

<?php
function connectMaBase(){
$base = mysql_connect ('localhost', 'root', '');
mysql_select_db ('MaBase', $base) ;
}
?>

Vous n'avez rien à modifier...
Sachez simplement que '' est votre mot de passe, laissé vierge ici comme il l'est par défaut dans votre configuration de départ.

Pour expliquer maintenant, cette fonction crée une variable $base qui prépare la commande de connection à votre base avec le nom du serveur (ici localhost), le nom de l'utilisateur (ici root qui signifie administrateur de votre propre base locale, en d'autres termes, root, c'est le patron) et enfin le mot de passe.

La ligne suivante lance la commande de sélection de votre base (où l'on entre donc le nom de votre base), puis on reprend la variable qui contient toute la commande de connexion...

Bien entendu, pour convoquer la fonction que vous venez de créer sur fonctions.php, il vous faudra sur form.php faire un include de ce fichier fonctions.php, puis lancer la fonction au moment opportun par la ligne suivante :

<?php
connectMaBase();
?>

VI-2-c - Pour travailler proprement (Généralités)

Retenez bien ceci :
Quand on rédige une commande d'insertion SQL via PHP, on préfère procéder ainsi, qui paraît un peu compliqué au début, mais simplifie toute la compréhension ensuite.

Insérer une donnée SQL via PHP, l'ossature

1. On se connecte à la base (en utilisant notre fonction de connexion toute prête).

2. On prépare la commande sql en la stockant dans une variable PHP du type $sql (pour langage sql);

3. On la lance.

4. On ferme la connexion.

VI-2-d - Insérer des données dans notre base via PHP

Bien entendu, le code suivant ira sur le fichier form.php dans notre condition => si l'utilisateur a cliqué OK

Insérer une donnée sql via PHP, le code

<?php
//On récupère les valeurs entrées par l'utilisateur :
$pseudo=$_POST['pseudo'];
$age=$_POST['age'];
$sexe=$_POST['sexe'];

//On créée une variable date du jour grâce à la fonction date() de PHP
$today = date("d.m.y");

//On se connecte
connectMaBase();

//On prépare la commande sql d'insertion
$sql = 'INSERT INTO Utilisateurs VALUES("","'.$pseudo.'","'.$sexe.'","'.$age.'","'.$today.'")';

/*on lance la commande (mysql_query) et au cas où,
on rédige un petit message d'erreur si la requête ne passe pas (or die)
(Message qui intègrera les causes d'erreur sql)*/
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());

// on ferme la connexion
mysql_close();
?>

C'est probablement cette partie qui vous semble la plus complexe :

<?php
//On prépare la commande sql d'insertion
$sql = 'INSERT INTO Utilisateurs VALUES("","'.$pseudo.'","'.$sexe.'","'.$age.'","'.$today.'")';
?>

La première valeur est laissée en blanc car c'est l'ID auto-incrémenté...
Si vous l'oubliez, ce blanc, il vous renverra un message d'erreur sql disant que le nombre de données insérées ne coïncident pas avec le nombre de champs... en anglais.

Ensuite il faut gérer au sein des guillemets simples (apostrophes) tout ce qui est PHP
et au sein des guillemets doubles tout ce qui est sql...

On place les guillemets au sein des apostrophes pour les afficher dans le sql, on place les variables 'nues' dans PHP.

VI-2-e - On récapitule le code ?

fonctions.php

<?php
function connectMaBase(){
$base = mysql_connect ('localhost', 'root', '');
mysql_select_db ('MaBase', $base) ;
}
?>

form.php

<?php
include("fonctions.php");
?>
<html>
<head><title>Formulaire de saisie utilisateur </title></head>
<body>
<h1>Inscrivez-vous !</h1>
<h2>Entrez les données demandées :</h2>
<form name="inscription" method="post" action="form.php">
Entrez votre pseudo : <input type="text" name="pseudo"/> <br/>
Garçon ou fille ?     <input type="radio" name="sexe" value="G"/>Garçon<input type="radio" name="sexe" value="F"/>Fille<br/>
Entrez votre age : <input type="text" name="age"/><br/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php
if (isset ($_POST['valider'])){
//On récupère les valeurs entrées par l'utilisateur :
$pseudo=$_POST['pseudo'];
$age=$_POST['age'];
$sexe=$_POST['sexe'];
//On construit la date d'aujourd'hui
//strictement comme sql la construit
$today = date("y-m-d");
//On se connecte
connectMaBase();

//On prépare la commande sql d'insertion
$sql = 'INSERT INTO Utilisateurs VALUES("","'.$pseudo.'","'.$sexe.'","'.$age.'","'.$today.'")';

/*on lance la commande (mysql_query) et au cas où,
on rédige un petit message d'erreur si la requête ne passe pas (or die)
(Message qui intègrera les causes d'erreur sql)*/
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());

// on ferme la connexion
mysql_close();
}
?>
</body>
</html>

Je vous laisse le plaisir de tester et d'alimenter votre base en saisissant des données dans votre formulaire...

Magique non ? Mieux encore, informagique...

Ne vous étonnez pas si quand vous cliquez sur OK, il semble ne rien se passer.
Ne cliquez pas trois fois et allez voir votre table utilisateurs.

Ca a très bien fonctionné. S'il semble ne rien se passer, c'est que nous avons simplement géré dans notre code l'insertion de données, sans penser à avertir l'utilisateur que son action a bien eu l'effet escompté.

Nous verrons cela plus tard... dans le TP par exemple ?

VI-3 - TP6

SANS COPIER COLLER et en ne regardant que ça et là des parties du cours :

Vous proposerez un formulaire d'abonnement (abonnement.php) du type

Votre formulaire

POUR VOUS ABONNER :

Veuillez saisir vos données d'identité :
Bouton radio : Monsieur Madame ou Mademoiselle
Nom :
Prénom :
Age :
Adresse :
Code Postal :(Bloquer via HTML la saisie à 5 chiffres)
Ville : Numéro de téléphone (Bloquer via HTML la saisie à 10 chiffres)

Veuillez cocher le magazine choisi (un seul choix possible donc bouton radio) :

- J'ai la main verte.
- J'ai le pied marin.
- J'ai l'oeil vif.
- J'ai la rate qui se dilate.

Valider

Au clic sur valider de la part de l'utilisateur, vous ferez deux choses simultanées :

1) Afficher ceci

'Pour rappel, vous avez saisi :'
toutes les données entrées par l'utilisateur, présentées proprement, du genre

'VOUS ETES :'
'VOUS AVEZ CHOISI :'
'Merci de vous être abonné à ce magazine !'

2) Insérer dans une table Abonnes que vous aurez créée auparavant via phpMyAdmin toutes les données entrées par l'utilisateur.

PS : vous placerez dans le fichier fonctions.php la fonction de connexion bien entendu.

Bon courage !

VI-4 - Correction du TP6

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

fonctions.php

<?php
function connectMaBase(){
$base = mysql_connect ('localhost', 'root', '');
mysql_select_db ('MaBase', $base) ;
}
?>

Dans phpMyAdmin, voici à quoi doit ressembler votre structure (de plus, il faut cocher AI (auto-incrémentation) pour l'ID).

La structure de votre table abonnes

Au passage, c'est un hasard si les valeurs de nos publications sont toujours de 4 lettres (oeil, main etc.), mais autant en profiter pour mettre un CHAR 4 plutôt qu'un VARCHAR.
Mais attention aux valeurs qu'on leur affecte si l'on intègre de nouveaux magazines !

Dans abonnement.php enfin :

(Peut-être vous êtes vous cassé la tête avec cette histoire de nouvel écran quand l'utilisateur clique...
et ce damné formulaire qui restait en ligne, vos commentaires de rappel ne faisant que s'ajouter au HTML...)

Voici une solution à retenir : Dans vos if, commencer par mettre la condition d'affichage la plus "avancée" en premier, contrairement à ce que l'on a envie de faire spontanément :
remontez le temps à l'envers, si vous voulez...

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

abonnement.php

<?php
include("fonctions.php");

/*ECRAN QUI S AFFICHE SI L ON A CLIQUE OK*/
if (isset ($_POST['valider'])){
//On récupère les valeurs entrées par l'utilisateur :
$civ=$_POST['civilite'];
$nom=$_POST['nom'];
$prenom=$_POST['prenom'];
$age=$_POST['age'];
$adresse=$_POST['adresse'];
$CP=$_POST['CP'];
$ville=$_POST['ville'];
$tel=$_POST['tel'];
$abo=$_POST['abo'];

//On affiche l'écran de rappel
//gérer le féminin
$e='';
if(($civ=='Mme')||($civ=='Mlle')){
$e='e';
}
//gérer le nom complet du magazine

if ($abo=='main'){
$mag='J\'ai la main verte.';
}
elseif ($abo=='pied'){
$mag='J\'ai le pied marin.';
}
elseif ($abo=='oeil'){
$mag='J\'ai l\'oeil vif.';
}
else{
$mag='J\'ai la rate qui se dilate.';
}

echo'<h2>VOUS &Ecirc;TES :</h2>';
echo $civ.' '.$nom.' '.$prenom.', ag&eacute;'.$e.' de '.$age.' ans.<br/><br/>
<strong>Votre adresse :</strong><br/>'.
$adresse.'<br/>'.
$CP.' '.$ville.'<br/><br/>
<strong>Votre t&eacute;l&eacute;phone : </strong>'.$tel.'<br/><br/>';
echo'<h2>VOUS AVEZ CHOISI DE VOUS ABONNER &Agrave;</h2>';
echo'<h3>'.$mag.'</h3><br/>
<h4>Merci de vous &ecirc;tre abonn&eacute;'.$e.' &agrave; notre magazine !</h4>';

//On alimente la base de données

//On se connecte
connectMaBase();

//On prépare la commande sql d'insertion
$sql = 'INSERT INTO Abonnes VALUES("","'.$civ.'","'.$nom.'","'.$prenom.'","'.$age.'","'.$adresse.'","'.$CP.'","'.$ville.'","'.$tel.'","'.$abo.'")';

/*on lance la commande (mysql_query) et au cas où,
on rédige un petit message d'erreur si la requête ne passe pas (or die)
(Message qui intègrera les causes d'erreur sql)*/
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());

// on ferme la connexion
mysql_close();
}

/*ECRAN QUI S AFFICHE SI L ON N A RIEN CLIQUE DONC A L ARRIVEE SUR LA PAGE*/
/*SEULE LA CONDITION ELSE EST DANS DES BALISES PHP PUIS LA PAGE HTML REPREND SON COURS*/
else{
?>
<html>
<head><title>S'abonner à l'un de nos magazines</title></head>
<body>
<h1>POUR VOUS ABONNER :</h1>

<form name="inscription" method="post" action="abonnement.php">

<h2>Veuillez saisir vos donn&eacute;es d'identit&eacute; :</h2>
<input type="radio" name="civilite" value="M"/>M.
<input type="radio" name="civilite" value="Mme"/>Mme
<input type="radio" name="civilite" value="Mlle"/>Mlle <br/>
Nom : <input type="text" name="nom"/> <br/>
Pr&eacute;nom :<input type="text" name="prenom"/> <br/>
&Acirc;ge : <input type="text" name="age"/><br/>
Adresse : <input type="text" name="adresse"/> <br/>
Code Postal : <input type="text" name="CP" maxlength="5"/> <br/>
Ville : <input type="text" name="ville"/> <br/>
Num&eacute;ro de t&eacute;l&eacute;phone personnel : <input type="text" name="tel" maxlength="10"/> <br/>

<h2>Veuillez cocher le magazine choisi :</h2>

<input type="radio" name="abo" value="main"/>J'ai la main verte. <br/>
<input type="radio" name="abo" value="pied"/>J'ai le pied marin. <br/>
<input type="radio" name="abo" value="oeil"/>J'ai l'oeil vif. <br/>
<input type="radio" name="abo" value="rate"/>J'ai la rate qui se dilate. <br/>

<input type="submit" name="valider" value="OK"/>

</form>
<?php
//Bien sûr il faut penser à fermer l'accolade de notre condition d'affichage
}
?>
</body>
</html>

VII - PHP ETAPE 7

VII-1 - Les bases de données : suite et fin

Nous savons maintenant remplir une base.
Reste à savoir l'exploiter et y récupérer les données souhaitées dans le cadre PHP.

Pour la suite de ce paragraphe, reprenez votre base MaBase, et votre table utilisateurs déjà riche d'au moins 5 enregistrements, voire plus si vous avez entré des données via votre formulaire...
En passant, avant de continuer, vérifiez dans votre base qu'il n'y a aucun doublon sur votre table, et supprimez-les manuellement avant de continuer...

Pour supprimer un enregistrement, cliquez d'abord sur rechercher dans la table, qui vous affiche toutes les données de votre table.
Puis cliquez sur l'enregistrement à annuler, puis sur la croix rouge pour l'action "delete".

On a déjà mentionné la syntaxe sql d'une simple requête :

SELECT * WHERE pseudo="Zézette"

pour récupérer toutes la ligne d'infos concernant notre amie Zézette par exemple.

Sauf que ce sont plusieurs infos (l'ID, le pseudo, le sexe, l'âge, et la date d'inscription de notre amie), et qu'en PHP, on va devoir stocker ça dans un... tableau bien sûr.

Chaque enregistrement récupéré sur ma base devra donc être stocké dans un tableau pour PHP.

Du coup, pour récupérer un enregistrement dans ce tableau, on va utiliser la fonction PHP destinée à mysql : mysql_fetch_array($TrucRecupereSurSql), pour être sûr de ne rien rater :

Ainsi l'on récupère un tableau associatif qui a pour indice... le nom de chaque champ.

C'est pas plus pratique comme ça ?

VII-1-a - Pour travailler proprement (Généralités)

Voici cette fois l'ordre logique pour un code PHP propre qui lance une requête sql

1. On se connecte à la base (en utilisant notre fonction de connexion toute prête).

2. On prépare la commande sql en la stockant dans une variable PHP du type $sql (pour langage sql).

3. On la lance, en récupérant le résultat dans une variable que nous appellerons $req (pour requete sql et qui pourra être un tableau si le résultat dépasse un élément).

4. Si c'est un tableau : On scanne $req avec une boucle while (car on ne sait pas toujours le nombre de champs, ni d'enregistrements) et grâce à la fonction mysql_fetch_array($req), chaque élément de ce tableau se convoquera ainsi : $data['champ'].

5. Maintenant qu'on a tout récupéré dans des variables "solides" PHP, on libère la mémoire sql mobilisée par cette requête.

6. On ferme la connexion sql.

Maintenant le code devrait vous paraître moins barbare...

VII-1-b - Le code pour récupérer toutes les filles

Je souhaite construire une page infos.php qui affiche toutes les infos sur toutes les filles dans ma base MaBase, table utilisateurs.

Un code de récupération de données sql : Où sont les femmes ?

<?php
include("fonctions.php");
?>
<html>
<head><title>TOUTES LES INFOS SUR LES INSCRITS DU SITE</title></head>
<body>
<?php
//On se connecte
connectMaBase();

// On prépare la requête
$sql = 'SELECT * FROM utilisateurs WHERE sexe="F"';

// On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

//on organise $req en tableau associatif  $data['champ']
//en scannant chaque enregistrement récupéré
//on en profite pour gérer l'affichage

//titre de la page avant la boucle
echo'<h2>TOUTES LES FILLES INSCRITES :</h2>';

//boucle
while ($data = mysql_fetch_array($req)) {
// on affiche les résultats
echo 'Pseudo : <strong>'.$data['Pseudo'].'</strong><br />';
echo 'Son âge : '.$data['Age'].'<br />';
echo 'Sa date d\'inscription : '.$data['DateInscription'].'<br /><br/>';
}
//On libère la mémoire mobilisée pour cette requête dans sql
//$data de PHP lui est toujours accessible !
mysql_free_result ($req);

//On ferme sql
mysql_close ();
?>
</body>
</html>

C'est beau hein ? Et bon, ça marche.
Testez, bidouillez, triturez...
Cherchez les hommes, cherchez les gens âgés de plus de tel âge etc...

Bref, familiarisez vous avec le code avant d'attaquer le paragraphe suivant, qui pousse un peu plus loin...

VII-2 - Un exemple (plus complexe) de relation dynamique entre PHP et SQL

Creusons ce chapitre pour aborder une idée supplémentaire :

Vous souhaitez laisser à l'utilisateur (imaginons que vous programmez une partie administration ou back office d'un site) le choix de son critère de recherche.
Il entre dans un formulaire les critères choisis, et votre code fait le reste.

Cela signifie que l'on veut obtenir une variable $sql du type :

$sql = 'SELECT * FROM utilisateurs WHERE '.$champ.'="'.$critere.'"';

Ne restent plus qu'à proposer un formulaire où l'administrateur entrera son choix de champ et de critère...
Il faut donc lui construire la liste de champs sous forme de liste déroulante en "tapant" dans la base une première fois : il n'est pas censé connaître la base par coeur...

Quelle requête pouvons nous faire pour récupérer tous les champs d'une table ?

Recherche tous les champs de la table utilisateurs :

SHOW fields FROM utilisateurs

Bon ben, ya plus qu'à !

Partie admin du site : exemple de codage de back-office

<?php
include("fonctions.php");
?>
<html>
<head><title>ADMINISTRATION DU SITE</title></head>
<body>
<h2>Choisissez le champ qui vous intéresse et entrez manuellement un critère</h2>
<h4>Une absence de critères vous montre toutes les données du champ</h4>
<!--
Commentaires HTML
On construit une liste déroulante ( un select et plusieurs options)
Chaque option sera remplie par une donnée SQL récupérée par notre requête PHP
-->
<form method="post" action="admin.php">
<select name="champ">
<?php
//On se connecte
connectMaBase();
//On prépare la requête SQL qui récupère les champs
$sql = 'Show fields from utilisateurs';
/* On lance la requête (mysql_query)
et on impose un message d'erreur si la requête ne passe pas (or die) */
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
//On scanne le résultat et on construit chaque option avec
while($data = mysql_fetch_array($req)){
// on affiche chaque champ
echo '<option name="'.$data['Field'].'">'.$data['Field'].'</option>';
}
//On libère mysql de cette première requête
mysql_free_result ($req);
//On ferme le select
?>
</select>
Entrez votre critère de sélection sur ce champ : <input type="text" name="critere"/>
<input type="submit" name="Valider" value="OK"/>
</form>
<!--
On ferme le formulaire
-->
<?php
//On traite le formulaire
if(isset($_POST['Valider'])){
$champ=$_POST['champ'];
$critere=$_POST['critere'];

// On prépare la requête
//requête différente selon qu'on veut tout le champ
//ou un champ avec une condition
if(($critere=='')||($critere==NULL)){
$sql='SELECT '.$champ.' FROM utilisateurs';
}
else{
$sql = 'SELECT * FROM utilisateurs WHERE '.$champ.'="'.$critere.'"';
}
/* On lance la requête (mysql_query)
et on impose un message d'erreur si la requête ne passe pas (or die)*/
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

//Affichage du résultat
echo'<h2>Résultat</h2>';

//On scanne chaque résultat et affiche
while($data = mysql_fetch_array($req)){
/* on affiche les résultats
C'est pas très propre mais la fonction print_r vous permet de tout voir sur votre objet tableau :
Quand vous êtes complètement perdu sur ce que votre tableau est censé comporter :
Tapez cette commande print_r($tableau),
vous retrouverez facilement la structure du tableau (index et valeurs)*/

print_r($data);
echo'<br/>';
}
//On libère la mémoire mobilisée pour cette seconde requête dans SQL
mysql_free_result ($req);

//On ferme sql
mysql_close ();
}
?>
</body>
</html>

VII-3 - TP7

Repartez de la correction du TP6 qui gérait la table abonnements.

Si ce n'est déjà fait, récupérez les fichiers abonnement.php, fonctions.php et veillez à construire la table abonnes dans phpMyAdmin.

Insérez (via le formulaire) au moins 10 enregistrements en variant largement les données du type age, civilité et Code Postal.
Si vous manquez totalement d'imagination, voici un exemple :

Un exemple d'abonnés à nos abonnements

Maintenant, construisez la partie administration dans un fichier infoabo.php qui se présente ainsi :

Bonjour à l'administrateur du site.

Vous souhaitez voir : (proposez une liste déroulante avec les 6 options ci dessous) et un bouton OK.

Toutes les dames et demoiselles abonnées (commentaire : sous la forme Mme DUPONT Sandrine)

Tous les messieurs abonnés

Tous les abonnés qui ont moins de 30 ans

Tous les abonnés qui ont 30 ans ou plus

Tous les abonnés par magazine (commentaire : on veut titre du mag : tous les abos etc... 4 fois)

Tous les codes postaux des abonnés (juste les codes postaux)

Quand l'administrateur clique OK, l'info sélectionnée apparaît propre en dessous du formulaire de départ, ce qui lui permet de recommencer à loisir ces recherches.

Ajoutez enfin un bouton quitter, qui vous ramène à la page abonnement.php.

Et une fois n'est pas coutume, vous pouvez copier-coller tout ce que vous voulez !
(heu, sauf la correction qui suit bien sûr)...

VII-4 - Correction du TP7

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

infoabo.php

<?php
/*Si user a cliqué sur retour à la page d'accueil, redirection
ATTENTION : un header location se met toujours en toute première instruction (et avant le html)
Il ne tolère pas même un return (ligne vide) auparavant...
*/
if(isset($_POST['quitter'])){
header("location: abonnement.php");
}
//Intégrer le fichier des fonctions
include("fonctions.php");

/*Gérer le problème de l'affichage dans le select de l'option sélectionnée
sinon on reste bloqué au cas women à chaque rafraîchissement de la page
même si le reste du code s'exécute parfaitement*/

//Si user a cliqué ok après avoir choisi une info
//initialise $info en fonction

if(isset($_POST['info'])){
$info=$_POST['info'];
}

//valeur par défaut à l'arrivée

else{
$info="women";
}

/*voir suite dans les ajouts PHP dans le select
affiche l'option selected le cas échéant*/
?>
<html>
<head><title>Information sur les abonnés</title></head>
<body>
<h1>Bonjour à l'administrateur du site</h1>
<h2>Vous souhaitez voir :</h2>
<form name="info" method="post" action="infoabo.php">
<select name="info">
<option value="women" <?php if($info =='women') { echo 'selected'; } ?>>Toutes les dames et demoiselles abonnées</option>
<option value="men" <?php if($info =='men') { echo 'selected'; } ?>>Tous les messieurs abonnés</option>
<option value="jeunes" <?php if($info =='jeunes') { echo 'selected'; } ?>>Tous les abonné(e)s de moins de 30 ans</option>
<option value="vieux" <?php if($info =='vieux') { echo 'selected'; } ?>>Tous les abonné(e)s de 30 ans ou plus</option>
<option value="mag" <?php if($info =='mag') { echo 'selected'; } ?>>Tous les abonné(e)s par magazine</option>
<option value="CP" <?php if($info =='CP') { echo 'selected'; } ?>>Tous les codes postaux des abonné(e)s</option>
</select>
<input type="submit" name="valider" value="OK"/><br/>
<input type="submit" name="quitter" value="Retour à la page d'accueil"/>
</form>
<?php
/*attention à la gestion des libérations de mémoire
c'est à la fin de chaque requête différente
Plusieurs peuvent donc se succéder
tandis que la connexion à la base et la déconnexion
ne se font qu'une seule fois quand la base entre ou sort du jeu*/

//Commun à n'importe quelle option

if (isset ($_POST['info'])){

//connexion initiale de la db
connectMaBase();

//Gérer chaque choix :
if($info=='women'){
$sql='SELECT * from abonnes WHERE Civ="Mme" || Civ="Mlle"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
mysql_free_result ($req);
}
elseif($info=='men'){
$sql='SELECT * from abonnes WHERE Civ="M."';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
mysql_free_result ($req);
}
elseif($info=='jeunes'){
$sql='SELECT * from abonnes WHERE Age<30';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
mysql_free_result ($req);
}
elseif($info=='vieux'){
$sql='SELECT * from abonnes WHERE Age>=30';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
mysql_free_result ($req);
}

/*cas particulier du mag : il s'y imbrique des conditions successives qui s'ajoutent
(succession de simples if)
pour afficher tous les magazines*/
elseif($info=='mag'){
$sql='SELECT * from abonnes WHERE abo="oeil"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

/*Point besoin d'afficher si personne n'est abonné à ce mag
donc encadrer l'affichage dans condition*/

//si requete non nulle
if ($req!=NULL){
echo'<h3>Liste des abonné(e)s à "J\'ai l\'oeil vif".</h3>';
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
}
mysql_free_result ($req);

$sql='SELECT * from abonnes WHERE abo="pied"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
if ($req!=NULL){
echo'<h3>Liste des abonné(e)s à "J\'ai le pied marin".</h3>';
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
}
mysql_free_result ($req);

$sql='SELECT * from abonnes WHERE abo="main"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
if ($req!=NULL){
echo'<h3>Liste des abonné(e)s à "J\'ai la main verte".</h3>';
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
}
mysql_free_result ($req);

$sql='SELECT * from abonnes WHERE abo="rate"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
if ($req!=NULL){
echo'<h3>Liste des abonné(e)s à "J\'ai la rate qui se dilate".</h3>';
while ($data = mysql_fetch_array($req)) {
echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
}
}
mysql_free_result ($req);
}

/*cas particulier du CP
On veut juste la liste de toutes les valeurs que peut prendre ce champ
donc pas de where restrictif*/

elseif($info=='CP'){

$sql='SELECT CP from abonnes';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
echo'<h3>Tous les codes postaux de nos abonnés</h3>';
while ($data = mysql_fetch_array($req)) {
echo $data['CP'].'<br/>';
}
mysql_free_result ($req);
}
else{
echo'Vous n\'avez rien sélectionné ?';
}
//clôture finale de la db
mysql_close ();
}
?>
</body>
</html>

VIII - PHP ETAPE 8 : CONCLUSION

VIII-1 - En guise de conclusion

Programmer en PHP, c'est garder à l'esprit constamment les généralités qu'il y avait dans cette introduction :

à savoir ce que peut PHP, et ce qu'il ne peut pas, ou pas bien, en relation avec la façon dont il fonctionne.
Je vais répéter cela de façon très carrée.

Avant de développer quoi que ce soit d'un peu ambitieux en PHP, comme un projet même petit, il faut inscrire ceci :

A quelles actions de l'utilisateur je vise quelles réactions dans mon code ?

En sachant que les actions que peut recevoir PHP, c'est essentiellement un submit, qui envoie des informations fournies par l'utilisateur, et c'est au rafraîchissement de la page occasionné par le submit qu'on peut programmer des instructions nouvelles en fonction des informations reçues.

C'est déjà pas mal.

VIII-1-a - PHP, un langage qui ne peut pas tout

Mais cela signifie que le concepteur du projet doit avoir en tête à l'avance toutes les actions de l'utilisateur avec lesquelles il veut interagir.

Tout se passe du côté du serveur, et doit être programmé d'avance.

Il y a d'autres langages qui se passent du côté client, du côté de l'utilisateur et sont susceptibles de réagir au moindre de ses battements de cil. Ce n'est pas le cas de PHP !

Pour parler d'un problème très concret et qui revient toujours en PHP : les contrôles de saisie.

Nous avons vu dans ce tutoriel comment remplir et traiter des formulaires avec PHP.
J'ai fait le choix de ne pas aborder, et pour cause, tout l'aspect contrôle de saisie.
A peine l'ai-je effleuré en vous disant une fois 'N'oubliez pas maxlength="10"' dans les attributs d'une zone de texte qui propose la saisie d'un téléphone.
Et encore n'était-ce pas du PHP, mais du HTML !

Le contrôle de saisie, c'est ce genre de choses.
Limiter et prévenir les erreurs, doublons, coquilles, maladresses, plaisanteries qui sinon se retrouvent directement dans votre base de données et la rendent pratiquement inutilisable à court terme.

Ainsi aurait-on dû également forcer la saisie de nombres pour le code postal à 5 etc...

Autre chose, vous avez sans doute en travaillant ce tuto cliqué parfois plusieurs fois sur un formulaire et vous êtes aperçu ensuite que la même valeur était du coup entrée plusieurs fois, autant de fois que vous avez cliqué.
C'est normal, rien dans votre code n'interdisait la saisie de doublons, qui se retrouvaient donc inéluctablement dans la base de données !

Pour gérer tout ceci, très utile donc, on préfèrera traditionnellement le sous-traiter soit à un langage comme javascript (non, on ne le dira jamais assez, ça n'a rigoureusement rien à voir avec java, qui est un autre langage)...

Javascript est un langage côté client qui réagit très souplement aux événements de l'utilisateur.
Ceci dit, javascript limitera grandement le taux d'erreurs des gens de bonne foi, mais pas des plaisantins qui ont désactivé le javascript sur leur navigateur !

Donc pour plus de sûreté, on combinera un formatage serré dans notre HTML et on programmera des regex (regular expressions) dans notre code PHP.
Je n'entrerai pas dans les arcanes des regex ici, mais sachez juste que c'est un type de code qui permet un formatage très rigoureux que l'on peut personnaliser à souhait et qui, côté serveur, permet de tester les données entrées avant de les insérer dans une base.

Vous y viendrez si vous voulez programmer des contrôles de saisie efficaces en PHP.

Dans tous les cas, l'idée est la suivante, PHP doit recueillir des infos "propres" et homogènes dès qu'on lui fait manipuler des bases de données.

VIII-1-b - Conceptualisation d'un projet PHP

Ayez le réflexe de raisonner en bloc, de façon modulaire...

Une méthode de travail rigoureuse

1. Recensez toutes les actions que vous solliciterez de la part de l'utilisateur.

2. Notez toutes les variables que vous aurez besoin d'initialiser ou d'affecter pour avancer.

3. En vue du switch qui organisera la structure générale de votre programme, nommez ces blocs par exemple case 'debut', case 'inscription', case 'confirmation', case'erreur' etc.

4. Rangez toutes les instructions dans ces blocs... Vérifier que chaque bloc est fonctionnel avant de passer au suivant...

5. Enfin, vérifiez bien le déclencheur qui vous fait entrer dans chaque bloc d'instructions. Il a cliqué sur tel bouton que je lui présente dans tel bloc, il n'a rien cliqué etc...

Ainsi, quand vous avez tout cela clair en tête : vous pouvez vous lancer dans la structure de votre page, qui peut se présenter ainsi, en partant de la condition des écrans les plus avancés et en remontant jusqu'à l'écran d'arrivée...

Le mot clé sera MODULARISER.

une structure type

<?php
/****************************Actions de l'utilisateur***********************/
//il a cliqué confirmer

if(isset($_POST['confirmer'])){
$bloc='insertionbase';
}
//il a cliqué form2

elseif(isset($_POST['validForm2'])){
$bloc='traiteform2';
}
//il a cliqué valider formulaire1

elseif(isset($_POST['validForm1'])){
$bloc='traiteform1';
}
//il arrive juste
else{
$bloc='accueil';
}
/***************************Blocs d'instruction***************************/
/*Signalons au passage que si l'ordre était primordial dans notre floppée de if
Il n'a plus aucune importance dans nos blocs d'instructions !
Aussi on peut reprendre l'ordre chronologique et intuitif.*/

switch($bloc){
case 'accueil':
//toutes les instructions de présentation du formulaire1
break;
case 'traiteform1':
//toutes les instructions de traitement du formulaire1
//appel fonction machin
//présentation du form2
break;
case 'traiteform2':
//toutes les instructions de traitement du formulaire2
//appel fonction truc
break;
case 'insertionbase':
//appel fonction connexion
//toutes les modifications de base de données
}
?>

Ainsi la structure de votre programme, même si le programme est touffu, est claire comme de l'eau de roche.

VIII-2 - Quelques réflexes pour progresser en PHP

PHP est un excellent langage pour démarrer la programmation.

Il est assez intuitif et peu contraignant. Il est très gratifiant et vous donne vite des ailes.
Si déjà vous sortez de ce tutoriel avec les réflexes suivants, vous en aurez vite un usage très fluide.

Une dernière liste de conseils de Mamie Dendrite

- Bien indenter votre code.

- Bien repérer les actions très répétitives et les "ranger" dans des fonctions bien conçues.

- Bien faire des commentaires pédagogiques pour vous même dans votre code de débutant pour toujours savoir qui fait quoi à quel moment.

- Quand vous ne comprenez pas pourquoi un code ne marche pas, ne continuez pas de changer des choses au hasard. Arrêtez-vous. Vérifiez étape par étape que chaque module fonctionne.

- Quand le module fatidique est cerné, le forum est là pour vous désembourber en un quart de tour avec des développeurs chevronnés !

- Entreprenez un vrai projet personnel, comme le développement d'un site qui vous tient à coeur. Rien de tel pour vous porter que le souffle d'un projet web qui vous inspire !

Bon vent !

Et allez, quittons-nous sur un TP un peu plus costaud que les précédents, qui ne sera pas le plus bavard pour autant !

VIII-3 - TP8

Dans la correction du TP5, nous nous attelions au problème des nombres premiers.

Vous pouvez vous en inspirer, et même la copier/coller pour résoudre le problème suivant.

Vous rédigerez un programme (affichepremiers.php) qui affiche dès que l'on clique sur un bouton OK la liste des nombres premiers...
Disons en tout cas jusqu'à 10 000. Il faut bien poser une limite à l'utilisateur.
Après les avoir tous répertoriés (une ligne par nombre), il affiche leur nombre (x nombres premiers entre 0 et 10 000)...

Bon courage.

PS : rien ne vous empêche ensuite de copier coller tout ça dans un fichier texte et de continuer... 10 000 par 10 000... Quand on pense que de grands mathématiciens y passaient des nuits quand l'informatique n'existait pas !

VIII-4 - Correction du TP8

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.

Listing des nombres premiers jusqu'à 10 000

<html>
<head><title>Tous les nombres premiers</title></head>
<body>
<form method="POST" action="affichepremiers.php">
Prêt pour la liste des nombres premiers =>10000 ? <input type="submit" name="ok" value="OK"/>
</form>
<?php
if (isset ($_POST['ok'])){
$flag=0;
$compteur=0;
//Teste chaque nombre de 2 à 10 000
for($nombre=2;$nombre<=10000;$nombre++){
//Divise le par 2 puis 3 puis 4 etc...
for($i=2;$i<$nombre;$i++){
//S'il est multiple
//Allume le flag
if($nombre%$i==0){
$flag=1;
}
}
//Si le nombre est premier
//Ecris-le, et incrémente le compteur
if ($flag==0){
echo $nombre.'<br/>';
$compteur=$compteur+1;
}
//Dans tous les cas
//Remets le flag à zéro pour la suite
$flag=0;
}
//Quand tout est fini
//Affiche $compteur
echo'<h4>Il y a '.$compteur.' nombres premiers de 0 à 10 000.</h4>';
}
?>
</body>
</html>

Il ne vous aura pas échappé que le code précédent, certes tourne, mais il est diablement laborieux !
Par exemple, il est idiot de tester tous les nombres pairs, puisque l'on sait qu'un nombre premier (en dehors de 2) est forcément impair !

Aussi, comme Jpeg69 qui m'a soufflé l'idée de cet ajout, et s'est attelé à cette correction bis, nous allons procéder maintenant, pour ceux que le sujet intéresse, à une optimisation du code.
Vous aurez besoin de certains pré-requis pour vous en approcher.

4 pré-requis informatiques pour optimiser le code

- D'algorithmie tout d'abord... Sachez que pour savoir si un nombre est premier, on peut se contenter de vérifier qu'il n'est divisible par aucun des nombres premiers qui lui sont inférieurs, et mieux encore... On s'arrête à la racine carrée de ce nombre !

- Syntaxe : sqrt($nombre) renvoie la valeur de la racine carrée de $nombre.

- Syntaxe : array_pad($tableau,$index,$element) permet de remplir un tableau proprement.

- Syntaxe : la boucle {chaque instruction avec un point virgule} while(condition) est une variante de la boucle while... La différence, c'est qu'elle procède une fois à l'instruction AVANT de rentrer dans la boucle. Tandis qu'une boucle while "classique" ne fait rien tant que la condition n'est pas vérifiée.

A vous de jouer maintenant !

Le code optimisé de Jpeg69, merci à lui !

<?php
$flag=0;
//On initialise le tableau des nombres premiers.
$premier=array(2,3);
//Le compteur commence donc à 2.
$compteur=2;
//On écrit ces 2 premiers nombres.
echo '2<br/>3<br/>';

//Nombre testé
for($nombre=5;$nombre<=10000;$nombre++){

/*COMMENTAIRE GENERAL :
L'initialisation de l'index doit être avant le "do while", le premier diviseur doit être 3 et l'incrémentation doit être placée avant le "if".
En effet, voici les raisons données par Jpeg69 :

"A premiere vue cette incrémentation est trop tôt. Mais il est inutile de tester la division par 2.
On pourrait donc initialiser l'index directement à 1 et l'incrémenter après le test "if".
Mais la valeur du diviseur n'est plus la même entre le test dans le "if" et le test dans le "while".
Entre le test de la division et le test de supériorité à la racine carré du nombre testé.
De plus, ça génère des bugs dès le début.
Ainsi l'initialisation de l'index doit être avant le "do while", le premier diviseur doit être 3 et l'incrémentation doit être placé avant le "if"."
*/
//Initialisation de l'index du tableau des nombres premiers diviseurs
$i=0;
do {
$i++;
if ($nombre%$premier[$i]==0){
//C'est un nombre multiple d'un nombre premier inférieur à sa racine carrée
//Bref, ce n'est pas un nombre premier !
$flag=1;
}
}
//condition : tant que nombre pas premier et que nombre diviseur est inférieur à la racine carrée du nombre testé
while($flag==0 && $premier[$i]<sqrt($nombre));

//Si nombre premier : l'afficher, incrémenter le compteur, et alimenter le tableau des diviseurs premiers
if ($flag==0){
echo $nombre.'<br/>';
$compteur=$compteur+1;
$premier = array_pad($premier,$compteur,$nombre);
}
//Dans tous les cas, remettre le drapeau en berne pour la suite
$flag=0;
$nombre++;
}
//Affichage de fin
echo '<h4>Il y a '.$compteur.' nombres premiers de 0 à 10 000.</h4>';
?>

VIII-5 - Mes liens favoris pour l'apprentissage du développement web

VIII-5-a - Les tutos et cours Developpez.com

Un cours developpez.com pour apprendre XHTML

Un cours developpez.com pour apprendre les CSS

L'excellent cours PHP5 de developpez.com pour aller beaucoup plus loin, par notre maître Yogui !

Un cours developpez.com pour apprendre Javascript

VIII-5-b - D'autres tutos et cours qui m'ont beaucoup appris

Un excellent tutoriel pour apprendre de conserve HTML et CSS ("on repart de zéro", mais on arrive pourtant très loin !)

Un excellent tutoriel pour découvrir (avec des exercices corrigés) l'algorithmique en grand débutant

Un chouette tutoriel pour apprendre la syntaxe PHP vite fait pour débutant très très très pressé

VIII-6 - Remerciements

UN GRAND MERCI À CES TROIS MEMBRES du forum developpez.net

- Guillaume Rossolini alias Yogui, correcteur pointilleux et toujours fiable, pour m'avoir encouragée dans cette rédaction,

- bbil qui a répondu patiemment et toujours gentiment à mon millier de questions sur "l'éditeur à Nono",

- Nono40 pour avoir développé cet éditeur de fichiers xml qui aboutit à une présentation soignée.