Initiation à la programmation PHP

Gilles Thomassin

Ce document est placé sous licence Gnu Free Documentation Licence


Dédicace

Ce cours est dédié à tous les étudiants qui prennent du plaisir à apprendre et grâce auxquels j'ai du plaisir à enseigner, il est dédié aussi à la communauté PHP qui partage sans compter.

Table des matières

Avertissement
Introduction
Le PHP et son environnement
Pour quoi faire ?
La documentation
Pourquoi le PHP
PHP sur le net
Quelques conseils
Utilisation de logiciels libres
Qualité du code
Environnement de développement
Stratégie de développement
Principe général de fonctionnement
Architecture matérielle et logicielle
Architecture matérielle
Architecture logicielle
Premiers pas en PHP
Le PHP c'est du HTML
Les premières instructions
Commentaires dans les sources
Types de variables
Mixer le code PHP et le HTML
Structures algorithmiques de base en PHP
Les Structures alternatives
Les structures alternatives simples
Structure alternative Multiple
Les structures répétitives
Choix du type de boucle
Boucle 0,N
Boucle 1,N
Boucle X passages
Récupération d'informations saisies
Introduction
Utilisation de la queryString
Récupération de variables issues de formulaires
Contrôler que la saisie a été effectuée
Transmission de variables d'un script à un autre.
Autres zones de saisies
PHP niveau moyen
Les Tableaux
Les tableaux indexés numériquement
les checkbox et les select
Les Tableaux associatifs
Les tableaux à deux dimensions
tableaux prédéfinis du PHP
PHP confirmation
Inclusions de fichiers
Se servir de l'inclusion de fichier pour l'internationalisation
Inclusions pour harmoniser un site
Les fonctions
Les fichiers texte
Opérations de base
Les fichiers: Manipulations complexes des enregistrements:
Les fichiers à séparateurs
Les Sessions
L'authentification
Les accés concurrents
Contrôles de saisie
Contrôle côté client vs serveur les deux...
htmlentities ou la protection des pages affichées.
Lutter contre les moulinettes:
PHP et les bases de données
Généralités
Mysql
Utilisation de PHPMyAdmin
Travail sur la génération de mots de passe
L'envoi de mails
PHP,les variables et leur portée
Oracle triggers et procédures stockées
Génération d'images
Postgresql
Programmation réseau
Programmation Orientée Objet et PHP
Notion de classe d'objet.
Classes et instances
Démarche de conception d'une classe
Encapsulation
Constructeur
Héritage
Le polymorphisme et surcharge des méthodes
Conclusion

Liste des tableaux

1. Table de multiplication
1. Harmonisation
2. fonctions Mysql
3. Les fetchs

Liste des exemples

1. Commentaires de fin de ligne en PHP
2. Commentaire sur plusieurs ligne
3. Documentation d'une fonction phpdocumentor
4. Concaténation de chaînes
5. division entière
6. Conversion de type
7. alterner php et HTML
1. structure alternative simple
2. structure alternative simplifiée
3. Utilisation de la fonction date
4. fonction strftime
5. switch
6. Utilisation du break dans le switch
7. Boucle while(prop){}
8. do..while(...)
9. Affichage d'un tableau de 3 lignes et 4 colonnes contenant des zones de saisie.
1. méthode GET
1. initialisation de tableau
2. Parcours d'un tableau à l'ancienne
3. Parcours moderne d'un tableau
4. Initialisation tableau associatif
5. accés par clef à une cellule d'un tableau associatif
1. fonction racine
2. procédure avec paramètres
3. écriture d'une ligne dans un fichier
4. effacement d'un fichier
5. Fichier csv
6. Exemple de requête de mise à jour
7. table avec clef étrangère: Employe service
8. classe compte bancaire
9. classes et héritage

Avertissement

Il ne s'agit pas d'une référence sur le langage PHP.

Ce document permet l'apprentissage de la programmation.

Le sujet est le développement de sites web dynamiques à l'aide du langage PHP.

Il contient donc une progression sur les principaux concepts à mettre en oeuvre, algorithmiques ou liés au développement web, ou liés au langage PHP lui-même.

Chaque partie contient des exercices à coder impérativement pour assimiler les concepts.

Introduction


Le PHP et son environnement

Pour quoi faire ?

Le PHP est utilisé dans plusieurs domaines.

Le langage PHP est utilisé essentiellement dans le développement de sites web. Ces sites peuvent êtres publics (internet) ou privés (intranet). C'est un langage prévu pour générer des pages sur un serveur, ces pages sont ensuite visibles depuis n'importe quel poste disposant d'un navigateur internet sur le réseau.

Mais il peut être utilisé aussi pour l'écriture de scripts d'administration réseau ou d'administration du système non interactifs.

Enfin, associé à une bibliothèque du type GTK, il permet de créer des applications événementielles et à interface graphique complexe ne nécessitant pas l'usage d'un navigateur. Mais il s'agit là d'un usage non adapté.

La documentation

Outre les nombreux sites et ouvrages que l'on peut trouver sur le net ou dans les librairies, la documentation du langage se trouve sur le site officiel: Site officiel du langage PHP.

On trouvera aussi beaucoup de codes sources notamment dans les sites suivant:

Pourquoi le PHP

Contrairement à d'autres langages propriétaires, le PHP est un langage communautaire, ce qui assure sa pérennité. Personne ne peut en effet décider que le PHP est devenu obsolète et doit disparaître. Ainsi votre investissement en terme de formation pourra être rentabilisé.

PHP est un langage extrêmement riche puisqu'il profite de toutes les bibliothèques C existantes.

La philosophie du PHP incite au partage des sources, ceci permet de récupérer beaucoup de code utile et ainsi de développer plus vite.

Le modèle collaboratif permet de détecter et corriger plus rapidement les bogues. Le niveau de qualité obtenu est donc amélioré.

PHP est un langage très abordable, qui nécessite assez peu de compétences techniques. On peut développer aussi bien en style de programmation structuré qu'en programmation orientée objet. Les scripts obtenus fonctionnent sans nécessiter une architecture lourde.

PHP sur le net

D'après les sondages de w3techs, en avril 2014 81% des sites web font appel au langage PHP.

On observe également une forte tendance des entreprises à gérer leur propre serveur, ceci afin d'intégrer leur site web à leur système d'information.

On demande maintenant au webmaster, d'avoir des compétences en administration de base de données et de serveur web et donc d'avoir de solides notions réseau système et sécurité.

Quelques conseils

Utilisation de logiciels libres

Le piratage de logiciel est un acte délictueux. Le niveau de qualité de certains logiciels libres est suffisant pour développer de façon professionnelle. La valeur ajoutée que vous apportez est supérieure si vous ne demandez pas à l'entreprise d'investir dans des logiciels commerciaux.

On pensera donc à utiliser des logiciels libres pour l'édition, les bases de données, le serveur HTTP et le système d'exploitation. La plupart des serveurs http étant sous unix/linux, une bonne connaissance de ce système est indispensable.

Les outils permettant de mettre à jour son site à distance doivent être maîtrisés.

On évitera les éditeurs visuels, certes, il permettent de réaliser des pages sans connaître les balises,mais puisque justement il n'est pas forcément nécessaire de les connaître le développeur ne les apprend pas. Ces outils maintiennent donc le développeur dans la médiocrité.

Qualité du code

Le code HTML produit par le script PHP doit être strictement conforme à la DTD HTML. On utilisera donc le Le validateur HTML du W3c pour vérifier la conformité du code HTML produit.

Le code PHP doit être indenté et clair, avant tout bloc de code, on écrira en français ce que l'on souhaite faire sous forme de commentaire (algorithme).

On séparera la présentation du traitement en utilisant des feuilles de style. On ne réalisera pas les affichages par des echo mais en stoppant le script PHP ainsi le HTML sera visible avec un éditeur wysiwyg, le code HTML lui aussi sera commenté.

La réutilisation du code sera recherchée systématiquement, on essaiera d'écrire au maximum de façon modulaire en privilégiant l'usage des classes ou des fonctions.

Environnement de développement

Comme éditeur de source, nous adopterons Gvim, compromis entre puissance et convivialité. Un navigateur internet nous permettra de visualiser les pages créées par les scripts php. Le serveur http que nous utiliserons sera Apache2, et le module PHP sera installé.

Stratégie de développement

Il ne faut pas réinventer la roue, par conséquent, après analyse des besoins, une recherche sur le net sera réalisée , cette recherche portera non seulement sur le code, mais aussi sur des idées d'interface. Une recherche d'objets technique sera aussi réalisée. Les outils et idées récupérés seront adaptés au projet, et le développement des parties manquantes commencera.

Principe général de fonctionnement

1. PHP qu'est-ce que c'est ?

1.

PHP qu'est-ce que c'est ?

Le PHP est un langage de programmation.

Les programmes ou scripts écrits en PHP sont exécutés à la demande par une application tournant sur le serveur HTTP qui les héberge.

Le rôle de ce langage est de produire du contenu interprétable par les navigateurs web.

Les navigateurs WEB comme Netscape ou Iee, Opéra, Mozilla, chrome et consorts savent interpréter du HTML, du javascript, et divers formats graphique comme le gif, png, jpeg. Avec les plugins appropriés, ils peuvent aussi accepter le format flash ou le format PDF.

PHP est capable de générer de tels contenus.

Faire un site statique ou dynamique?

1. Pourquoi des programmes ?

1.

Pourquoi des programmes ?

Le web statique permet de mettre à disposition des documents. Le web dynamique lui permet de construire de véritables applications dotées de grandes capacités d'interactivité.

Le web statique:

Lorsqu'un navigateur web envoie une requête à un serveur, ie quand dans l'adresse on tape HTTP://www.google.com/index.html. Le serveur HTTP transmet au client par l'intermédiaire du réseau le contenu du fichier index.html. Au fur et à mesure de sa réception, le navigateur client en effectue la présentation.

Le web dynamique: Lorsqu'une requête HTTP arrive sur un serveur et concerne un script PHP exemple: HTTP://www.btsinfogap.org/suivant.php, ce n'est pas le contenu du fichier qui est transmis. Le script PHP est d'abord exécuté par une application, et c'est le résultat de cette exécution qui est transmis par le serveur HTTP au navigateur client.

En tout état de cause, le navigateur client ne reçoit que du contenu qu'il est capable de gérer. Voir les types «mime» de votre navigateur pour plus d'information sur les contenus qu'il est capable de gérer.

Architecture matérielle et logicielle

Architecture matérielle

Vous pouvez obtenir un espace sur un serveur pour tester vos scripts PHP. Il existe un certain nombre d'hébergeurs qui mettent à votre disposition un espace disque sur un serveur acceptant le langage PHP. On peut citer entre autres: www.ifrance.com,free, multimania, freephp.

Vous devez aussi faire tourner PHP sur votre propre machine même si elle ne dispose pas de carte réseau.

Architecture logicielle

Si vous décidez de mettre votre site en ligne, il vous faut: un navigateur web et un client ftp ou sftp (certains navigateurs web font aussi office de clients FTP). Il vous faut aussi un éditeur de texte avec si possible des fonctionnalités de coloration syntaxique. Vous pouvez opter pour Ultraedit ou PhPEdit ou PhPed si vous êtes sous windows. Sinon sous linux Gvim ou kwrite, vi ou emacs feront très bien l'affaire. Si vous souhaitez tester vos scripts en local et que vous êtes sous windows il faut installer un serveur web, un serveur de base de données et l'interpréteur PHP. Il existe des packs prêts à installer comme Easyphp ou wampserver . Sous Linux, les paquets sont disponibles pour toutes les distributions. En général, le choix d'installer Apache se fait dés l'installation de Linux, mais on peut aisément l'installer par la suite.

Premiers pas en PHP

Le PHP c'est du HTML

Consignes: Pour éditer cette page, vous vous servirez d'un éditeur de texte.

Créez un nouveau fichier et tapez-y le code suivant:

<html>
	<head>
		<title>
			BTS SIO GAP Le php sans douleur
		</title>
	</head>
	<body>
		<h1>Super le script</h1>
		<p>Ceci est du code HTML envoyé tel quel au client.</p>
	</body>
</html>
					

Sauvez ce fichier avec l'extension ".php" dans un des répertoires publié par Apache puis interrogez votre page depuis un navigateur en utilisant bien sûr le protocole HTTP. HTTP://nomduserveur/repertoire/premier.php

Vous vous apercevez que l'intégralité du fichier est transmise à votre navigateur.

1. Qu'en déduit-on ?

1.

Qu'en déduit-on ?

Un script PHP peut contenir du HTML. Et je dirais même plus, il peut ne contenir "que du HTML"

Les premières instructions

Nous allons maintenant glisser dans ce script quelques instructions.

<html>
	<head>
		<title>
			BTS SIO GAP Le php sans douleur
		</title>
	</head>

	<body>
		<H1>Super le script</H1>
		Ceci est du code HTML envoyé tel quel au client.
		<?php
			printf("cette instruction envoie du texte");
			echo("Et celle-ci aussi");
			$i=1; //ceci est une affectation
			echo (" la variable i vaut :$i");
		?>
	</body>
