Aide-mémoire PHP
Aide-mémoire sur les structures PHP. Vous retrouverez dans cet aide-mémoire les éléments que nous avons vus ensemble.
WARNING
Cet aide-mémoire n'est pas exhaustif, il ne contient que le minimum à connaitre pour débuter sereinement.
Table des matières
Structure
Pour être exécuté, votre code doit être placé dans un fichier avec l'extension .php (par exemple ma-page.php) et écrit entre les balises suivantes :
<?php
// Votre code
?>Afficher des données
<h1><?php echo "Ceci est un titre"; ?></h1>
<!-- Ou -->
<?php echo "Ceci est un <i>titre</i>"; ?>
<!-- Ou -->
<?php
$test = "Ceci est une variable";
echo "Vous allez voir le contenu de la variable : $test";
?>Passer des paramètres à la page

Pour envoyer le paramètre param à la page index.php :
http://localhost/index.php?param=abc
Pour envoyer le paramètre param & nb à la page index.php :
http://localhost/index.php?param=abc&nb=10
Inclure un fichier dans un autre
<?php
include('monfichier.php');
?>Les variables
$var1 = 1; // Valeur numérique
$var2 = "Démonstration"; // Valeur texte
$var3 = true; // Valeur Booléenne
$var4 = ["a","b","c"]; // Tableau| Type | Contenu | Type d'opération | Usage |
|---|---|---|---|
string | "Une chaine de caractère" | Gestion du texte, concaténation | Permet de stocker du texte (saisie utilisateur par exemple). La valeur doit être entourée de « " » ou de « ' » |
int | 42 | Opération mathématique | Comme en mathématique |
boolean | True ou False | Opération logique | Permet de faire des actions logiques. C'est un type très important en informatique |
float | 10.3 | Opération mathématique | Comme en mathématique. Attention la notation du chiffre à virgule est avec un .. |
array | ["a", "b", "c"] | Contient des listes de « quelque chose » |
TIP
Pour concaténer / fusionner deux variables en PHP nous utiliserons le caractère . exemple :
echo "=> " . $var1 . "<=";Les superglobales
| Variables | Usage |
|---|---|
$_SERVER | Contient les informations « techniques » de la connexion. Adresse IP du client, etc. |
$_GET | Contient les paramètres envoyés dans l'URL. |
index.php?prenom=valentin, prenom est donc un paramètre et valentin la valeur. | |
Vous pouvez avoir plusieurs paramètres avec le caractère &. Ex. index.php?nom=brosseau&prenom=valentin | |
$_POST | Contient les paramètres envoyés dans le corps de la requête (on y reviendra) |
$_FILES | Contient les fichiers envoyés à votre serveur (nous y reviendrons) |
$_SESSION | Permet de sauvegarder des valeurs pour quelques minutes, le temps de la navigation (nous y reviendrons) |
$_COOKIE | Permet de sauvegarder des valeurs pour un temps plus long (mais pas illimité, nous y reviendrons) |
Les conditions
$age = 22;
if($age === 22){
echo "Je suis affiché si $age est === 22";
}
if($age >= 18) {
echo "Vous pouvez passer le permis";
} else {
echo "Encore un peu de patience… Pour le permis c'est à 18 ans";
}Vérifier si une variable existe :
if(isset($_GET['param'])){
// ici la variable $_GET['param'] est présente
}Les boucles
La boucle while :
$i = 0;
$max = 100;
while($i < $max){
echo "Je serai affiché 100x";
$i = $i + 1; // équivalent à $i++;
}La boucle for :
$max = 100;
for ($i = 0; $i < $max; $i++){
echo "Je vais m'afficher 100x";
}$etudiants = [
['nom' => 'Brosseau'],
['nom' => 'Doe']
];
// Je vais afficher l'ensemble des étudiants présents dans le tableau.
for($i = 0; $i < count($etudiants); ++$i) {
echo $etudiants[$i]['nom'];
}La boucle foreach :
Identique à la boucle for mais plus concise
$etudiants = [
['nom' => 'Brosseau'],
['nom' => 'Doe']
];
// Je vais afficher l'ensemble des étudiants présents dans le tableau.
foreach ($etudiants as $current) {
echo $current['nom'];
}Boucle for pour afficher des données
Solution 1 : Via un echo
<?php
foreach ($elements as $element){
echo "
<tr>
<td> " . $element["id"] . "</td>
<td> " . $element["phrase"] . "</td>
<td> " . $element["nombre"] . "</td>
<td> " . $element["date"] . "</td>
<td> " . $element["ip"] . "</td>
</tr>
";
}
?>Solution 2 : Sans echo
<?php
foreach ($elements as $element){
?>
<tr>
<td><?php echo $element["id"] ?></td>
<td><?php echo $element["phrase"] ?></td>
<td><?php echo $element["nombre"] ?></td>
<td><?php echo $element["date"] ?></td>
<td><?php echo $element["ip"] ?></td>
</tr>
<?php
}
?>Les fonctions
Déclarer une fonction
function gateauHugette($duree){
$oeuf = 3;
$sucre = 100;
$farine = 50;
$beurre = 100;
$chocolat = 200;
$melange = $oeuf + $sucre + $farine + $beurre+ $chocolat;
return "Cuire $duree minutes le mélange de $melange grammes.";
}utiliser la fonction :
echo gateauHugette(50);
// Je vais afficher à l'écran "Cuire 50 minutes le mélange de 453 grammes.";La SESSION
En PHP, nous avons la possibilité de sauvegarder « simplement » des données côté serveur. En PHP la SESSION n'est pas démarrée automatiquement, il faut pour ça :
session_start();À partir de maintenant vous pouvez écrire dans votre SESSION, par exemple :
$_SESSION["groupe"] = "admin";
// Cette valeur est maintenant persistée sur le serveur, votre utilisateur sera admin jusqu'à ce que la SESSION soit détruite.Et pour détruire les données ?
Si vous souhaitez détruire la SESSION et l'ensemble des valeurs présentes dedans, vous devez détruire la SESSION:
session_destroy();Redirection d'un utilisateur
En PHP vous pouvez rediriger l'utilisateur d'une page à l'autre assez simplement.
<?php
// Redirection vers Google
header('Location: https://www.google.com');
die();
?>
<?php
// Redirection vers une page de votre site
header('Location: ./connexion.php');
die();
?>
<?php
// Redirection vers une page de votre site avec des paramètres.
header('Location: index.php?page=connexion');
die();
?>die ?
La fonction die() permet d'arrêter l'exécution de la suite du script. Dans le cadre d'une redirection ça permet d'être certain que la suite du code ne sera pas exécutée.
Exemple simple
Exemple de fichier PHP avec traitement, accessible via un lien du type :
http://localhost/index.phphttp://localhost/index.php?nb=10http://localhost/index.php?nb=100&phrase=Ceci est un test
$nb_lignes = 25; // Nombre de phrases à écrire par défaut
$phrase = 0; // Nombre de phrases actuellement écrites
$a_ecrire = "Ceci est ma phrase par défaut"; // phrase par défaut
// Test si le paramètre nb est passé dans la barre d'adresse.
if(isset($_GET['nb'])){
// on redéfinit nb_lignes par rapport à ce qui est dans la barre
$nb_lignes = $_GET['nb'];
}
// Test si phrase est passé en paramètre
if(isset($_GET['phrase'])){
$a_ecrire = $_GET['phrase'];
}
// Traitement
// Boucle qui affiche les phrases.
while($phrase < $nb_lignes){
echo "<p>" . $a_ecrire . "</p>";
$phrase = $phrase + 1; // équivalent à $phrase++;
}Page de traitement
Une page de traitement est une page « avec un traitement côté serveur », la structure de celle-ci est toujours la même :
<?php
if(isset($_POST['input'])){
// Traitement, c'est ici que vous devez écrire votre code
// Il correspond à l'action que vous souhaitez faire avec les données reçues.
// - Insertion en BDD
// - Authentification
// - Etc
}
?>
<form action="" method="POST">
<input type="text" name="input" placeholder="Votre Input" />
<input type="submit" value="Ajouter">
</form>Gestion basique d'une authentification « Simple »
En PHP, il est possible assez simplement de gérer des espaces d'administration. Les espaces d'administration sont « de simples pages web », elles sont juste protégées par un login et un mot de passe avant d'entrer sur la page souhaitée.
Nous pouvons représenter notre problématique telle que :

