<?php
$CM = 3;
$TDs = 4;
$TPs = 13;
$nbHeures = ($CM + $TDs + $TPs) * 2;
echo 'Nb. heures = '.$nbHeures;
?>
Note : Le contenu est construit sur la base du PPN 2013 (page 45).
<?php
/* $note1 QCM sur la 2nde partie
* $note2 QCM sur la 3ème partie
* $noteTP TP noté sur machine en Janvier */
function noteFinale( int $note1, int $note2, int $noteTP ) : float
{
return ($note1 + $note2) / 2 * 0.4 + $noteTP * 0.6;
}
?>
Une seule référence à retenir :
http://php.net
\(\gg\)
PHP, c’est le langage de programmation utilisé par 80% des sites web au niveau mondial.
Javascript, c’est seulement \(\approx1\%\)
<!DOCTYPE html>
<html>
<head>...</head>
<body>
<p><?php echo "Hello IUT !"; ?></p>
</body>
</html>
PHP est un langage de programmation :
<!DOCTYPE html>
<html>
<head>...</head>
<body>
<p><?php echo "Hello IUT !"; ?></p>
</body>
</html>
page.php
$ php -f page.php
<!DOCTYPE html>
<html>
<head>...</head>
<body>
<p>Hello IUT !</p>
</body>
</html>
Interprétation de page.php
avec php
php
c’est aussi un programme :
// Commentaire sur une ligne
/* Commentaire sur
* plusieurs lignes */
// Déclaration et affectation de variables
$a;
$a = 8;
$b = 10;
// Définition d'une constante
const NOM_MODULE = 'W31';
// Chaînes de caractères
$message = 'calcul sur ' . $a . ' et ' . $b;
// Opérateurs arithmétiques
$res = $a + $b;
$res *= $b - $a;
// Test d'existence d'une variable
isset($res);
// Test sur le type d'une variable
is_int($a); // true
is_string($b); // false
/* Obtenir le type d'une variable
sous forme de chaine de caractères */
gettype($a); // 'integer'
gettype($message); // 'string'
Attention au typage dynamique !
$a = 10; // a est un entier
echo gettype($a); // 'integer'
$a = "dix"; // a est maintenant une chaine de caractères
echo gettype($a); // 'string'
En PHP, tous les tableaux sont
des tableaux associatifs (dictionnaires).
/* Déclaration d'un tableau */
// 1. Avec des clés implicites
$tab1 = [1,'deux',3] // Avant : array(1,2,3);
echo $tab1[1]; // 'deux'
// 2. Avec clés explicites
$tab3 = [ 0 => 1, 1 => 'deux', 2 => 3 ];
echo $tab3[2]; // 3
// Taille d'un tableau
count($tab1);
// Afficher un tableau
print_r($tab1);
/* Array ( [0] => 1
* [1] => 2
* [2] => 3 ) */
/* - Une clé peut être un entier ou une
* chaine de caractères
* - Une valeur peut être de n'importe
* quel type */
$notes = [
'Jean' => 3,
'Simon' => 12.3,
'Alex' => 'Absent',
12 => ['Paul','Robert']
];
echo $notes['Jean']; // Affiche 3
// Ajout d'un élément à un tableau
$notes['Étienne'] = 8;
$notes[] = 9; // Ajout (13 => 9) à $notes
// Suppression d'un élément
unset($notes[12]);
// Conditionnelle
if ($load < 100) {
echo 'Chargement en cours...';
}
// La directive 'else { ... }' est facultative
else {
echo 'Chargement terminé !';
}
// Boucle for
for ($load = 1; $load < 100; $load++) {
echo 'Chargement : '.$load.'/100';
}
// Boucle while
$load = 1;
while ($load < 100) {
echo 'Chargement : '.$load.'/100';
$load++;
}
// Itération sur un tableau
$tab = ["W31","W11","A31"];
// Si on ne veut traiter que les valeurs
foreach( $tab as $module ) {
echo "J'aime ".$module."\n";
}
/* Résultat :
* J'aime W31
* J'aime W11
* J'aime A31 */
// Si on veut traiter les couples
// (clé => valeur)
foreach( $tab as $i => $module ) {
echo $i . ") J'aime ".$module;
}
/* Résultat :
* 0) J'aime W31
* 1) J'aime W11
* 2) J'aime A31 */
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ma première page PHP</title>
</head>
<body>
<p>Hello W31 !</p>
</body>
</html>
fullHTML.php
<?php echo '<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ma première page PHP</title>
</head>
<body>
<p>Hello W31 !</p>
</body>
</html>';
fullPHP.php
Un fichier d’extension .php
peut contenir :
<!DOCTYPE html>
<html>
<head>
<title>HTML produit par PHP</title>
</head>
<body>
<?php
$num = rand(1,10);
if ( $num < 5 ) {
echo '<p>Inférieur à cinq</p>';
} else {
echo '<p>Supérieur à cinq</p>';
}
?>
</body>
</html>
page.php
<!DOCTYPE html>
<html>
<head>
<title>HTML controlé par PHP</title>
</head>
<body>
<?php
$num = rand(1,10);
if ( $num < 5 ) {
?>
<p>Inférieur à cinq</p>
<?php } else { ?>
<p>Supérieur à cinq</p>
<?php } ?>
</body>
</html>
memePage.php
Le PHP peut être alterné avec du HTML :
<!DOCTYPE html>
<html>
<?php require('head.php'); ?>
<body>
<?php require('header.php'); ?>
<main>...</main>
<?php require('footer.php'); ?>
</body>
</html>
Les instructions include
et require
permettent d’insérer un fichier PHP au sein d’un autre fichier. Cela évite la redondance de code.
Si le fichier inclus/requis n’existe pas :
require
stoppe l’exécution du script avec une erreurinclude
continue l’exécution et affiche un avertissementVariantes : include_once
et require_once
n’insèrent un fichier que si celui-ci n’a pas déjà été inclus.
C’est la configuration du serveur HTTP qui précise les conditions nécessaires pour qu’une requête soit transmise au module PHP.
Cela peut être :
server {
listen 80;
server_name site.fr;
# Path to the root of your installation
root /var/www/site.fr/;
index index.php;
location ~ \.php$ {
...
fastcgi_pass module-php;
...
}
}
Exemple de fichier de configuration de Nginx.
PHP exploite deux mécanismes pour échanger des données avec le client :
$_GET
$_POST
Si le client envoie l’URL suivante comme requête au serveur :
http://site.fr/index.php?module=W31&nbEns=3
et que le script index.php
est le suivant :
Vous suivez le module <? echo $_GET['module']; ?>
<br>
Il est composé de <? echo $_GET['nbEns']; ?>.
alors le client recevra le contenu suivant :
Vous suivez le module W31.<br>Il est composé de de 3 intervenants.
qui sera interprété comme du HTML si le client est un navigateur.
Si le client envoie le formulaire suivant au serveur :
<form method="post" action="index.php">
<input type="text" name="nom">
<input type="number" name="age">
<input type="submit">
</form>
et que le script index.php
est le suivant :
Bonjour <?php echo $_POST['nom']; ?>
<br>
Avez-vous réellement <?php echo $_POST['age']; ?> ans ?
alors le client recevra un contenu semblable à :
Bonjour Bilbo.<br>Avez-vous réellement 142 ans ?
où le nom et l’âge dépendent des valeurs spécifiées dans le formulaire.
Règle d’or : Ne jamais faire confiance aux données transmises
par le client, toujours les vérifier.
Un client peut écrire les paramètres qu’il veut dans l’URL, quelle que soit la valeur que vous attendez. Exemple :
http://site.fr/index.php?module=W31&nbEns=90
http://site.fr/index.php?module=10935&nbEns=<script>alert('coucou');</script>
Un client peut :
input
.action
votre script.Un cookie :
setcookie()
:setcookie( 'nom', 'valeur', time() + 60*60*24*10);
'nom' => 'valeur'
est créé lorsque le serveur PHP exécute cette fonction.Set-Cookie: nom=valeur; expires=...; path=/; domain=site.fr
… et le serveur n’en garde aucune trace.
Cookie: nom=valeur
$_COOKIE
pour exploiter l’information du cookie.Un serveur peut stocker plusieurs cookies pour un même domaine. Lors d’une requête vers ce domaine, ils sont tous ajoutés à l’entête.
Cookie: nom=valeur; autrenom=autrevaleur ; ...
C’est le même mécanisme que pour la création :
setcookie()
:setcookie( 'nom', '', time() - 3600); // Expiration il y a une heure
Set-Cookie: nom=valeur; expires=...; path=/; domain=site.fr
… et sa date d’expiration déclenchera le mécanisme de suppression par le navigateur.
setcookie()
doit TOUJOURS être appelée AVANT tout texte du corps de la réponse HTTP.
Une session :
session_start()
:session_start();
$_SESSION
associé à l’identifiant est créé sur le serveurSet-Cookie: PHPSESSID=rvPT5v5QVPJ8H_Dh54yWuTfhBDbHZ_BkDC1TaWBn8RxBcDpy
… et le client ne connait donc que son identifiant.
Cookie: PHPSESSID=rvPT5v5QVPJ8H_Dh54yWuTfhBDbHZ_BkDC1TaWBn8RxBcDpy
$_SESSION
associé à l’identifiant.… et peut alors accéder aux variables de session du client.
session_destroy()
:session_destroy();
Attention : la session existe toujours, seules les données sont détruites.
session_start()
doit TOUJOURS être appelée AVANT tout texte du corps de la réponse HTTP.
Note : à l’inverse des cookies, les sonnées des sessions sont stockées sur le serveur, un client ne peut donc ni les modifier ni les supprimer.
Comment vérifier et protéger ?
Permet d’éviter les injections de code (faille XSS).