</html>
					

1. Que remarque-t-on ?

1.

Que remarque-t-on ?

  • Les instructions sont comprises entre les deux balises <?php ou <? et ?>. Tout le reste est envoyé tel quel au navigateur.

  • Les variables sont précédées d'un dollar "$".

  • Toute instruction est terminée par un ";"

  • On envoie du texte soit par un echo soit par un printf.

Commentaires dans les sources

Comme tout bon code, les scripts PHP doivent être commentés. On dit ce que l'on va faire en français avant de l'écrire en langage de programmation. Les commentaires sont définis comme en langage c ou c++ ou javascript : un commentaire en fin de ligne doit être précédé de "//". Une syntaxe particulière des commentaires permet de générer une documentation technique avec doxygen ou avec phpdocumentor à consommer sans modération.

Exemple 1. Commentaires de fin de ligne en PHP

phpinfo(); //affichage de la configuration PHP du serveur
						


Un commentaire sur plusieurs lignes est quand à lui compris entre /* et */

Exemple 2. Commentaire sur plusieurs ligne

/*******************************************************
ce script a pour but de:....
L'auteur est :
pour toute info complémentaire contacter ...
******************************************************/
						


Les commentaires ne sont pas exécutés par le serveur HTTP. Ils ne sont pas transmis non plus au navigateur client. Ils ne sont visibles que lors de la visualisation ou de l'édition du code source php.

Exemple 3. Documentation d'une fonction phpdocumentor


<?php
 /**
  * Sommaire indiquant au lecteur ce que fait la fonction
  *
  * Une *description*, eventuellement sur plusieurs ligne donnant les détails techniques 
  * 	sur la fonction 

  * @param string $myArgument Description du paramètre attendu
  *
  * @return type du résultat renvoyé par la fonction void s'il s'agit d'une procédure
  */
  function myFunction($myArgument)
  {
    //le code ici
  }

					


A noter que des commentaires "normalisés" permettent de générer de belles documentations techniques sans effort avec doxygen ou phpDocumentor.

Types de variables

Les variables en PHP ne sont pas déclarées. Le typage est dit "faible" et "dynamique" On distinguera pour l'instant trois types de variables:

  • entier (int) entiers positifs ou négatifs

  • réel (double) nombre à virgule positifs ou négatifs

  • chaîne (string)

Chaînes de caractères et séquences d'échappement

Les chaînes sont délimitées par des doubles quotes ", ou des simples quotes '.

Quand elles sont délimitées par des doubles quotes, elles acceptent les séquences d'échappement standard:

  • \n: nouvelle ligne

  • \r: retour à la ligne

  • \t: tabulation horizontale

  • \\: backslash

  • \$: dollar

  • \": double quote

  • \': simple quote

Les chaînes comprises entre doubles quotes " permettent l'expansion des variables et les séquences d'échappement sont activées. Les chaînes comprises entre simples quotes ' ne permettent pas l'expansion des variables, et les séquences d'échappement sont désactivées.

Concaténation de chaînes

L'opération qui consiste à mettre bout à bout deux chaînes de caractères s'appelle la concaténation. L'opérateur de concaténation de chaînes est le point ".".

Exemple 4. Concaténation de chaînes

/*Extrait de code concaténation*/
$prenom="Jean";
$nom=" Dupond";								
$nomComplet=$prenom.$nom;//concaténation
echo $nomComplet;
						


Les opérateurs

  • Opérateurs travaillant sur des entiers ou des réels :

    • + addition

    • - soustraction

    • * multiplication

    • / division réelle

    • % reste d'une division euclidienne appelé aussi modulo

      Exemple 5. division entière

      $resultat=10%3;
      echo 'Le résultat est:'.$resultat;
      										

      Le programme affichera:

      Le résultat est:1


  • Opérateur d'affectation: =

    à noter: $nom='Dupond' se lit comme ceci: $nom reçoit 'Dupond'

  • l'opérateur & renvoie l'adresse d'une variable (voir plus tard passage des variables par référence)

  • Opérateurs de comparaison:

    • == égalité

    • != différent

    • < inférieur

    • <= inférieur ou égal

    • > supérieur

    • >= supérieur ou égal

  • ++ -- incrémentation ou décrémentation (pre et post)

  • Les opérateurs logiques:

    • and && et

    • or || ou

    • xor ou bien

    • ! négation

  • .= concaténation de chaînes de caractères

Conversion de type

Rappel des différents types:

  • int

  • double

  • string

Il est possible de transformer un entier en réel ou un réel en entier, une chaîne en entier ...

Le transtypage (conversion de type) s'effectue comme en langage c : (int||double||string||array||object) {variable || constante}

Exemple 6. Conversion de type

$monEntier=(int)($monReel);
						


On indique le nom du type que l'on souhaite obtenir entre parenthèses devant la variable à transformer.