Et le code ?
Le code pour écrire une telle problématique est simple, il se résume à tester une variable de SESSION.
Page à protéger:
<?php
// Vérification si l'utilisateur est connecté
if(!isset($_SESSION['user']) || $_SESSION['user'] == ''){
// La personne n'est pas connectée, redirection vers la page de connexion
header('Location: index.php?page=connexion');
die();
}
?>
<!-- Le reste de votre page -->Page de connexion:
<?php
if(isset($_POST['login']) && isset($_POST['password'])){
// Gestion du login utilisateur
// Ici vous implémentez votre logique de connexion (par exemple vérification en base de données, ou un simple test, etc…)
// Bien évidemment c'est un exemple.
// UTILISER UNE BASE DE DONNÉES À LA PLACE !!
if($_POST['login'] == 'admin' && $_POST['password'] == "SPHHIBGjXKqkTubwIY1JZv6hukaMBH3"){
// Si les informations saisies par l'utilisateur correspondent, celui-ci est maintenant connecté
$_SESSION['user'] = 'admin';
header('Location: index.php?page=home'); // Redirection de l'utilisateur car correctement connecté.
die();
} else {
unset($_SESSION['user']);
}
}
?>
<form action="index.php?page=connexion" method="post">
<input type="text" name="login" placeholder="Votre Login" />
<input type="password" name="password" placeholder="Votre mot de passe" />
<input type="submit" value="Me connecter">
</form>Page de connexion avec base de données:
<?php
if(isset($_POST['login']) && isset($_POST['password'])){
// Récupération de l'utilisateur via son login
$stmt= $pdo->prepare("SELECT * FROM users WHERE login=?");
$stmt->execute([$_POST['login']]);
$user = $stmt->fetch(\PDO::FETCH_ASSOC);
// L'utilisateur existe et le mot de passe saisi correspond au hash en base de données
if($user && password_verify($_POST['password'], $user['password'])){
// Réussite de la connexion, on sauvegarde dans la SESSION les informations.
$_SESSION['user'] = $user;
header("Location: /");
die();
} else {
// Action en cas d'échec de connexion
}
}
?>
<form action="index.php?page=connexion" method="post">
<input type="text" name="login" placeholder="Votre Login" />
<input type="password" name="password" placeholder="Votre mot de passe" />
<input type="submit" value="Me connecter">
</form>Et à l'inscription ?
Le mot de passe ne doit jamais être stocké en clair en base de données. Au moment de l'inscription, vous devez le hacher côté PHP avec password_hash($_POST['password'], PASSWORD_DEFAULT), c'est ce hash que password_verify() comparera ensuite. Pour en savoir plus, consultez l'aide-mémoire OWASP.
Le PHP et la base de données
Si vous souhaitez l'aide-mémoire pour la partie SQL c'est par ici
Le code de connexion
Ce code est à mettre dans un fichier utils/db.php, il suffira de l'inclure dans les pages où vous souhaitez faire des requêtes.
// Cette partie est à customiser
$server = "localhost";
$db = "VOTRE-BDD";
$user = "utilisateur";
$passwd = "mot-de-passe";
// Fin de la partie customisable
// Cette partie est générique à l'ensemble de vos projets utilisant une base de données.
$dsn = "mysql:host=$server;dbname=$db";
$pdo = new PDO($dsn, $user, $passwd);Faire une requête SIMPLE (sans paramètre(s))
// ATTENTION ATTENTION : Cette ligne ne doit être mise qu'une seule fois.
include('./utils/db.php');
// Requêtes SQL que nous souhaitons jouer.
$results = $pdo->query("SELECT * FROM votreTable")->fetchAll(\PDO::FETCH_ASSOC);Faire une requête préparée (avec des paramètres)
// ATTENTION ATTENTION : Cette ligne ne doit être mise qu'une seule fois.
include('./utils/db.php');
// Requête préparée :
$stmt= $pdo->prepare("SELECT * FROM phrases WHERE id = ?");
$stmt->execute([22]); // Paramètre qui va remplacer le « ? ».
$results = $stmt->fetchAll(\PDO::FETCH_ASSOC);TIP
Dans quel cas utiliser l'un, et dans quel cas utiliser l'autre ? C'est simple, vous avez des valeurs variables (paramètres, saisie utilisateur, etc.) ?
- OUI : Requête préparée.
- NON : Requête classique.
Faire une requête préparée avec des paramètres typés
// ATTENTION ATTENTION : Cette ligne ne doit être mise qu'une seule fois.
include('./utils/db.php');
$nbParPage = 2; // Nombre d'éléments par page
$page = 0; // Page actuellement affichée
$stmt= $pdo->prepare("SELECT * FROM phrases LIMIT ? OFFSET ?");
$stmt->bindValue(1, $nbParPage, PDO::PARAM_INT); // Paramètre qui va remplacer le 1er « ? »
$stmt->bindValue(2, $nbParPage * $page, PDO::PARAM_INT); // Paramètre qui va remplacer le 2nd « ? ».
// On lance la requête sur le serveur de BDD
$stmt->execute();
// Récupération des résultats dans la variable $results.
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);Réécriture de lien
Pour ça, il faut créer un fichier .htaccess avec comme contenu:
RewriteEngine On
RewriteCond %{REQUEST_URI} !index.php
RewriteRule (.*).html index.php?page=$1 [L,QSA]Nous pouvons donc maintenant écrire :
- home.html (
index.php?page=home) - bart.html (
index.php?page=bart) - about.html (
index.php?page=about)
Comment ça fonctionne ?
Nous avons donc une règle qui indique :
(.*).html => index.php?page=$1 [L,QSA]
Le (.*).html veut dire n'importe quel texte saisi avant le .html sera transformé en index.php?page=$1. $1 étant « le n'importe quoi saisi avant le .html ».