Documentation atelier n° X : PHP/MySQL

PHP

Un langage côté serveur qui permet de traiter des données. Le PHP peut interagir avec une base de données.
Avec le PHP on peut générer du HTML, des images, des PDF.

Le PHP est un langage libre, contrairement à l’ASP similaire de Microsoft.

Un fichier php peut contenir du code HTML, mais aussi et surtout du code PHP. Le code PHP doit être écrit dans une balise particulière pour être interprété par le serveur :

		<?php
		/*
		Voici, comme en CSS, un commentaire sur plusieurs lignes,
		entre deux balises PHP.
		*/
		// Ceci est un commentaire sur une ligne.
		?>

Les variables

Une variable en PHP est toujours précédé par le signe $. Le nommage des variables est libre, tant qu’il n’y a pas d’espaces, de points, d’accents, ou de caractères spéciaux autre que le tiret et le tiret bas. Certains noms de variables par contre sont réservés, comme get ou post.

		<?php
		var $mavariable; // on peut déclarer une variable expressément
		$mavariable = "une chaine de caractères";
		$mavariable = 1; // un nombre entier
		$mavariable = 0.2; // un nombre flottant
		$mavariable = true; // un boolean : true ou false
		$mavariable = $uneautrevariable;

		// pour "imprimer" la valeur d'une variable il suffit d'utiliser la fonction "echo()"
		echo $mavariable;

		// ou encore comme ceci :
		echo "La valeur de la variable $mavariable est : $mavariable";

		// Ce qui est la même chose que
		echo 'La valeur de la variable $mavariable est : ' . $mavariable;

		?>

Les arrays

Un array ou tableau est une pile de variables.

		<?php
		$valise = array('chaussures', 'pulls', 'pantalons');
		$placard = array('tiroirbas' => 'serviettes', 'tiroirmilieu' =>'t-shirts', 'tiroirhaut' =>'culottes');

		// pour afficher le contenu d'un array on utilise la fonction print_r()
		print_r($valise);
		print_r($placard);

		?>

Ce print_r donnera comme résultat :

		Array
		(
			[0] => chaussures
			[1] => pulls
			[2] => pantalons
		)

		Array
		(
			[tiroirbas] => serviettes
			[tiroirmilieu] => t-shirts
			[tiroirhaut] => culottes
		)

Ci-dessus : avant la flèche nous avons les keys (clefs), après la flèche les values (valeurs) du tableau.
Un array dans lequel les clefs sont nommés, comme dans notre exemple $placard s’appelle « associatif ».

Un array non associatif commence toujours à 0, pas seulement en PHP, mais aussi dans d’autres langages de programmation.

Si je veux seulement savoir ce qu’il y a dans mon tiroir du milieu de mon placard, je peux accéder à cet emplacement directement :

		echo "Dans le tiroir du mileu du placard se trouvent des " . $placard['tiroirmilieu'] ".";

		// résultat attendu :
		Dans le tiroir du milieu du placard se trouvent des t-shirts.

Pour ajouter un objet à un array:

		<?php
		// ajouter un objet à la fin de l'array :
		$valise[] = "maillot de bain";

		// ajouter ou modifier un objet à un emplacement précis :
		$valise[3] = "maillot de bain";
		$placard['tiroirmilieu'] = "chaussettes";
		?>

Evidemment on peut créer des arrays multidimensionnels, c’est à dire des arrays qui contiennent des arrays :

		<?php
		array $eleves(
			0 => array('nom' => 'Dupont',
					  'prenom' => 'Aline';
					  'presence' => 'oui';
				)
			1 => array('nom' => 'Dreyfus',
					  'prenom' => 'Sarah';
					  'presence' => 'oui';
				)
			2 => array('nom' => 'Lovelace',
					  'prenom' => 'Ada';
					  'presence' => 'non';
				)
		);
		?>

Les variables globales / spéciales

		<?php
		echo '<pre>';
		print_r($_GET);
		print_r($_POST);
		print_r($_SERVER);
		print_r($_SESSION);
		print_r($_COOKIE);
		echo '</pre>';
		?>

Les opérateurs de comparaison

Les conditions

Imaginons un sélecteur de langue sur un site web, on a trois langues, et la langue par défaut c’est le français :

		<?php
		if($langue == "anglais") {
			echo "Good morning!";
		} else if ($langue == "allemand") {
			echo "Guten Tag";
		} else {
			echo "Bonjour !";
		}
		?>

Les opérateurs logiques

		<?php
		if($langue == "anglais" || $langue == "allemand") {
			echo "Error 404";
		} else {
			echo "Nous allons vous afficher l'article sélectionné.";
		}
		?>
Exemple Variante écriture Nom Résultat
$a AND $b $a && $b et logique Vrai si $a ET $b sont vrais
$a OR $b $a || $b ou logique Vrai si $a OU $b est vrai
$a XOR $b ou exclusif Vrai si $a OU $b est vrai, mais pas les deux en même temps
!$a non logique Vrai si $a est faux