Exercices sur variables, affectation, types

  1. Exercice 1.1: Echange du contenu de deux variables.

    Echange du contenu de deux variables.

    Aprés avoir mis 10 dans la variable $V1 et 15 dans la variable $V2, vous permuterez le contenu des deux variables et en afficherez les valeurs.

    Affichez aussi la moyenne des deux variables.

  2. Exercice 1.2

    Remplacer la partie 1 dans le script PHP suivant:

    <?
    $maVariable=<partie 1>;
    echo("\$mavariable vaut $maVariable").
    ?>
    					

    de façon à ce qu'à l'exécution le script affiche:

    $maVariable vaut (/*\ "''"/*\)

  3. Exercice 1.3

    Ecrire un script PHP qui convertit et affiche 256486 secondes en heures minutes, secondes.

Mixer le code PHP et le HTML

On peut alterner indéfiniment code PHP et code HTML.

Exemple 7. alterner php et HTML

<body>
	<h1><? echo $message;?></h1>
	<hr/>
	<? 
		echo 'Tu vas bien ?';
		echo $nom;
	?>
	<br/>
</body>
						


Remarquez qu'ils peuvent être mélangés à souhait pourvu que les délimiteurs de script soient équilibrés.

Structures algorithmiques de base en PHP


Les instructions sont par défaut exécutées en séquence (les unes à la suite des autres).

Mais il est heureusement possible de contrôler l'exécution des instructions de façon plus fine. Par exemple, on peut n'effectuer une instruction que sous certaine condition. Ou alors on peut répéter un groupe d'instruction un certain nombre de fois. Dans le premier cas on parlera de structure alternative et dans le second de structure répétitive.

Les Structures alternatives

Les structures alternatives permettent l'exécution conditionnelle d'un bloc de code.

Les structures alternatives simples

Structure alternative siAlorsSinonFsi

Syntaxe:

if(prop)
{
	bloc1...
}
else
{
	bloc2...
}
				

C'est la structure de test générale.

Elle se lit comme ceci: si la proposition logique "prop" est vérifiée alors exécuter les instructions contenues dans le bloc1 sinon exécuter les instructions du bloc2.

Exemple 1. structure alternative simple

if ($nom=='Dupond')
{ 
	echo '<p>Bonjour patron</p>'; 
	echo '<h2>Bienvenue sur le site</h2>';
} 
else
{
	echo "bienvenue $nom sur notre site";
}
							


Structure alternative siAlorsFinSi

Il existe aussi une structure alternative simplifiée similaire à la structure alternative simple mais ne disposant pas du bloc sinon:

Exemple 2. structure alternative simplifiée

if ($nom=='ADMIN')
{ 
	echo 'Bienvenue admin';
	echo '<a href="admin.php">Lien vers la page d'administration</a>';
} 
echo 'ceci est le site par défaut';
							


Exercices sur les stuctures alternatives siAlorsFinSI et siAlorsSinonFinSI

Exercice n° 2.1 Travail sur le jour de la semaine: On se propose sur notre site, d'écrire soit bon travail soit bon week-end en fonction du jour de semaine.

On utilisera pour cela la fonction PHP date("l") qui renvoie une chaine contenant le jour de la semaine.

Exemple 3.  Utilisation de la fonction date

if(date("l")=='Monday') 
{
	echo "lundi, la semaine commence...";
}
							


Notre algorithme est donc le suivant:

si on est dimanche ou samedi alors 
	afficher bon weekend 
sinon 
	afficher bon travail.
finsi
						

Exercices

  • Exercice n° 2.2 Travail sur l'heure:

    Nous souhaitons maintenant afficher bonjour ou bonsoir en fonction de l'heure.

    Indication: On utilisera la fonction strftime('%H') qui renvoie l'heure dans un entier.

    Exemple 4. fonction strftime

    $heure=strftime('%H');


Structure alternative Multiple

PHP dispose aussi d'une structure permettant de comparer le résultat d'une expression à plusieurs valeurs et d'associer des instructions pour chacune de ces valeurs :

...
switch (variable)
{
	case valeur1: ...
	case valeur2: ... 
	[default: ...]
}
...
					

Voici un exemple de code utilisant la structure alternative multiple.

Exemple 5. switch

<?php
	$var = 4;
	switch($var) {
		case 1:
			print('$var est egal a 1');
			break;
		case 2:
			print('$var est egal a 2');
			break;
		case 3:
			print('$var est egal a 3');
			break;
		case 4:
			print('$var est egal a 4');
			break;
		default:
			print("\$var est different de 1, 2, 3 et 4");
	}
?>
					


Voici un autre exemple exploitant cette particularité :

Exemple 6. Utilisation du break dans le switch

<?php
	$jour = date('l');

	switch($jour) {
		case 'Monday':
		case 'Tuesday':
		case 'Wednesday':
		case 'Thursday':
		case 'Friday':
			print("<p>Bon Travail</p>");
			break;
		default:
			print("<p>Bon Week end<p>");
	}
?>
					


A partir du moment où l'on rentre dans un cas les instructions sont exécutées jusqu'au prochain break. On ne rentrera dans la section default que si aucun des cas précédent n'a été réalisé.

Exercices

  • Exercice 2.3:

    Modifier le script précédent de façon à ce qu'il affiche en plus à l'utilisateur le nombre de jour restant à travailler avant le week end.

Les structures répétitives

Choix du type de boucle

Les boucles servent à répéter un certain nombre de fois une instruction ou un bloc d'instructions.

On peut s'en servir par exemple lorsqu'il faut envoyer au navigateur client un certain nombre de lignes d'un tableau, on répéte alors l'envoie de la séquence <tr><td></td><td></td></tr>

On distingue 3 types de boucles différents que l'on choisi en fonction de la situation.

Si on connait le nombre de fois ou l'on va exécuter le bloc d'instruction, 
	on utilisera la boucle for(...;....;...){....}
Sinon
	Si le nombre de répétition appartient à [0..n] 
		on utilisera la boucle while(...) {...} //on peut ne pas passer ds la boucle.
	Sinon
		On utilisera la boucle do {...} while(...); 
	FINSI
FINSI
						

Boucle 0,N

syntaxe: while(proposition logique){bloc d'instructions};

Utilisation: Cette boucle est à utiliser lorsqu'on ne connait pas le nombre de passage dans la boucle, et qu'on peut ne pas y passer du tout.

Exemple 7. Boucle while(prop){}

while(file_exists('temp.lock'))
{
	sleep(4); //attendre 4 secondes
}
						


Tant que le fichier "temp.lock" existe on attend 4 secondes.

Boucle 1,N

syntaxe: do {blocd'instructions}while(proposition logique);

Utilisation: à utiliser lorsqu'on ne connait pas le nombre de passage dans la boucle, et qu'on sait qu'on doit y passer au moins une fois.

Exemple 8. do..while(...)

Obtention du nb de lancers de dés à effectuer pour obtenir le chiffre 3.

<?
	// initialisation du générateur de nombres aléatoires
	srand((double) microtime()*1000000);
	// initialisation à zero du nb de lancés
	$nbDeLancer=0;
	do
	{
		$nbDeLancer++; 		//incrémentation du nb de lancé de dé
		$nbTire=rand(1,6);	//tirage entre [1..6]
	}
	while (!(nbTire==3); 		// tant que non condition de sortie de boucle
?>
							


Boucle X passages

syntaxe:for(...;...;...){...}

Utilisation: la boucle for est à utiliser lorsque l'on connait lors de l'exécution de l'instruction le nombre de passage à effectuer dans la boucle.

Exemple 9.  Affichage d'un tableau de 3 lignes et 4 colonnes contenant des zones de saisie.

<?
	echo '<table>';
	for($ligne=0;$ligne<3;$ligne++)
	{
		echo'<tr>';
		for($col=0;$col<4;$col++)
		{
			echo('<td>');
			printf('<input type="text" name="monTableau[%d,%d]">',$ligne,$col);
			echo('</td>');
		}
		echo'<tr>';
	}
	echo '</table>';
?>
							


Exercices sur les boucles

  1. Exercice 2.4

    Affichez les 10 premiers nombres impairs. On enverra une balise <br/> après chacun de façon à n'en afficher qu'un par ligne.

  2. Exercice 2.5

    Générer par programmation un tableau HTML de 1000 lignes et 3 colonnes.

  3. Exercice 2.6

    Affichez un tableau HTML de 1000 lignes et 3 colonnes (dont 1 ligne sur 2 sera grisée)

    On se servira de l'opérateur % pour obtenir le reste de la division entière d'un compteur par 2.

  4. Exercice 2.7

    Affichez un tableau HTML de 1000 lignes et 3 colonnes (dont 1 ligne sur 2 sera grisée)

  5. Exercice 2.8

    Faites un programme qui affiche la table de multiplication de 1 à 10 d'un nombre N quelconque fixé "en dur" dans le code du programme. La présentation de la table de multiplication doit être tabulaire:

    Tableau 1. Table de multiplication

    *12345678910
    4481216202428323640


Récupération d'informations saisies


Introduction

Il n'y a que deux façons de recevoir des informations dans un script:

  • Appeler le script lors de la validation d'un formulaire.

  • Appeler le script en ajoutant des paramètres dans la "queryString".

Utilisation de la queryString

Imaginons que l'utilisateur veuille obtenir le carré d'un nombre. Nous allons écrire le script suivant carre.php:

<?
	$nbSaisi=$_GET['nbSaisi'];
	$resultat=$nbSaisi*$nbSaisi;
	echo("Le carré de $nbSaisi est : $resultat");
?>
				

Pour que notre script reçoive bien une variable de nom $nbSaisi il faut que l'utilisateur appelle notre script comme ceci: http://notreserveur/carre.php?nbSaisi=5

Si l'utilisateur veut le carré de 68 il devra demander: http://notreserveur/carre.php?nbSaisi=68

Il est même possible que l'utilisateur fournisse 2 variables.

Supposons que l'utilisateur souhaite obtenir le résultat de la multiplication d'un nombre nb1 avec un nombre nb2. Nous allons lui écrire le script suivant multiplie.php:

<?
	$nb1=$_GET['nb1'];
	$nb2=$_GET['nb2'];
	$resultat=$nb1*$nb2;
	echo("$nb1 * $nb2= $resultat");
?>			
				

L'utilisateur qui veut multiplier 5 par 6 devra alors appeler le script comme ceci: http://notreserveur/multiplie.php?nb1=5&nb2=6

En réalité, on ne demande pas à l'utilisateur de telles choses.

Par contre on peut trés bien nous "programmeurs" utiliser cette méthode pour passer des variables à un script et ainsi le tester.

nous verrons ultérieurement qu'on pourra utiliser cette querystring pour former les url des ancres générées

Cette technique peut aussi être utile en ajax.

Récupération de variables issues de formulaires

L'entrée d'informations par un utilisateur s'effectue grâce à des formulaires HTML.

Créons un fichier HTML "identif.htm" contenant le formulaire suivant:

<form name="F_IDENTIFIE" method="POST" action="traite_form.php">
	<label for="nomCli">Nom :</label> <input name="nomCli" type="TEXT">
	<label for="prenomCli">Prénom :</label>Prénom <input name="prenomCli" type="TEXT">
	<input name="OK" type="SUBMIT" value="Envoyer">
</form>
				

La validation du formulaire va diriger le navigateur client vers le script "traite_form.php".

1. Comment dans ce script va-t-on pouvoir récupérer les valeurs des deux champs du formulaire?

1.

Comment dans ce script va-t-on pouvoir récupérer les valeurs des deux champs du formulaire?

Et bien comme ceci: listing du fichier traite_form.php

<?
	echo ("Bonsoir Monsieur $_POST['nomCli'] $_POST['prenomCli']");
?>
						

Analyse:

  • $_POST['nomCli'] contient bien la valeur tapée dans le champ "nomCli" du formulaire F_IDENTIFIE

  • PHP dispose donc d'autant de variables que le formulaire lui a transmis de données.

Contrôler que la saisie a été effectuée

Il est possible et conseillé de vérifier l'existence des variables avant de s'en servir. Il se peut en effet que l'utilisateur accède au script "traite_form.php" sans être passé par "identif.htm". :

if (isset($_POST['nomCli']))
{
	$nomClient=$_POST['nomCli'];
	$prenomClient=$_POST['prenomCli'];
	echo ("Bonsoir Monsieur ".$nomClient." ".$prenomClient);
}
else //il n'est pas passé par le formulaire, on le lui propose
{
	?>
	<form name="F_IDENTIFIE" method="POST" action="traite_form.php">
		<label for="nomCli">Nom</label> <input name="nomCli" type="TEXT" > * remplir ce champ<br>
		<label for="prenomCli">Prénom</label> <input name="prenomCli" type="TEXT">
		<input name="OK" type="SUBMIT" value="Envoyer">
	</form>
	<?
}
				

Si on n'a pas reçu de champ "nomCli" on affiche le formulaire de saisie qui rappellera le fichier lui-meme lors de la validation.

Une autre possibilité est d'utiliser la variable $PHP_SELF en lieu et place de traite_form.php. Cette variable contient en effet le nom du script en cours d'exécution.

Et une troisième possibilité est de ne rien mettre dans l'action en cas de validation, le script php interrogé s'appellera lui-même.

1. Quelles sont les différences entre les méthodes "POST" et "GET" des formulaires ?

1.

Quelles sont les différences entre les méthodes "POST" et "GET" des formulaires ?

Lors de l'expérimentation des deux méthodes, on s'aperçoit avec la méthode "GET" que les noms des inputs ainsi que leurs valeurs sont passées dans l'URL sous forme de queryString (cela vous rappelle quelque chose ?).

Exemple 1. méthode GET

http://www.ddd.fr/monScript.php?nom=dupond&prenom=jean


La méthode "POST" quand à elle fait passer les variables par le fichier d'entrée standard "stdin". Exactement comme si les informations étaient saisies sur le clavier du serveur HTTP.

Exercices sur les entrées d'informations par formulaire

  1. Exercice 3.1

    Réaliser un convertisseur Euro Dollar.

    Si vous n'avez pas reçu de valeur en euro faîtes afficher un formulaire de saisie qui demande à l'utilisateur de la saisir.

  2. Exercice 3.2

    Ecrire le script PHP qui calcule le montant d'un facture en demandant la quantité achetée et le prix unitaire HT du produit.

    Le taux de TVA est de 19.6%.

    Un taux de réduction de 5% est appliqué si la quantité est supérieure à 50. Et un taux de 10% est appliqué quand la quantité dépasse les 100 unités.

  3. Exercice 3.3

    Le directeur commercial de l'entreprise change de stratégie et demande à ses vendeurs d'appliquer les taux de réduction suivant :

    20% si la quantité est comprise entre 75 et 99,

    25% si la quantité est comprise entre 100 et 124,

    30% au dessus.

    Rectifiez votre script en conséquence.

  4. Exercice 3.4

    Affichez un tableau HTML de 1000 lignes et 3 colonnes remplies avec des zones de saisie

  5. Exercice 3.5

    Faites un script PHP qui affiche la somme des zones de saisie des 5 premières lignes du tableau précédent.

  6. Exercice 3.6

    Ecrire un script PHP qui affiche le plus grand de 2 nombres saisis par l'utilisateur.

  7. Exercice 3.7

    Ecrire un script PHP qui affiche dans l'ordre croissant 3 nombres saisis par l'utilisateur.

  8. Exercice 3.8

    Ecrire le script PHP qui à partir d'une date saisie par l'utilisateur affiche la date du lendemain.

Transmission de variables d'un script à un autre.

Lorsqu'il y a beaucoup d'informations à saisir, il est possible de le faire en plusieurs étapes.

Problème: un script ne reçoit que les input du formulaire appelant.

Solution: les input type="hidden".

Illustration:

Dans un premier formulaire, le nom et le prenom sont saisis.

Dans le script deux.php appelé lors de la validation de un.php on récupère les deux variables reçues du premier script et on les met dans des balises input cachées.

<input type="hidden" name="nom" value="<? echo $nom; ?>">
<input type="hidden" name="prenom" value="<? echo $prenom; ?>
				

puis on met les zones de saisie que l'on souhaite faire remplir:

<input type="text" name="ville" >
<input type="text" name="cpostal" >
				

Le script trois.php appelé par deux.php va donc maintenant recevoir 4 variables: $nom, $prenom, $ville et $cpostal.

Autres zones de saisies

Il n'y a pas que les input type= "text"

Il y a aussi les select, et textarea et les cases à cocher et les boutons radio comment récupérer les infos saisies ?

En ce qui concerne les textarea et les select à sélection simple, le mécanisme de récupération est le même que précédemment.

Mais pour le reste on utilisera les tableaux php que l'on voit au chapitre suivant.

PHP niveau moyen


Les Tableaux

On dispose en php de deux types de tableaux, les tableaux classiques et les tableaux associatifs.

Le contenu des tableaux n'est pas fixe, un tableau de 3 cases peut contenir 2 réels et une chaîne.

la taille des tableaux est dynamique, le nombre de case n'est pas fixé à l'avance

Les tableaux indexés numériquement

Initialisation:

Exemple 1. initialisation de tableau

$tabChiffre = array("un", "deux", "trois");
					


Accès direct aux cellules du tableau:

On accède à une cellule par son numéro. La première cellule a le numéro 0.

$tabChiffre[0] est donc la première cellule.

$tabChiffre[1] est la deuxième cellule elle contient "deux"

Les cellules sont en lecture/écriture: Dans l'instruction ci-dessous on affecte "salut" à la 3ième cellule du tableau monTab:

$monTab[2]='salut';
				

lecture du contenu d'une cellule:

echo $monTab[2];
				

Il est possible de connaitre le nombre de cellule que contient un tableau en appelant la fonction count(...).

$nbCellule=count($monTab);
				

Ajout d'une cellule à un tableau, il suffit de ne pas donner d'indice et l'ajout s'effectue.

$tabChiffre[]='quatre';
				

Algorithmes d'affichage de tous les éléments d'un tableau:

Exemple 2. Parcours d'un tableau à l'ancienne

for($noCel=0;$noCel<count($monTab);$noCel++)
{
	echo $monTab[$noCel];
}
				


Exemple 3. Parcours moderne d'un tableau

foreach($monTab as $val)
{
	echo $val;
}
				


les checkbox et les select

Les cases à cocher à contrario des boutons radio ont la particularité de pouvoir être plusieurs à être cochées en même temps. On récupérera les valeurs des cases cochées dans un tableau. Il suffit pour cela de rédiger son formulaire ainsi:

<form name=......>
	Cochez les sports que vous pratiquez:
	<input type="CHECKBOX" name="tabChoix[]" value="tennis">Tennis</input>
	<input type="CHECKBOX" name="tabChoix[]" value="equitation">Equitation</input>
	<input type="CHECKBOX" name="tabChoix[]" value="rando">Randonnée</input>
</form>
				

Les boîtes de selection ont aussi cette particularité quand la sélection multiple y est autorisé.

Choisissez vos candidats:
<select multiple name="tabCandidats[]">
	<option value="125">Louis Jean</option>
	<option value="145">Gérard Poussin</option>
	<option value="1250">Lucienne Rompt</option>
	<option value="132">Victorine Ludon</option>
</select>
				

Exercices sur les tableaux

  1. Exercice 4.1:

    Un hotel propose des chambres à 30 euros , on peut choisir aussi de prendre le petit déjeuner à 4 euros , le déjeuner à 12 et le dîner à 15. Etablissez le formulaire de réservation pour une journée, ainsi que le traitement calculant le montant de la facture.

  2. Exercice 4.2:

    Reprendre l'exercice précédent pour une réservation où le nombre de nuit est rentré par l'utilisateur.

Les Tableaux associatifs

Pour l'instant, on accédait à une case d'un tableau par son numéro. Il est possible en PHP d'associer une valeur de clef aux cellules d'un tableau. On peut ainsi grâce à ce mécanisme accéder aux cellules non plus en connaissant leur numéro d'ordre mais en connaissant la valeur de la clef associée.

Exemple 4. Initialisation tableau associatif

$tabCouleur=Array('rouge'=>"#FF0000",'vert'=>"#00FF00",'bleu'=>"#0000FF",'blanc'=>"#FFFFFF");
						


A la valeur de clef rouge on associe une cellule dans laquelle on met "#FF0000".

Accés par valeur de clef: On peut ensuite accéder à une cellule en indiquant la valeur de la clef.

echo "<font color=".$tabCouleur['rouge'].">";
					

[Attention]Attention

On peut aussi comme auparavant y accéder par son numéro d'ordre

echo "<font color=".$tabCouleur[0].">";
					

mais le code n'est pas aussi lisible.

Exercices

  • Exercice 4.3

    Reprendre l'exercice 4.1 de façon à ce que le montant des repas soit accessible grâce à une clef

    Exemple 5. accés par clef à une cellule d'un tableau associatif

    $prix=$tMontant["matin"];

    nous donnerait le montant du petit déjeuner etc...


Les tableaux à deux dimensions

Un tableau à deux dimensions est un tableau dont chaque cellule contient elle-même un tableau.

$tabCli=Array(
	"c1"=>Array("Dupond","Albert"),
	"c2"=>Array("Duval","Jean"),
	"c3"=>Array("Dumont","Louis"),
	"c4"=>Array("Copard","Simone")
	);
				

Ce tableau contient 4 cellules. Chaque cellule identifiée par la valeur de sa clef contient elle-même un tableau.

Pour afficher le prénom du client "c1" il faut faire

echo $tabCli["c1"][1];

Affichage du contenu de la deuxième cellule du tableau qui se trouve dans la cellule de tabCli dont la cle vaut "c1".

Exercices

  • Exercice 4.3

    • Faîtes afficher le code et le nom des clients prénomés "Simone".

    • Faîtes afficher dans un tableau HTML les codes, prénoms et noms de l'ensemble des clients contenus dans le tableau.

    • Ecrire un programme qui effectue l'addition de deux matrice carrées.

$tabCli=Array(
"c1"=>Array("nom"=>"Dupond","pnom"=>"Albert"),
"c2"=>Array("nom"=>"Duval","pnom"=>"Jean"),
"c3">Array("nom"=>"Dumont","pnom"=>"Louis"),
"c4"=>Array("nom"=>"Copard","pnom"=>"Simone")
);
				

On pourra ainsi accéder à $tabCli["c3"]["nom"].

Exercices

  • Exercice 4.4:

    La clé d'un produit est son code. Pour chaque produit, on souhaite connaître son libellé et son prix unitaire et la quantité en stock.

    On doit pouvoir accéder au prix unitaire du produit "chaussx7" comme ceci:

    echo $tabProduit["chaussx7"]["pu"];

    • Initialisez le tableau tabProduit avec au moins 5 produits.

    • Ecrire le script qui aprés avoir affiché le catalogue (ensemble des produits) calcule et affiche le montant total du stock de l'entreprise.

tableaux prédéfinis du PHP

Il existe en PHP des tableaux associatifs trés utiles:

  • $_GET contient les champs de la queryString

  • $_POST contient les champs d'un formulaire "posté"

  • $_SESSION contient les variables de session que nous verrons ultérieurement.

  • $_SERVER contient des informations sur le client comme par exemple son adresse ip

Pour déboguer un tableau il est possible d'utiliser la procédureprint_r($unTableau) qui affiche rudimentairement le contenu du tableau passé en paramètre.

PHP confirmation


Inclusions de fichiers

Inclure des fichiers se fait grâce à l'instruction include(nom du fichier); le fichier concerné est alors interprété comme s'il était situé dans le fichier en cours d'interprétation. L'inclusion de fichiers permet d'inclure des bibliothéques de fonctions, d'inclure des fichiers de paramètres, ou d'harmoniser les différentes pages d'un site.

Se servir de l'inclusion de fichier pour l'internationalisation

Au lieu d'afficher des messages en dur dans une langue choisie au départ, on affichera des variables.

Ainsi au lieu d'écrire echo "Bienvenue sur notre site" ; on écrira echo $welcome;

Les valeurs sont données aux variables en fonction de la langue choisie par l'internaute.

switch($lang)
{
	case "fr":include("french.php");break;
	case "en":include("english.php");break;
	default:include("english.php");
}
					

Voici le contenu du fichier french.php:

<?
	$welcome="Bienvenue sur notre site";
	$bonjour="bonjour";
	$identif="Vous devez fournir un login et un mot de passe valide";
?>
					

Voici le contenu du fichier english.php:

<?
	$welcome="Welcome to our site";
	$bonjour="hello";
	$identif="You must have a valid account to access this page";
?>
					

Ce principe est hautement recommandable, et il faut réellement éviter de mettre des messages en dur dans votre code.

Si vous éprouvez des difficultés à traduire les messages, rassurez-vous il y a des traducteurs qui font ça très bien.

Vous n'avez qu'à leur fournir le fichier qui contient les variables en anglais, ce qui vaut mieux que de confier le code entier.

Exercices

  • Exercice 5.1:

    Internationaliser le site de l'hotel.

Inclusions pour harmoniser un site

Il est souvent nécessaire afin de ne pas perdre l'internaute d'afficher des parties communes sur toutes les pages d'un même site.

C'est possible en créant des frames mais ce n'est pas forcément beau (ascenceurs) ni visible par tout le monde.

Une solution consiste à créer un tableau et à mettre les différentes parties communes dans des fichiers que l'on inclut ensuite.

Tableau 1. Harmonisation

vertvertvert
vertcontenu qui changebleu
bleubleubleu


Notre script php correspondant à la partie "contenu qui change" est constitué ainsi:

<?PHP
	include('partieverte.php');
	//tout le code de la page sera ici 
	echo ('ceci est le contenu de la partie blanche');
	//fin du code de la page
	include('partiebleue.php');
?>
			

Ceci implique que dans la partie verte se trouve une balise TABLE, une balise TR complète pour la première ligne celle-ci contenant 3 TD. Puis une TR non fermée avec une TD fermée et une ouverture de TD.

La partie bleue fermera la dernière TD de la partie verte comportera une TD complète puis une fermeture de TR. Puis une <TR> complète correspondant à la ligne 3 comportant 3 <TD>complètes enfin on trouvera la fermeture de la balise TABLE.

Exercices

  • Exercice 5.2:

    Mettre en oeuvre ce principe sur les différentes pages du site "HOTEL".

Les fonctions

Une fonction est un sous programme.

Alors qu'en algorithmique on classe les sous programmes en procédures et fonctions, en PHP comme en langage "C" on ne dispose que des fonctions. Les fonctions permettent de moduler son code, et d'écrire des composants logiciels réutilisables que l'on stocke dans des bibliothèques dîtes "de fonctions".

Il suffit ensuite d'inclure le fichier PHP qui contient la bibliothèque pour avoir accès aux fonctions qui la composent. Vous connaissez les fonctions depuis toujours.

Exemple 1. fonction racine

function racine($unNombre)
{
	if ($unNombre>=0)
	{
		return (pow($unNombre,0.5));
	} 
	else 
	{
		return(-1);
	}
}
				


La fonction racine comme on le voit renvoie un nombre grâce à l'instruction return. Elle renvoie -1 ou la racine du nombre. Elle accepte un paramètre il est placé entre parenthèses à la suite du nom de la fonction. Pour l'utiliser il suffit d'écrire :

 
echo racine(12); 
				

Exercices

  • Exercice 6.1:

    • écrire une fonction double qui renvoie le double d'une valeur reçue en paramètre.

    • L'utiliser pour afficher le double des 50 premiers entiers.

Une fonction peut recevoir plusieurs paramètres et ne rien renvoyer du tout il s'agit alors d'une procédure.

Exemple 2. procédure avec paramètres

Cette procédure affiche un titre de niveau variable en HTML:

<?
function titre($numero,$texte)
{
	$baliseDebut="<H$numero>";
	$baliseFin="</H$numero>";
	echo "$baliseDebut $texte $baliseFin\n";
}

//on l'utilise comme ceci:
 

	titre(1,"super site");
	titre(2,"Introduction");
	titre(2,"developpement");
	titre(3,"partie1");
	titre(3,"partie 2");
	titre(2,"conclusion");
	...
?>
					


Exercices sur les fonctions et procédures

  1. exercice 6.2

    Ecrire une procédure affichant un select ayant pour contenu les cellules d'un tableau passé en paramètre. afficheSelect($nomDuSelect,$tabPays,"Choisissez votre langue")

  2. exercice 6.3

    Ecrire une fonction affichant une liste d'options mutuellement exclusives avec le contenu d'un tableau passé en paramètre. afficheRadio($nomDesRadios,$tabChambre,"type de chambre")

  3. exercice 6.4

    Même exercice que le 6.3 mais avec des cases à cocher à la place des boutons radio.

Les fichiers texte

Premier moyen de stockage permanent sur disque, les fichiers sont encore beaucoup utilisés pour y stocker par exemple: du html, des images, du php, ou des informations laissées par les utilisateurs.

Opérations de base

Ouverture d'un fichier

Un fichier pour pouvoir être utilisé doit tout d'abord être ouvert.

On obtient alors un "handle" de fichier.

    $monFic=fopen("donnees.dat","r");
					

C'est la variable $monFic qui reçoit aprés ouverture le handle de fichier.

Cette ouverture peut échouer si les droits sont insuffisants ou si le fichier n'existe pas. Dans ce cas $monfic vaudra faux.

Lecture d'un fichier texte

La lecture s'effectue grâce à la fonction fgets, fgets est une fonction qui renvoie une chaîne de caractères.

Cette fonction prend 2 paramètres: un handle de fichier et une taille maxi.

Le handle de fichier est obtenu lors de l'ouverture de ce dernier.

La taille maxi:

Si fgets a lu dans le fichier le nombre d'octet indiqué dans la taille maxi sans avoir trouvé de séquence de fin de chaîne, il renvoie une chaîne composée des n octets qu'il vient de lire où n est égal à la taille maxi que vous avez spécifié.

//Lecture séquentielle
while (!feof($monFic))
{
	//lecture
	$chaineLue=fgets($monFic,255);
	//traitement
	...
}
					

écriture dans un fichier texte

L'écriture dans un fichier se fait grâce à la procédure fputs.

Celle-ci prend deux paramètres: le handle du fichier où elle doit écrire, et la chaîne de caractères qu'elle doit écrire.

Toute chaîne écrite dans un fichier doit être terminée par une séquence de fin de chaîne.

Attention aux caractères de fin de ligne dos ou unix. Sous windows il s'agit d'un \r suivi d'un \n et sous unix un \n suffit.

Exemple 3. écriture d'une ligne dans un fichier

$nom="Dupond";
$prenom="Louis";
fputs($monFic,"$nom;$prenom\n"); //la ligne écrite sera Dupond;Louis
							


Fermeture

Tout fichier ouvert doit être fermé de façon à limiter le nombre de fichiers ouverts, et à valider les changements sur le fichier qui sinon restent parfois en mémoire.

La fermeture s'opère grâce à la procédure fclose qui prend un seul paramètre le handle du fichier à fermer.

Les modes d'ouverture

On distingue en gros 3 modes d'ouverture:

  • Pour créer un fichier qui n'existe pas ou réinitialiser un fichier existant (le vider) on utilisera le mode d'ouverture "w" qui signifie Write.

  • Pour ouvrir un fichier en écriture en ajoutant des informations aux informations existentes, on utilisera le mode "a" a pour append ajout. Lorsqu'on utilise ce mode le pointeur sur fichier ou tête de lecture/écriture se trouve placé en fin de fichier.

  • Pour ouvrir un fichier de façon à y lire des informations on utilisera le mode d'ouverture "r" pour read lecture. Lorsqu'on utilise ce mode le pointeur sur fichier ou tête de lecture/écriture se trouve placé en début de fichier.

Autre manipulations:

Parmi les opérations indispensables, on retrouve la copie de fichier ainsi que la supression d'un fichier

Effacement

L'effacement d'un fichier se fait grâce à la procédure unlink qui prend en paramètre non pas un handle de fichier, mais un nom de fichier, en effet, on ne pourrait pas supprimer un fichier ouvert.

Exemple 4. effacement d'un fichier

unlink("essais.tmp");

[Note]Note

à noter: le chemin d'accés est soit relatif à l'endroit ou se trouve le script PHP soit absolu mais alors par rapport à la racine du système et non par rapport à la racine du site web publié par apache.

copie de fichiers

copy(source,destination), cette procédure crée un nouveau fichier du nom indiqué dans destination contenant le même contenu que le fichier dont le nom est indiqué dans source.

Exercices sur les fichiers

  • Exercice 7.1:

    Ecrire un ou plusieurs scripts donnant la possibilité au visiteur de saisir son nom et son prénom ou de visualiser les noms et prénoms des visiteurs ayant laissé leur trace.

Les fichiers: Manipulations complexes des enregistrements:

suppressions d'enregistrements

La suppression d'enregistrement d'un fichier nécessite plusieurs étapes:

  • 1) création d'un nouveau fichier

  • 2) boucle

    lecture de tous les enregistrements du fichier à traiter et pour chacun:

    si l'enregistrement est à conserver l'enregistrer dans le nouveau fichier

    sinon ne rien faire

    à l'issue de cette opération le nouveau fichier contient les enregistrements souhaités.

  • 3) Il ne reste plus qu'à supprimer l'ancien fichier et à renommer le nouveau fichier avec le nom de l'ancien.

Comme vous travaillez dans un environnement multi-utilisateur, la logique voudrait qu'en fait on commence par renommer l'ancien fichier avant de travailler dessus.

Ainsi on peut opérer tranquillement notre traitement, toutes les requêtes en lecture ou écriture échouant pendant ce temps là.

[Note]Note

Ne vous inquiétez pas si vous ne comprenez pas, on verra ultérieurement les problèmes posés par le travail en environnement multi-tâche et multi-utilisateurs.

Exercices

  • Exercice 7.2 sur la suppression de lignes d'un fichier

    Vous recevez en paramètre un nom de fichier et un tableau contenant des numéros de lignes à supprimer.

    Ecrire le sous-programme effaçant les lignes indiquées du fichier indiqué.

modification d'enregistrements

En cas de modification le principe sera similaire on utilisera donc un deuxième fichier.

  • 1) création d'un nouveau fichier

  • 2) boucle lecture de tous les enregistrements du fichier à traiter et pour chacun: si l'enregistrement est à conserver à l'identique l'enregistrer dans le nouveau fichier sinon enregistrer dans le nouveau fichier l'enregistrement modifié. à l'issue de cette opération le nouveau fichier contient les enregistrements souhaités.

  • 3) Il ne reste plus qu'à supprimer l'ancien fichier et à renommer le nouveau fichier avec le nom de l'ancien.

Exercices sur les fichiers Mise en oeuvre

  1. Exercice 7.3:

    Se servir des fichiers pour un réaliser un compteur de hits.

  2. Exercice 7.4:

    Se servir des fichiers pour un livre d'or.

Les fichiers à séparateurs

Il existe des fichiers appelés parfois fichiers csv où chaque ligne correspond à un enregistrement et où les champs sont séparés les uns des autres par un caractère spécial ou un séparateur.

Le séparateur classique est le caractère de tabulation horizontale '\t' mais on trouve aussi souvent le caractére ';'.

Exemple 5. Fichier csv

	01;Dupond;Pierre
	02;Duval;Sebastien
	03;Duxell;Raoul
					


La plupart des tableurs ou sgbd permettent de créer des fichiers sous ce format.

Pour l'utiliser on peut lire la ligne dans le fichier de façon classique et créer ensuite un tableau à partir de la ligne lue.

	$ligneLue=fgets($monFic,255);
	$tabValeurs=split(';',$ligneLue);//on donne à split la ligne à splitter et le séparateur utilisé.
	$nbValeur=count($tabValeurs);
	for($noChamp=0;$i<$nbValeur;$noChamp++)
	{
		echo $tabValeurs[$noChamp];
	}
	//ou mieux:
	echo "<hr>numero: $tabValeurs[0] <br>prénom:$tabValeurs[2] <br>nom: $tabValeurs[1]<br>";
	
	//ou encore mieux:
	$tabLibelles=array('Numéro','Nom','Prénom);
	$noLibelle=0;
	foreach($tabValeurs as $valeur)
	{
	  echo '</p>'. $tabLibelles[$noLibelle]. ': '. $valeur .'</p>';
	  $noLibelle++;
	}
					

La fonction explode est une fonction similaire à split. Et fgetcsv est une fonction qui quand à elle lit une ligne et renvoie carrément ce qu'elle a lu dans un tableau.

Exercices

  • Exercice 7.5:

    Aprés avoir consulté la documentation sur la fonction fgetcsv écrire la fonction fgetcsvperso réalisant le même travail.

Les Sessions

À quoi ça sert: Les variables de session restent vivantes et accessible depuis qu'elles sont créées, jusqu'à ce que l'utilisateur ferme son navigateur.

Si donc on enregistre le nom et le prénom dans des variables de session, $_SESSION['nom'] et $_SESSION['prenom'] resteront visibles dans toutes les pages du site jusqu'à ce que l'utilisateur se déconnecte. On pourra donc s'en servir dans tous nos scripts sans avoir à les retransmettre d'une page à l'autre.

La session est démarrée par l'appel à la procédure session_start.

[Avertissement]Avertissement

Lorsque l'on utilise les sessions, l'appel à la fonction session_start doit être la toute première instruction du script php. Il suffit que vous ayez un espace avant le <?php pour obtenir une erreur.

Pour enregistrer une variable de session on utilise session_register("nom de la variable") et non pas $nomvariable, ou plus simplement

$_SESSION['nomDeLaVariable']=$valeur;

session_unregister pour libérer une variable de session, ou unset($_SESSION['nomDeLaVariable'])

session_is_registered('nomDeVariable') renvoie vrai si le nom passé en paramètre est une variable de session.Mais un isset($_SESSION['nomDeLaVariable']) est tout aussi efficace.

Les variables de session s'utilisent ensuite comme des variables normales.

Ainsi echo $_SESSION['nomVariableDeSession']; permet d'afficher le contenu de la variable de session comme s'il s'agissait d' une variable de script classique.

de même

$_SESSION['nomVariableDeSession']=12;

modifie simplement la valeur de la variable de session.

Exercices

  • Exercice 8.1:

    Ecrivez un script permettant soit d'afficher un formulaire de saisie d'un login et d'un pass soit d'enregistrer en variables de session les infos fournies soit d'afficher des infos confidentielles dans le cas où il s'est authentifié et que son nom et son mot de passe sont ceux figurant dans un fichier secret.php que vous avez créé.

L'authentification

Justement, on en parlait... L'authentification HTTP, on peut mettre en oeuvre un mécanisme d'authentification prévu dans le protocole HTTP, qui va déclencher l'affichage d'une boîte de dialogue demandant à l'utilisateur son nom et son mot de passe. Voici un mécanisme de protection à glisser dans chaque script à protéger.

if(!isset($PHP_AUTH_USER)&&!isset($PHP_AUTH_PW))
{
	header("WWW-Authenticate: Basic realm=\"Nom du domaine protégé\"");
	header("HTTP/1.0 401 Unauthorized");
	echo ("Il faut fournir un nom d'utilisateur et un mot de passe pour accéder à cette page");
}
else
{
	//Effectuer le contrôle sur les infos fournies
	//comparer avec des infos contenues dans: le code ou dans un fichier ou dans une base de donnée
	//à l'issue du contrôle 2 cas possibles
	si contrôle OK alors
	{
		// Toute la partie protégée se trouve ici
		
		//fin de la partie protégée
	}
	sinon
	{
		header("WWW-Authenticate: Basic realm=\"Nom du domaine protégé\"");
		header("HTTP/1.0 401 Unauthorized");
		echo ("Le login et mot de passe fourni ne permettent pas l'accés");
	}
}
				

Il y a aussi un mécanisme de protection des répertoires, la protection portant sur tous les fichiers du répertoire.

Un fichier .htaccess contiendra les couples login et mdp cryptés des utilisateurs autorisés à interroger scripts et fichiers HTML.

Cette gestion est beaucoup moins fine. Pour créer un .htaccess on utilise la commande htpasswd -c nomDuFichier nomDeLUtilisateurou htpasswd2 -c nomDuFichier nomDeLUtilisateur suivant la version du système.

Référez-vous au manuel de la commande pour plus d'information: man htpasswd

Exercices

  • Exercice 9.1

    Mettre en oeuvre le mécanisme de protection ci-dessus sur une page permettant de changer le prix des repas dans le site de l'hotel.

    Les couples login pass des utilisateurs autorisés seront stockés dans un fichier. Réfléchir à la visibilité du contenu du fichier et trouver une solution viable.

Les accés concurrents

Sur un serveur web, les requêtes des clients se partagent le temps du processeur. Le serveur ne gère pas les requêtes les unes aprés les autres, mais quand il y a plusieurs requêtes simultanées, il exécute un peu de l'une puis un peu de l'autre, jusqu'à ce que toutes les requêtes aient été complétement exécutées.

Ceci pose bon nombre de problème, examinons un simple compteur de hits:

le script qui renvoie le nombre de requête et le met à jour est le suivant:

<?php
	$monFic=fopen("compteur.dat","r");
	$nbHits=fgets($monFic,255);
	$nbHits++;
	fclose($monFic);
	$monfic=fopen("compteur.dat","w");
	fputs($monfic,$nbHits);
	echo $nbHits; 
?>
				

Imaginons 2 requêtes simultanées: sur ce script . Miracle ça fonctionne car apache attend qu'un script soit terminé pour le réexécuter.

Maintenant si ce compteur est appelé depuis 2 pages.

Dans accueil.php vous avez un require de compteur.php et dans sommaire.php vous avez aussi un require du même fichier.

Là ça ne fonctionnera plus.

Essayez donc:

Voici le contenu du fichier accueil.php:

<?
	require ("cpt.php");
	echo "ceci est l'accueil";
?>
				

voici sommaire.php

<?
	require ("cpt.php");
	echo "ceci est le sommaire";
?>
				

et voici cpt.php

<?PHP
	echo "il est: ".date("s")."<hr>";
	$monfic=fopen("compteur.dat","r");
	$nbHits=fgets($monfic,255);
	fclose($monfic);
	echo "dans le fichier j'ai lu $nbHits";
	echo "il est: ".date("s")."<hr>";
	sleep(10);
	$nbHits+=1;
	$monfic=fopen("compteur.dat","w");
	fputs($monfic,$nbHits);
	echo"<br>le nombre de hits est $nbHits";
	echo "il est: ".date("s")."<hr>";
?>
				

Lancez accueil.php et sommaire.php dans deux navigateurs simultanément, on s'aperçoit que le compteur n'est mis à jour qu'une seule fois.

Voici ci-dessous une ébauche d'explication:

sur le premier navigateur: $monfic=fopen("compteur.dat","r");

sur le deuxieme navigateur:$monfic=fopen("compteur.dat","r");

sur le premier navigateur:$nbHits=fgets($monfic,255);
					Lecture de 150 et valorisation de $nbHits
					

sur le deuxieme navigateur:$nbHits=fgets($monfic,255);
					Lecture de 150
					

sur le premier navigateur: $nbHits++;
$nbHits locale au script vaut 151
					

sur le deuxieme navigateur:$nbHits++;
$nbHits locale au script vaut 151

sur le premier navigateur:	fclose($monfic);
sur le deuxieme navigateur:	fclose($monfic);

sur le premier navigateur:	$monfic=fopen("compteur.dat","w");



sur le deuxieme navigateur:     $monfic=fopen("compteur.dat","w");

sur le premier navigateur:	fputs($monfic,$nbHits);

sur le premier navigateur:	Écriture de 151

sur le deuxieme navigateur: 	fputs($monfic,$nbHits);
sur le deuxieme navigateur: 	Idem 151

sur le premier navigateur:	echo $nbHits;
sur le premier navigateur: 			Affichage 151

sur le deuxieme navigateur: 	echo $nbHits;
sur le deuxieme navigateur: 	Affichage 151
				

L'affichage de la deuxième exécution est de 151 alors qu'il devrait être de 152.

En conclusion plus il y a de requêtes moins le compteur tourne.

La solution est d'attendre que l'on ai obtenu l'exclusivité de l'usage du fichier, lorqu'on l'obtient on réalise notre traitement et on libère l'exclusivité.

Voici le script ver1.php

<?php
	$fp2=fopen("text",'a+');
	//flock ($fp2,2);//pose du verrou ou attend si pose impossible
	sleep(20); //attendre 20 secondes
	fwrite($fp2,"1\n");
	//flock($fp2,3); //libération du verrou
	fclose($fp2);
?>
				

Voici le script ver2.php

<?php
	$fp2=fopen("text",'a+');
	//flock ($fp2,2);
	fwrite($fp2,"2\n");
	fclose($fp2);
?>
				

Lorsqu'on lance ver1 puis ver2 on obtient :

				2
				1
				

Posons maintenant nos verroux les scripts deviennent:

ver1.php

<?php
	$fp2=fopen("text",'a+');
	flock ($fp2,2);//pose du verrou
	sleep(20); //attendre 20 secondes
	fwrite($fp2,"1\n");
	flock($fp2,3); //libération du verrou
	fclose($fp2);
?>
				

Voici le script ver2.php

<?php
	$fp2=fopen("text",'a+');
	flock ($fp2,2);
	fwrite($fp2,"2\n");
	fclose($fp2);
?>
				

On obtient cette fois le résultat suivant:

					1
					2
				

C'est gagné.

Une autre solution consiste à créer un fichier verrou et à le retirer quand on a terminé. Dans le même script si le fichier verrou existe, on attend (un temps aléatoire) qu'il ait été libéré.

Contrôles de saisie

Contrôle côté client vs serveur les deux...

Les contrôles doivent non seulement être effectués côté client, mais aussi côté serveur. En effet, rien n'empêche le client de faire une requête sur le serveur sans passer par le formulaire prévu.

En plus du code HTML correspondant au formulaire, on pourra faire passer au client un script de vérification exécuté par le navigateur:

Exemple:

<script>
	function verif()
	{
		if ((document.f1.montant.value!='')&&(!isNaN(document.f1.montant.value))
		{
			return(true);
		}
		else
		{
			alert("Le montant doit être correctement renseigné");
			document.f_saisie_montant.montant.focus();
			return (false);
		}
	}
</script>
			

et on fait appel à cette fonction lors de la validation du formulaire:

<form name="f_saisie_montant" action="scriptQuiTraite.php" onSubmit="javascript:return(verif());" method ="POST">

Bien entendu on réalisera la même vérification côté serveur.

htmlentities ou la protection des pages affichées.

Ne faîtes jamais afficher quelque chose qui a été saisi par l'utilisateur sans vérifier que les informations entrées sont inoffensives.

Exemple d'un livre d'or:

Vous demandez à l'utilisateur de laisser un message dans le livre d'or, et vous faîtes afficher les messages saisis ensuite dans un tableau:


				
				<table>
				<tr>
					<th>Date</th>
					<th>Email</th>
					<th>Message</th>
				</tr>
				<tr>
					<td>20/01/2003</td>
					<td>pirate@laposte.net</td>
					<td>Salut super ton site</td>
				</tr>

				

Imaginez que l'utilisateur rentre </table> dans son message, votre affichage sera complétement perturbé.

Mieux encore lorsqu'il rentre un script:

				<script>
					window.document.location.href="http://www.siteduconcurrent.com";
				</script>

Cela redirige le client qui consulte votre livre d'or vers un site plus ou moins recommandable.

La solution est de transformer les balises HTML qui pourraient se trouver dans le message en texte innofensif.

La fonction htmlentities réalise ce travail: elle transforme par exemple le signe < en &lt; qui correspond non pas à l'ouverture d'une balise mais au caractère inférieur. De même > devient &gt; etc...

Ainsi les balises qui ont été entrées par l'utilisateur se trouvent affichées dans le message sans être prises en compte en tant que balises.


				
	<table>
	<tr>
		<th>Date</th>
		<th>Email</th>
		<th>Message</th>
	</tr>
	<tr>
		<td>20/01/2003</td>
		<td>pirate@laposte.net</td>
		<td>Salut super ton site</td>
	</tr>
	<tr>
		<td>21/01/2003</td>
		<td>vilain@concurrent.com</td>
		<td>&lt;script&gt;window.document.location.href="http://www.siteduconcurrent.com";&lt;/script&gt;</td>

	</tr>

				

Lutter contre les moulinettes:

Quand vous donnez la possibilité à un utilisateur de rentrer des informations et que celles-ci sont enregistrées sur le serveur web dans un fichier ou une base de données, vous courrez le risque de voir votre espace de stockage diminuer, si bien qu'un jour le site ne fonctionnera plus

N'importe qui peut écrire un petit programme qui envoie en boucle des informations.

Il est donc nécessaire de limiter le nombre de saisies possibles. Par exemple on peut enregistrer dans une variable de session le fait qu'un utilisateur a déjà rentré un message, et lui refuser d'en laisser un autre dans la même session. Cela évitera que des moulinettes vous saturent votre espace disque.

Mais certains programmes peuvent mettre fin à la session à chaque tour de boucle. Il faut donc trouver une autre solution. On peut aussi limiter les entrées à une par adresse ip et par jour. Peu importe pourvu que l'on n'enregistre pas tout automatiquement. L'essentiel est de mettre en oeuvre un dispositif quelconque.

Exercices:

  • Exercice 10.1

    Ecrire un script php qui enregistre dans un fichier des couples (email, commentaire) saisis par l'utilisateur. Contrainte: 1 enregistrement maxi par heure et par IP d'origine.

PHP et les bases de données

Généralités

PHP propose des fonctions permettant d'accéder aux informations gérées par les SGBD suivants:

  • Mysql

  • Postgresql

  • Oracle

  • db2

  • msql

  • base disposant d'un driver ODBC

  • sqlite, mongodb, mariadb etc..

On peut établir une sorte de principe permettant d'accéder à n'importe quel SGBD.

Les étapes:

On fournit:Un identifiant de serveur nom dns ou adresse ip,un nom d'utilisateur,le mot de passe correspondant

On obtient: une erreur lorsque la connexion a échoué ou un identifiant de connexion lorsque celle-ci a réussi

Les sgbd accueillent souvent plusieurs bases: il faut fournir alors le nom de la base que l'on souhaite exploiter

La sélection de la base peut réussir ou échouer si le nom de la base n'est pas le bon ou que l'utilisateur spécifié n'est pas habilité à travailler sur cette base

On peut faire ensuite une requête du genre select ... from ... where ... qui renvoie un resultat (ensemble d'enregistrement) ou false si la requête a échoué

Qu'est ce qu'un jeu d'enregistrement ?

C'est un ensemble de lignes correspondant aux résultats fournis par la requête:

Il s'agit d'une structure séquentielle.

Pointeur	Champ1	Champ2	Champ3
>>	1	Dupond	Albert
		2	Duval	Xavier
		3	Martin	Pierre
				

Lors de l'obtention d'un jeu d'enregistrement, le pointeur est placé avant le premier enregistrement du jeu.

Pour lire une ligne du jeu d'enregistrement, on réalise un fetch. A chaque fetch, on récupére les informations de la ligne pointée et le pointeur est déplacé au début de la ligne suivante.

A noter un fetch peut échouer si le pointeur est déjà à la fin du jeu d'enregistrement. Dans ce cas le fetch renverra faux.

Pour afficher donc la totalité d'un jeu d'enregistrement on codera donc un algorithme qui ressemble à ça:

	maConnection= obtientConnection(serveur,user,pass)
	selectionne(maConnection,nomDeLaBase)
	maRequete="select id,nom,prenom from maTable"
	MonJeuDEnregistrement=executerequête(maconnection,maRequete)
	Tant Que monEnregistrement=fetch(monJeuDEnregistrement) faire
		traite ou affiche monEnregistrement
	FIN Tant Que
	Fermer(maConnection)
				

A noter: il existe différents "fetch" les uns permettant d'obtenir les informations contenues dans l'enregistrement en cours dans un tableau indexé numériquement. Les autres permettant d'obtenir soit des objets(instances de classes à voir ultérieurement) soit des tableaux associatifs(se référer au chapitre correspondant).

Outres ces principes de base, on aura la possibilité avec certains moteurs de mettre en place des transactions (je n'en dit pas plus pour l'instant).

Les généralités sont terminées voyons maintenant les fonctions à utiliser pour chaque moteur.

Mysql

Installer la prise en charge de mysql par php: par exemple: #apt-get install php5-mysql service apache2 restart

Tableau 2. fonctions Mysql

Pour réaliserOn utilise
Obtention d'une connection$maconnection=mysql_connect('mysql.mondomaine.xx','nomutilisateur','motdepasse utilisateur');
Sélection de base de donnée mysql_select_db('nomDeLaBase',$maconnection);
Obtention d'un ensemble d'enregistrement $JeuEnregistrement=mysql_query("select * from matable;",$maconnection);
Déconnection mysql_close($maconnection);

Et maintenant les fetch:

Comme on l'a vu dans les généralités, il existe différents fetch:

Tableau 3. Les fetchs

Type du résultatFetch à employerExemple
Tableau classiquemysql_fetch_row($jeuEnregistrement)
echo("<table border=1>");
while ($tabEnreg=mysql_fetch_row($jeuEnregistrement))
{
	echo("<TR><td>$tabEnreg[0]</td><td>$tabEnreg[1]</td>");
}
echo ("</table>");
					
Tableau Associatif mysql_fetch_array($jeuEnregistrement)
echo("<table border=1>");
while ($tabEnreg=mysql_fetch_Array($jeuEnregistrement))
{
	echo("<TR><td>".$tabEnreg["nom"]."</td><td>".$tabEnreg["prenom"]."</td>");
}
echo ("</table>");
					
Objet mysql_fetch_object($jeuEnregistrement)
echo("<table border=1>");
while ($monClient=mysql_fetch_Object($jeuEnregistrement))
{
	echo("<TR><td>$Moncli->Nom</td><td>$monClient->prenom</td>");
}
echo ("</table>");
					

Nombre de lignes renvoyé par une requête

Il est possible d'obtenir le nombre de ligne d'un jeu d'enregistrement par la fonction mysql_num_rows($jeuEnregistrement)

Nombre de colonne d'un jeu d'enregistrement: Lorsque l'on fait un select * sur une table quelconque, il est possible de connaître le nombre de colonnes obtenues par la fonction mysql_num_fields($jeuEnregistrement).

Accés direct: Pour l'instant, on utilisait le jeu d'enrgistrement comme une structure séquentielle. Nous allons voir maintenant qu'on peut aussi le considérer comme un tableau à deux dimensions.

Ainsi il est possible d'afficher le nom du client apparaissant dans la 4 ième ligne comme ceci:

echo (mysql_result($jeuEnregistrement,4-1,"nom")); 
						

Quelques explications:

4-1 est le numéro de ligne. Comme la première ligne a le numéro 0 la 4ième aura le numéro 3.

"nom" est le nom du champ correspondant dans la table.

Mais il n'y a pas que des select

Il y a aussi les insertions, les mises à jour les suppressions.

Le principe est le suivant:

Tout d'abord, on forme la requête et on la met dans une variable.

[Astuce]Astuce

Bonnes pratiques: En phase de developpement il est sage d'afficher la requête obtenue

Ensuite on l'éxécute.

Exemple 6. Exemple de requête de mise à jour

Dans cet exemple on met à jour le chiffre d'affaire d'un client, on lui ajoute un certain montant dont la valeur est stockée dans la variable $montant.

$marequete="update client set chiffreaff=chiffreaff+ $montant where noClient=$_POST['noClient'];"; //la requête est formée
echo $maRequete; //on l'affiche pour debugger
mysql_query($marequete,$maconnection) //la requête est exécutée

						

La requête peut être de tout type: insert into, update , delete from, create, drop , grant ...


Exercices php et sql

  1. Exercice 11.1 Ecrire un ensemble de scripts permettant d'éditer le contenu d'une table sql.

    Ecrire un ensemble de scripts permettant d'éditer le contenu d'une table sql.

    l'écran principal présentera dans un tableau tous les enregistrements de la table.

    Pour chaque enregistrement, deux liens seront fournis:

    • le premier permettra d'afficher un écran permettant de modifier l'enregistrement correspondant.

    • Le deuxième permettant de supprimer l'enregistrement en cours.

    Un bouton "Ajouter" en bas de page permettra d'accèder à un écran "nouvel enregistrement".

  2. Exercice 11.2

    Edition de table comprenant clef étrangère: Idem ci-dessus, mais la table éditée contiendra une clef étrangère.

    Exemple 7. table avec clef étrangère: Employe service

    table employé et table service un employé travaille dans un et un seul service. Chaque service est identifié par un numéro et dispose d'un libellé, le numéro du service dans lequel l'employé travaille est une clef étrangère dans la table employé.


Utilisation de PHPMyAdmin

Pour des raisons de sécurité , à part sur le poste de développement on n'installe pas de logiciel de ce type, qui ne sert d'ailleurs pas à grand chose. PhpMyAdmin pourra d'ailleurs être remplacé par mysql workbench.Pour administrer une base mysql distante, connectez-vous par ssh sur le serveur et utilisez mysql. Pensez à scripter toutes vos interventions sur la base de donnée, cela permettra de rejouer les scripts ultérieurement.

Travail sur la génération de mots de passe

Il est souvent nécessaire dans un site web de générer des mots de passe pour les utilisateurs. Un mot de passe doit avoir une longueur variable comprise entre 8 et 15 caractères. Il comportera un mélange de majuscules, minuscules, chiffres et éventuellement des caractères spéciaux.

La génération de mot de passe se fait en tirant au sort un nombre de caractère entre 8 et 12.

Pour chaque caractère à renseigner, on tire au sort un nombre et on va chercher le caractère dont il est le code ascii.

On forme ainsi le mot de passe.

Exercices

  • Exercice 12.1:

    Ecrire une fonction PHP qui génére un mot de passe vous vous référerez à la table des codes ascii pour connaître les limites des entiers à tirer au sort Se référer aussi à la doc PHP http://www.php.net/fr pour les fonctions random de génération de nombres aléatoires

L'envoi de mails

L'envoi de mail se fait par l'intermédiaire d'un serveur smtp présent sur le serveur web. Il est possible d'utiliser un autre serveur smtp mais ce sera vu ultérieurement dans le chapitre programmation réseau.

On suppose donc ici qu'un serveur smtp est installé sur la machine.

PHP propose une fonction mail. Attention la plupart des serveurs smtp exigent que soit l'émetteur soit le destinataire soit un membre du domaine de la machine. Ainsi si votre serveur web est www.gapline.org l'emetteur doit être quelqun@gapline.org et le destinataire quelconque. Ou deuxième cas de figure: émetteur tartenpion@quelque.part et le destinataire sombebody@gapline.org.

La fonction à utiliser est la fonction mail:

Voici un exemple de code envoyant un courrier à tous les membres dont l'adresse électronique est connue. Ces membres étant stockés dans une base mysql:

	<?
require "parametres.php";
$req="select * from MEMBRE";
mysql_connect($mysql,$user,$pass);
$membres = mysql_db_query("$nomdb",$req);
while ($membre=mysql_fetch_row($membres))
{
	$to=$membre[6];
	if ($to) //s'il a une adresse email
	{
		$nom=$membre[7];
		$prenom=$membre[9];
		$mdp=$membre[11];
		$sujet="Joyeux noël et meilleurs voeux";

		$message="Salut $prenom\n";
		$message.="\nBonne année 2003.\n";
		$message.="Je te rappelle l'adresse du site du BTS:\n";
		$message.="http://www.btsinfogap.org\n";
		$message.="n'oublies pas de mettre à jour ta page personnelle\n Espace garder le contact\n Rubrique étudiants et ex-étudiants\n";
		$message.="ton nom d'utilisateur est: $nom et ton mot de passe: $mdp\n";
		$message.="\nPour éditer ta fiche cliques sur le bouton à droite de ton nom \n";
		$message.="Il suffit ensuite de modifier le contenu du champ HTML ou de remplir le champ ADRESSE si tu as un site perso \n";
		$message.="Donnes nous de tes nouvelles\n\n";
		$message.="\n\n";
		$message.="Quelques nouvelles fraîches: \n";
		$message.="Il fait -14 ce matin\n";
		$message.="et toujours pas de neige\n";
		$mailHeaders = "From: PereNoel@btsinfogap.Lyceedominiquevillars.gap.fr";
		if (mail($to , $sujet , $message , $mailHeaders))
		echo "<br>pour $prenom $nom c'est fait";
	}//fin du si il a une adresse mail enregistrée
}//fin de la boucle
	?>
			

PHP,les variables et leur portée

Problématique:

Soit le script php suivant:

<?PHP
$nom='Dupond';
function titre
{
	echo('<h1>$nom</h1>');
}
titre();
?>
				

Que pensez-vous que réalise ce code ?

On pourrait s'attendre à ce qu'il affiche Dupond dans le style H1.

Et bien rien n'est affiché.?

Qu'en déduit-on ? La variable $nom utilisée dans la fonction n'est pas la même que la variable $nom du code principal.?

Preuve:?

<?PHP
$nom='Dupond';
function titre
{
	$nom='Duval';
	echo('<h1>$nom</h1>');
}
titre();
echo ($nom);
?>
				

Cette fois-ci on a deux sorties: Duval en "h1" et dupond en style "normal".

Solution 1: passage de paramètre.

La solution serait de passer la chaine à mettre en titre en paramètre à la fonction:

function titre($chaine)
{
	echo '<h1>$chaine</h1>';
}
				

Ici, une copie de la valeur de la variable est passée à la fonction.

Croyez vous que la fonction puisse modifier la valeur de la variable ?

Essayons:

<?PHP 
$nom='Dupond';
function titre($chaine)
{
	$chaine='<h1>$chaine</h1>';
	echo($chaine);
}
titre($nom);
echo ($nom);
?>
				

La sortie est dupond en titre de niveau 1 suivi de dupond en normal ce qui nous permet de conclure que la fonction ne modifie pas la variable (globale).

Solution:

Lorsqu'une fonction doit modifier une variable, il faut lui passer en paramètre non pas une valeur , mais une variable.

Passage de variable en paramètre à une fonction:

<?PHP
$nom='Dupond';
function titre(& $chaine)
{
	$chaine='<h1>$chaine</h1>';
	echo('$chaine');
}
titre(&$nom);
echo ($nom);
?>
				

& permet de passer en paramètre une variable c'est l'opérateur qui renvoie l'adresse de la variable qui suit .

Exercice:

écrire une fonction qui permute le contenu de deux variables passées en paramètre.

Mais si dans une fonction on veut utiliser une variable définie globalement sans avoir envie de la passer en paramètre...

Les variables globales

et bien il existe une solution:

déclarer dans la fonction la variable précédée du mot clef 'global'.

				global $nom; 
				

PHP saura ainsi qu'il doit rechercher une variable dans le code qui s'appellerait $nom et ne recréera pas ainsi de nouvelle variable locale à la fonction.

Notre code devient:

<?PHP
$nom='Dupond';
function Titre()
{
global $nom;
$nom='<h1>$nom</h1>';
echo($nom);
}
titre( $nom);
echo ($nom);
?>
				

Danger: on n'utilisera des variables globales que lorsqu'elle ne sont pas modifiées par les fonctions.

Autre type de variable: les variables statiques.

Elles n'existent pas globalement.

Elles sont créées dans une fonction .

Elles sont initialisées dans une fonction.

Elles ne sont pas détruites en fin d'exécution de la fonction.

Elles ne sont pas recréées lors d'un nouveau passage dans la fonction.

Elles ne sont pas réinitialisées.

Exemple:


function afficheligne($contenu)
{
	static $noligne=1;
	if ($noligne%2==1) $color=$color1;else $color=color2;
	echo('<tr>bgcolor=\'$color\'>$contenu</tr>');
	$noligne++;
}
			

Exercices:

  1. Exercice 13.1

    Si $color1 et $color2 sont initialisées dans un fichier inclus, comment modifier la fonction pour qu'elle fonctionne ?

  2. Exercice 13.2

    Ecrire un script qui affiche 10 lignes avec des couleurs alternées. Dans la ligne n on écrira "contenu de la ligne n".

Oracle triggers et procédures stockées

Liste des pré-requis Vous ne pouvez suivre ce module si vous n'avez pas suivi les modules précédents: Introduction Se servir d'une base Oracle en PHP n'est pas plus compliqué qu'utiliser une base MySql. C'est juste un ensemble de fonctions différent qu'il faut utiliser. Alors qu'avec mysql, toutes les fonctions étaient préfixées de 'mysql' avec oracle (version>=8) elles seront préfixées du texte 'OCI' et avec oracle <=7 elles seront préfixées du texte 'ORA'. Pourquoi Oracle si Mysql suffit ? Pas de raison d'utiliser Oracle si Mysql suffit Alors Oracle pourquoi ? Oracle a de grosses potentialités : capacité de répartition des bases de données, transactions, requetes imbriquées, requetes ensemblistes ou hiérarchiques, cohérence par rapport au système d'information de l'entreprise, procédures stockées et triggers, je ne parle pas de Java ou de XML. Si on en retrouve certaines dans postgresql on est quand meme loin d'avoir le compte. Donc si vous avez des besoins et les moyens correspondant allez-y pour Oracle. Oracle: Comment ça marche ? Oracle est un moteur de base de données qui supporte de 1 à n instances.A chaque instance correspond un ensemble de processus tournant en tâche de fond qui permettent d'accéder aux informations . En pratique beaucoup de serveurs ne font tourner qu'une seule instance dont le nom est contenu dans la variable d'environnement ORACLE_SID. L'instance par défaut lors de l'installation d'oracle s'appelle 'test' ou 'ORCL'mais sans doute ceci a été changé par votre administrateur de base de données. Une 'base de donnée' au sens courant du terme est créée en créant un utilisateur propriétaire de la base de données. Supposons que vous disposez d'un compte d'utilisateur Oracle et du mot de passe correspondant. Les étapes: obtenir une connexion parser sa requête exécuter la requête [parcourir le jeu d'enregistrement obtenu et extraire la valeur des champs.] Obtenir une connexion: débutant: On utilise la fonction PHP OCILogon(loginoracle,pwd). Cette fonction renvoie un identifiant de connexion. $idConnexion=OCILogon('scott','tiger'); Confirmé: Outre la spécification de l'instance à utiliser lors de la connexion: $idConnexion=OCILogon('scott','tiger','nominstance'); On distingue les connexions permanentes des connexions temporaires limitées à l'exécution du script. On dispose pour créer des connexions permanentes de la fonction OCIPLogon acceptant les memes paramètres. Parser sa requete Parser consiste à vérifier la syntaxe de la requete. Oracle vérifie lors de cette étape la conformité de la requete avec le langage SQL. La fonction OCIParse int ociparse (resource idconnexion, string query) ociparse() analyse la requête query sur la connexion conn, elle retourne FALSE, si la requete est syntaxiquement fausse . Dans le cas ou la requete est juste elle retourne un identifiant du jeu d'enregistrement qu'il faudra exécuter. query peut être n'importe quelle requête SQL. Exemple: $Stmnt=OCIParse($idConnexion,'select * from emp'); Confirmé: A l'issue de ce parsing, on peut obtenir le type de la requete grace à la fonction ocistatementtype. Le type retourné par la fonction est l'un des types suivant: 'DELETE','SELECT','UPDATE','INSERT','CREATE','DROP','ALTER','BEGIN','DECLARE','UNKNOWN' Evidemment si c'est vous qui écrivez la requête, vous connaissez son type. Par contre si la requête ou une partie de celle-ci est rentrée par l'utilisateur, il vaut mieux vérifier le type de la requête avant de l'exécuter. Exécuter la requete : L' exécution de la requete s'effectue en appelant la procédure OCIExecute. Le statement passé en paramètre doit avoir été parsé. OCIExecute($stmnt); Si votre requete est du type INSERT, UPDATE,DELETE c'est terminé. Par contre si vous souhaitiez obtenir un ensemble de données, il faut passer à l'étape suivante. Utilisation d'un jeu d'enregistrement renvoyé par une requete: Tout d'abord, toutes les requêtes ne renvoient pas de jeu d'enregistrement. Seules les requêtes du type 'SELECT' renvoient un résultat. Cette étape n'est donc utile que pour les requêtes 'SELECT'. étape obligatoire: le fetch Principe: lorqu'un fetch est effectué, l'enregistrement en cours est chargé en mémoire et devient accessible. L'enregistrement en cours devient le suivant. Débutant while(OCIFetch($stmnt)) { $valchamp=OCIResult($stmnt,$numerocolonne); /* attention la 1ere colonne a le numéro 1*/ /* ou $valchamp=OCIResult($stmnt, 'nom de la colonne ');*/ echo($valchamp); } Confirmé OCIFetchInto($stmnt,&$tclient,oci_ASSOC+oci_NULLCols); Charge l'enregistrement courant dans le tableau associatif '$tclient' et passe à la suivante. ocifetchinto() écrasera le contenu de result. Par défaut, result sera un tableau à index numérique, commençant à 1, et qui contiendra toutes les colonnes qui ne sont pas NULL. L'option mode vous permet de modifier le comportement par défaut de la fonction. Vous pouvez passer plusieurs modes simplement en les additionnant (par exemple oci_ASSOC+oci_RETURN_NULLS). Les modes valides sont : oci_ASSOC Retourne un tableau associatif. oci_NUM Retourne un tableau à index numérique (DEFAULT, valeur par défaut) oci_RETURN_NULLS Retourne les colonnes vides. oci_RETURN_LOBS Retourne la valeur des objets LOB plutôt que leur descripteur. Transactions La transaction regroupe une ensemble de requetes permettant de faire passer les données de votre base d'un état cohérent à un autre état cohérent. La transaction démarre lorsque vous obtenez la connexion et se termine par défaut à la fin du script ou quand vous mettez fin à votre connexion. Il est possible d'annuler le travail réalisé: OCIRollback Ou de le valider OCICommit exemple: virement de compte à compte : début transaction retrait d'un compte OK ajout de la somme à un autre compte ERREUR solution annulation ocirollback fin transaction Exercice: 1) créez une simple table et réalisez un script qui en affiche le contenu 2) créer une page permettant d'ajouter un enregistrement dans la table. 3) A partir d'une table séjour dont vous établirez la structure, écrire un script PHP qui affiche pour une période données les chambres libres d'un hotel. Les dates de début et de fin de la période seront saisies par l'utilisateur. On enchaine sur les triggers. Pour être sur qu'il n'y a pas deux réservations pour la même chambre.

Génération d'images

Un script php peut générer une image, il suffit pour cela de dire au navigateur que ce qu'il va recevoir est une image.

header("Content-type: image/png\r\n\r\n);
			

Et il faut lui renvoyer effectivement une image dans le format annoncé.

Génération d'une map de visualisation du ping des machines de la salle développeur:


<?
  header("Content-Type:image/png\r\n\r\n");

function ping($host, $timeOutMS=500) 
{
                /* le paquet ping ICMP */
                $message = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
                $socket  = socket_create(AF_INET, SOCK_RAW, 1);
                socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 0, 'usec' => $timeOutMS));
                socket_connect($socket, $host, null);
                socket_send($socket, $message, strLen($message), 0);
                if (socket_read($socket, 255))
                        $result = "ok";
                else    $result = "pok";
                socket_close($socket);
                return $result;
}
//création des images necessaires

  $monImage=imageCreateFromPng("images/salleF005.png");
  $imageOk=imageCreateFromPng("images/mini_ok.png");
  $imagePOk=imageCreateFromPng("images/mini_error.png");

  $fileName="images/computer.png";
  list($width, $height) = getimagesize($fileName);
  $imgDuPoste=imageCreateFromPng($fileName);
 

 
  //connexion à la base
  mysql_connect("localhost","userParc","parcPwd");
  mysql_select_db("dbParc");
  //requete:
  $req="select nom,x,y,ip from poste";
  //execution de la requete
  $resultat=mysql_query($req);
  //boucle d'affichage des postes
  while($monTab=mysql_fetch_array($resultat))
  {
        
        //redimensionnement
        $x=$monTab['x'];
	$y=$monTab['y'];
	$ip=$monTab['ip'];
        $blanc=imageColorAllocate($monImage,255,255,255);
	//on écrit l'adresse ip de la machine en blanc
        imageString($monImage,5,$x,$y-15,$ip,$blanc);
        imageCopyMerge( $monImage,$imgDuPoste,$x,$y,0,0,80,80,75);
        //en fonction du resultat du ping on met l'image verte ou l'image rouge
        $res=ping($ip);
        if($res=="ok")
        {
            imageCopyMerge( $monImage,$imageOk,$x+5,$y+5,0,0,14,14,75);
	}
	else
        {
	   imageCopyMerge( $monImage,$imagePOk,$x+5,$y+5,0,0,14,14,75);
	}
  }//fin de la boucle d'affichage des postes
  imagePng($monImage);