Les boucles

		<?php
		// boucle for qui démarre à zéro, jusqu'à 10 (sans 10), et à chaque fois on incrémente de 1
		for($i = 0, $i > 10, $i++ ) {
			echo "passage numéro $i dans la boucle.<br />";
		}

		// tant que $i n'est pas égal à 10 on repasse dans la boucle :
		$i = 0;
		while($i != 10) {
			echo "passage numéro $i dans la boucle.<br />";
			$i++;
		}
		?>

Les fonctions

		<?php
		// définition des actions à effecteur à l'intérieur de la fonction
		function helloWorld() {
			echo "Hello, World!";
		}

		// appeller la fonction pour l'exécuter
		helloWorld();
		?>

On peut passer des paramètres à une fonction :

		<?php
		function sayhello($nom) {
			echo "Hello $nom!";
		}

		// appeller la fonction pour l'exécuter en passant un nom en paramètre
		sayhello('Aline');

		// passer plusieurs paramètres :
		function sayhello($nom, $prenom) {
			echo "Hello $prenom $nom!";
		}

		// appeller la fonction pour l'exécuter en passant un nom en paramètre
		sayhello("Dupont", "Aline");
		?>

Un exemple un peu plus avancé qui utilise la fonction date() de PHP :

		<?php
		function sayhello($nom) {
			if(isset($_GET['langue']) && $_GET['langue'] == "anglais") {
				$currentdate = date('D, m-d-Y');
				echo "Hello $nom! Today is $currentdate.";
			} else {
				$currentdate = date('D, le d/m/Y');
				echo "Bonjour $nom ! Aujourd'hui nous sommes $currentdate.";
			}
		}

		// appeller la fonction
		sayhello('Aline');
		?>

La sécurité

Chaque endroit dans lequel un utilisateur peut rentrer des données est potentiellement vulnérable.

Imaginons une URL de type http://monsite.com/index.php?page=images.php.

Pour afficher la page « images.php » nous avions crée le code suivant :

		<?php
		if (isset($_GET('page'))) {
			include ($_GET['page']);
		}
		?>

Dans le code ci-dessus, on vérifie à aucun moment que la page existe, et que ce n’est pas une page qui n’a rien à voir avec notre site. Il serait alors possible et à la portée de n’importe quel utilisateur d’inclure une autre page dans la notre, sans notre consentement, par exemple en utilisant une URL comme http://monsite.com/index.php?page=http://google.fr ou pire, http://monsite.com/index.php?page=http://sitedecul.com.

Pire, il pourra tenter d’inclure des fichiers qui sont sur le serveur, en dehors du répertoire de notre site : http://monsite.com/index.php?page=/etc/passwd.

Imaginez ce que ça donne quand les variables $_GET ou $_POST sont traités directement par la base de données, sans que leur intégríté ait été vérifiée…

Pour tout include il faut créer une règle qui exclue les pages qui commencent par /, les pages ou fichier qui n’existent pas sur le serveur (file_exists($file)), les arborescences qui montent au delà du répertoire de votre site (../../../../etc/passwd).

La manière la plus propre de faire est a priori de créer un array qui définit les pages existantes, par exemple comme ceci :

		<?php
		$pages = array('images' => 'images.php',
				'cv' => 'cv.php',
		);
		if (isset($_GET('page'))) {
			$pagedemandee = $_GET['page'];
			if ($page[$pagedemandee] && file_exists($pages[$pagedemandee])) {
				// dans ce cas seulement on affiche la page
				include($page[$pagedemandee]);
			} else {
				// dans ce cas on affiche une erreur.
				echo 'Cette page n'existe pas.';
			}
		}
		?>

Les objets

Dans un prochain atelier ?

Retour au sommaire

MySQL

MySQL est un format et un langage de base de données. Ce n’est pas le seul format de base de donnée, mais celui qui est le plsu répandu. Il y a d’autres formats, par exemple : MariaDB, PostgreSQL, ODBC (openoffice), Oracle (propiétaire), etc.

On peut accéder à un serveur MySQL via la ligne de commande ou via Phpmyadmin (et évidemment via un script que l’on aurait écrit, par exemple en PHP).

ID nom prenom age ville
1 Bille Gertrude 55 Marseille
2 Dubois Bertrand 32 Nantes
3 Dupont Michèle 76 Paris
4 Muller Marine 16 Metz
5 Phare Noah 19 Paris

* SELECT – extraire
* UPDATE – mettre à jour
* DELETE – supprimer
* INSERT INTO – insérer

SELECT * FROM personnes
SELECT nom,prenom FROM personnes
SELECT * FROM personnes WHERE nom='Dubois'
SELECT * FROM personnes WHERE nom='D%'

/* nouvelle ligne */
INSERT INTO personnes VALUES ('Frèche', 'Camille', '24', 'Lyon') ; /* ajouter une ligne avec toutes les valeurs */

/* mettre à jour */
UPDATE personnes SET ville='Lyon' WHERE ID='1'  ;

/* supprimer une ligne */
DELETE * FROM personnes WHERE ID=2 ;

Retour au sommaire

Pour aller plus loin

Apache

Pour éviter les URLs contenant des variables comme « page=home&&article=33&&version=1″ et afin d’optimiser les URLs pour les moteurs de recherche, on peut créer un fichier .htaccess en utilisant le mod_rewrite d’Apache.

Retour au sommaire