?>

			

Exercices:

  • Exercice 14.1 sur la génération d'image

    Reprendre le code précédent de façon à tester l'état des services http(80) et ssh(22) sur chacune des machines à surveiller

Postgresql

à venir peut-être

Programmation réseau

Le php n'est pas fait pour écrire des serveurs, par contre, on peut tout à fait écrire de petits clients en suivant pour cela les rfc nécessaires.

Après vous être instruit sur le protocole smtp, réalisez un script permettant l'envoi d'un mail sans utiliser la fonction mail.

Exercices

  • exercice 15.2 client pop3

    Ecrire un client pop3 permettant de récupérer ses mails et de les visualiser

Programmation Orientée Objet et PHP

Il s'agit ici de s'initier à la POO avec comme support le langage PHP.

Notion de classe d'objet.

Lorsque l'on voit un véhicule qui roule, on peut le classer dans la classe voiture, mobilette ou camion. La classe définit un type de véhicule.

La classe est assimilable à une entité les exemplaires d'une classe sont assimilables aux instances d'une entité. Le nombre d'instance d'une classe n'est pas limité.

Une classe a des propriétés:

Une classe tout comme une entité est définie, par ses propriétés. La classe moto disposera des propriétés modèle, marque, cylindrée.

La classe ordinateur disposera des propriétés: adresse ip, nom, marque, modèle.

Une classe a des méthodes:

La différence entre une entité et une classe est que les objets d'une classe peuvent réaliser des actions. Les fonctions ou procédures qu'ils sont capables de réaliser s'appellent des méthodes. Tous les objets d'une même classe peuvent réaliser les même méthodes.

Imaginons une classe point, la classe point définit un point qui peut s'afficher à l'écran (un pixel).

Les propriétés de la classe point sont: la couleur, l'abscisse, et l'ordonnée.

Les méthodes sont: afficher, deplace(dx,dy), cacher, allera(x,y)

Exemple 8.  classe compte bancaire

Imaginons une classe compte bancaire:

les propriétés: numéro ,code banque, code guichet, solde, nom propriétaire, adresse propriétaire

les méthodes: afficher, créditer(montant:réel), débiter(montant:réel), fermer

Conclusion: La classe définit un type d'objet. Tous les objets d'une même classe sont capables de réaliser les méthodes de la classe à laquelle ils appartiennent. Ils ont les même propriétés, mais des valeurs différentes pour ces propriétés.


Classes et instances

Pour définir une classe en php on utilise le mot clef "class".

Voici la définition d'une classe "textehtml" en php.

class textehtml
{
	var $texte;
	var $balise;
	function affiche()
	{
		echo "<$this->balise>";
		echo $this->texte;
		echo "</$this->balise>";
	}
}
					

$this contient l'instance de la classe en cours d'éxécution.

Notre classe est définie, nous allons pouvoir créer des objets de cette classe.

$phrase1=new textehtml;
$phrase1->texte="Bonjour à tous";
$phrase1->balise="h1";
$phrase1->affiche();

$phrase2=new textehtml;
$phrase2->texte="Ceci est la 2ième phrase";
$phrase2->balise="b";
$phrase2->affiche();
					

Nous avons ici créé deux instances de la classe textehtml.

Remarquez l'utilisation de la fonction new qui réserve un emplacement dans la mémoire vive du serveur pour la nouvelle instance.

Aprés avoir initialisé leurs propriétés respectives, on a appelé leur méthode affiche().

Exercices classes et instances

  1. Exercice n°x.1

    Créez 3 nouvelles instances de la classe textehtml de façon à afficher "Ceci est la n ième phrase" successivement en italique, en h2 et en h3.

  2. Exercice n°x.2

    Créer une classe ancre disposant de la méthode affiche et l'instancier deux fois pour afficher un lien vers le site de la section et vers votre site perso.

Démarche de conception d'une classe

De même que nous avons créé la classe textehtml nous pouvons aussi concevoir une classe documenthtml.

Lorsque l'on crée une classe on se pose deux questions:

1. par quoi sont caractérisées les instances de la classe ?
2. La deuxième question est la suivante: que seront capables de faire les instances de la classe?

1.

par quoi sont caractérisées les instances de la classe ?

On détermine ainsi les propriétés de la classe.

2.

La deuxième question est la suivante: que seront capables de faire les instances de la classe?

On trouvera ainsi les méthodes de la classe.

1. Qu'est-ce qui caractérise un document html ?
2. Que sont capables de faire les instances de document html?

1.

Qu'est-ce qui caractérise un document html ?

Son titre,

son contenu.

2.

Que sont capables de faire les instances de document html?

Elles sont capables de s'afficher.

Nous aboutissons donc à la définition de classe suivante:

class documenthtml
{
	var $tabContenu=array(); //ceci est un tableau
	var $titre;
	function affiche()
	{
		echo "<html>";
		echo "<head><title>$this->titre</title></head>";
		echo "<body>";
		for($i=0;$i<count($this->tabContenu);$i++)
		{
			$this->tabContenu[$i]->affiche();
		}
		echo "</body>";
		echo "</html>";
	}
}
				

Exercice x.3

  • Instanciez un document html et lui donner comme contenu les phrases construites précédemment, puis faîtes-le afficher.

Encapsulation

Un des grands principes de la POO consiste à ne pas accéder aux propriétés directement, mais à les rendre accessibles via des méthodes. L'utilisateur de la classe n'est pas censé connaître les propriétés d'une classe mais seulement les méthodes de cette dernière.

Si l'on reprend notre classe document html on ajoutera donc les méthodes suivantes:

  • procédure setTitre(leTitre: chaine)//permet de donner un titre à un document

  • fonction getTitre: chaine// permet d'obtenir le titre d'un document

  • procédure ajouteContenu (phrase:texteHtml) //permet d'ajouter une ligne à un document html

Le listing des propriétés et méthodes d'une classe forme ce qu'on appelle l'interface de la classe. Le code des méthodes forme quand à lui l'implémentation de la classe.

Voici donc l'implémentation :

class documentHtml
{
	var $contenu; //ceci est un tableau
	var $titre;

	function setTitre($nouveauTitre)
	{
		$this->titre=$nouveauTitre;
	}
	function getTitre()
	{
		return ($this->titre);
	}
	function ajouteContenu($phrase)
	{
		$noCelluleLibre=count($this->contenu);
		$this->contenu[$noCelluleLibre]=$phrase;
	}

	function affiche()
	{
		echo "<HTML>";
		echo "<head><title>$this->titre</title></head>";
		echo "<body>";
		for($i=0;$i<count($this->contenu);$i++)
		{
			$this->contenu[$i]->affiche();
		}
		echo "</body>";
		echo "</HTML>";
	}
}
				

Exercice x.4: Reprendre la classe texteHtml de façon à encapsuler les propriétés de la classe. Modifier le fichier pour se servir uniquement des nouvelles méthodes setBalise et setTexte.

Exercice x.5: Ajouter une méthode sauverVersFichier à votre classe documentHtml de façon à pouvoir sauver dans un fichier html le document complet.

Constructeur

Il est possible d'initialiser les propriétés d'une classe à l'instanciation de celle-ci. Une méthode spéciale est chargée de cela. Il s'agit du constructeur. Le constructeur est une méthode de la classe portant le même nom que celle-ci.

Exemple:

class texteHtml
{
	var texte;
	var balise;
	function texteHtml($bal,$text)
	{
		$this->balise=$bal;
		$this->texte=$text;
	}
	function affiche()
	{
		echo "<$this->balise>";
		echo $this->texte;
		echo "</$this->balise>";
	}
}
				

le constructeur s'utilise ainsi:

					$phrase1=new texteHtml("H1","Ceci est le titre");
				

Lorsque vous appelez $phrase1->affiche(), vous constatez que les propriétés ont été correctement initialisées par le constructeur.

Héritage

Si l'on dispose d'une classe véhicule, on peut disposer aussi de classes voitures, camion etc...

Dans la mesure où une voiture est un véhicule, la classe voiture peut-être définie à partir de la classe véhicule. On dit à ce moment là que la classe voiture hérite de la classe véhicule. Une classe qui hérite d'une autre (son parent) dispose automatiquement des propriétés et méthodes de la classe dont elle hérite.

Exemple 9. classes et héritage

class vehicule
{
	var $vitesseMax;
	var kmCompteur;
	function setVitesseMax($vitesse){};
	function rouler($nbkm){};
}//fin de la classe vehicule

class voiture extends vehicule
{
	var $noImmat;
	function setNoImmat($immat){$noImmat=$immat;};
}
						

Regardons maintenant ce que l'on peut faire avec une voiture:

$maVoiture=new voiture;
$maVoiture->kmCompteur=0;
$mavoiture->rouler(325);
$mavoiture->setNoImmat("1523 KZ 38");
$mavoiture->affiche();
			

On s'aperçoit que l'on peut utiliser les propriétés et méthode non seulement de la classe elle-même mais aussi de toute classe dont elle hérite. Les niveaux d'héritage ne sont pas limités: Ainsi, on peut s'apercevoir que dans les véhicules, on trouve des véhicules immatriculés et d'autres qui ne le sont pas.

class vehicule
{
	var $vitesseMax;
	var $kmCompteur;
	function setVitesseMax($vitesse){};
	function rouler($nbkm){};
}
class vehiculeImmatricule extends vehicule
{
	var $noImmat;
	function setNoImmat($immat){};
}
class voiture extends vehiculeImmatricule
{
	var $nbPortes;
}
class camion extends vehiculeImmatricule
{
	var $nbEssieux;
}
					

Le polymorphisme et surcharge des méthodes

Tout véhicule est capable de s'afficher. Mais l'affichage d'un camion est différent de l'affichage d'une voiture. Reprenons l'exemple précédent en implémentant les méthodes affiche() des différentes classes.

class vehicule
{
	var $vitesseMax;
	var $kmCompteur;
	function setVitesseMax($vitesse){};
	function rouler($nbkm){};
	function affiche()
	{
		echo "vitesse maximale constatée:$this->vitesseMax<br>"
		echo "Nombre de KM au compteur: $this->kmCompteur<br>";
	}
}
class vehiculeImmatricule extends vehicule
{
	var $noImmat;
	function setNoImmat($immat){};
	function afficher()
	{
		parent::affiche();
		echo "Numero d'immatriculation: $this->noImmat<br>";
	}
}
class voiture extends vehiculeImmatricule
{
	var nbPortes;
	function affiche()
	{
		echo "je suis une voiture disposant de $this->nbPortes portes<br>";
		parent::affiche();
	}
}

class camion extends vehiculeImmatricule
{
	var $nbEssieux;
	function affiche()
	{
		echo "je suis un camion disposant de $this->nbPortes essieux<br>";
		parent::affiche();
	}
}
					

Exercices POO php

  1. Exercice 15.1

    Réalisez un script php instanciant la classe camion et voiture et affichant les instances créées.

  2. Exercice 15.2

    En vous aidant des réalisations du début du chapitre, construire une hiérarchie de classe permettant de créer des documents html contenant formulaires , inputs de toute nature textes balisés ou non, tableaux et images.

    Passer un objet d'un script à l'autre nécessite la sérialisation de celui-ci

Conclusion

Si vous êtes arrivé ici en réalisant l'ensemble des exercices, vous possédez maintenant les bases indispensables au développement d'application

L'étape suivante va consister à choisir le framework qui vous conviendra pour uniformiser les travaux que vous réalisez

Ils sont nombreux: Symphony, Zend framework, Kohana, Typo3, liste des frameworks php sur wikipédia

Ils nécessitent un temps plus ou moins long d'apprentissage, et évoluent à un rythme que vous ne maîtrisez pas ce qui vous oblige à revoir votre code régulièrement

La multiplicité et la lourdeur de ces frameworks est contraire à la philosophie du logiciel libre "petit mais efficace" et dénote encore malheureusement un manque de maturité.

Il faut de toute façon avoir un aperçu de ce qu'est un framework et en quoi consiste le développement par framework.

Je vous suggère si vous souhaitez vous lancer l'un des frameworks yii ou codeigniter pour la qualité de leur documentation et leur relative simplicité.

Les analyses google visibles ici permettent de se rendre compte du cycle de vie d'un framework on observe une forte croissance suivie d'un abandon progressif au fur et à mesure de l'évolution de celui-ci.