Cédric BRASSEUR
Le cours est réalisé en trois parties :
Des exercices seront proposés tout au long de la formation.
Summary
Création par Rasmus Lerdorf pour ses besoins personnels, avant d’être rendu public début 1995
Capacité de gérer les formulaires et d’accéder à la base mSQL
Version 3 de PHP
L’analyseur PHP est migré sur le moteur d’analyse Zend
La version 5 voit le jour
Sortie de la version 7
Version 8, sortie d'une nouvelle version majeure
1994
1995
1998
1995
2000
1995
2004
1995
2015
1995
2020
P
H
P
L'installation devrait déjà être faite, nous allons uniquement vérifier ça et démarrer les services.
Pour vérifier, on va créer un script test.php dans le dossier wamp/www/formation-php (créez vous même le dossier formation-php).
Insérez le code "<?php echo "Hello world !"; ?>" dans ce script.
Ensuite, on va aller sur l'adresse
http://localhost/formation-php/test.php
Lien de téléchargement de Wamp (Windows)
HTTP Request
Demande du client à effectuer une action via le protocole HTTP
HTTP Response
Réponse formatée par le serveur pour retourner l'information voulue au client via HTTP
Les balises servent à inclure du code php dans un script, sans balise, le code est compilé comme texte en sortie.
Plusieurs manières de faire, mais ayant la même finalité :
Un commentaire n'est pas interprété dans le code, il permet uniquement d'expliquer dans le code ce que va réaliser le bloc de code suivant le commentaire.
Une variable est un emplacement mémoire réservé pour y stocker des données qui peuvent varier au fil du temps
Explications sur les types de données
Une variable contient un type de données, dont les principaux se trouvent ici
Premier script PHP intégré dans du HTML
Cet exercice sera très simple, on va simplement créer un script php qui affiche le contenu d'une variable.
Dans un premier temps, on va tous installer Wamp, Xamp, Lamp, selon votre OS.
Ensuite, nous allons créer un fichier variable.php dans le dossier www de wamp (sous Windows : C:/wamp64/www). Je vous conseil de créer un sous dossier "formation".
Dans ce fichier, on va mettre le contenu d'une page HTML classique en y intégrant un peu de PHP (https://www.w3schools.com/html/html_basic.asp)
Prenez le temps de réaliser l'exercice en même temps que la démonstration, n'hésitez pas à demander du temps pour l'installation de Wamp et ce premier script.
Il suffit d'aller sur l'adresse localhost associée à votre script, pour mon exemple précédent :
Donnant le résultat suivant :
On se place à l'endroit où se trouve le script dans un invite de commande, pour ma part depuis VSCode et dans le dossier C:\wamp64\www\formation-php
Puis on exécute la commande suivante :
Donnant le résultat suivant :
php .\variables.php
Vous pouvez directement utiliser les opérateurs arithmétiques classiques pour réaliser des opérations en PHP.
Plusieurs opérateurs logiques vous seront utiles en développant en PHP : &&, ||, !bool,...
De même pour les opérateurs de comparaisons : ===, !== , >=, <=,...
Comparaison
Logique
Une condition permet de réaliser une opération ou une autre en fonction d'une comparaison dans le code.
Un switch permet de réaliser plusieurs opérations en fonction de la valeur d'une variable, à l'instar d'une condition mais avec une syntaxe parfois plus adaptée en fonction du cas.
Créer un petit programme PHP qui détermine si une personne est majeure ou mineure à partir de son âge.
Pour tester votre programme, vous pouvez directement utiliser la console en faisant php nomDeVotreScript.php
Un tableau un type de donnée qui permet de variabiliser une succession de valeur (en général du même type)
D'autres syntaxes existent pour l'utilisation / création de tableaux, voici quelques exemples :
De nombreuses opérations sont possibles avec les tableaux en PHP, nous allons en voir les principales
Une boucle est une instruction qui nous permet de parcourir tous les éléments d'une variable (tableau par exemple)
Un foreach fonctionne comme une boucle for vu précédemment, excepté qu'il ne nécessite pas d'ajout de compteur à l'itération.
$key est optionnelle !
Ceci permet de contrôler les itérations que l'on veut parcourir, passer ou celles qui stoppent complètement le parcours.
Prenez un peu de temps pour vous exercer avec les tableaux, tentez de réaliser ce que l'on a vu. Un tableau de couleurs par exemple.
Reprenez les slides précédentes pour :
Envoyer le fichier guess_my_number_subject.md
Il existe de nombreuses fonctions PHP qui peuvent être utilisées nativement.
Quelques fonctions notables :
Plusieurs méthodes permettent de manipuler des dates avec PHP, nous allons en voir quelques-unes.
On reviendra sur cette slide plus tard ! La suite nécessite que vous ayez vu un peu de HTML / CSS
Afin de faire connaître le contenu d'un fichier et pouvoir en utiliser les fonctions, classes et autres objets, on doit inclure les fichiers.
Plusieurs fonctions permettent de gérer des fichiers en php, voici un exemple basique d'écriture / lecture de fichier.
Créer ses propres fonctions vous permet de pouvoir réutiliser un même code à plusieurs endroit de votre script sans le copier coller. Pensez à l'inclusion de fichier pour utiliser des fonctions d'un autre fichier plutôt que les copier / coller dans votre autre fichier.
De nombreux exemples et informations sont présentes dans la documentation de PHP présente ici : https://www.php.net/manual/
Sur cette documentation, vous trouverez également toutes les fonctions natives de PHP avec des exemples de code commentés.
Vous pouvez également rechercher sur stackoverflow ou autres forums pour trouver d'autres personnes ayant fait face aux mêmes soucis que vous.
LA DOC ?
C'est réellement ce qui peut vous sauver des heures de recherches inutiles, prenez le reflexe !
Exercice (Réaliser une calculatrice en PHP)
Le but de l'exercice est de vous laisser du temps pour que vous réalisiez une calculatrice dans une page php / html, cette fois-ci, il vous faut un peu de HTML pour l'afficher sur une page. Si besoin je peux vous envoyer un template et vous expliquer comment ça fonctionne.
Pensez à vérifier les input utilisateurs avec is_numeric.
Les opérations voulues (sous formes fonctions) sont :
Le résultat doit apparaître sur la page.
N'hésitez pas si vous avez besoin d'aide.
Les chaînes de caractères ont souvent besoin d'être manipulées, voici quelques exemples
Les dates ont souvent besoin d'être manipulées, voici quelques exemples
Exercice en 5 étapes :
Envoi des données par script d'une page à l'autre, ces données sont ensuite vérifiables et exploitables
Envoi des données par url d'une page à l'autre, ces données peuvent également ensuite être vérifiées et exploitées
Envoi et traitement de données
Un fichier contenant le formulaire (html) et le type d'action du formulaire et un fichier script (php) de traitement des données !
HTML
PHP
Nous allons voir un exemple assez complet de formulaire en HTML, ceci vous permettra d'avoir une base pour les exercices qui suivent.
HTML
Un exemple très simplifié d'un formulaire en POST :
Un exemple très simplifié d'un formulaire en GET:
Il est important de valider les informations qui transitent par vos formulaires car elles proviennent directement de l'utilisateur.
Voici un exemple de contrôle de données. (Avant que vous mettiez en pratique sur un cas concret)
Comme vu dans la partie formulaire et HTML, il est possible d'envoyer des fichiers par un formulaire. Mais il est nécessaire de les contrôler, nous allons voir quelques étapes
Ecrire un script php, contenant le html proposé permettant d'avoir deux input : email et password.
Ouvrez vos balises php en dessous, écrivez les étapes de :
Atelier (fil rouge) - Création d'un formulaire permettant l'envoi et la mise en forme d'articles :
Vous devez réaliser un formulaire pour créer des articles, chaque article doit contenir :
Dans un premier temps, la création d'un article doit être contrôlée sur chaque valeur (existence, taille, cohérence de valeur,...) ensuite, la photo doit être contrôlée (jpg/png) et stockée dans un dossier. Pensez à afficher les éventuelles raisons d'erreurs.
Optionnel : Pour finir, réalisez l'affichage de cet article s'il a correctement été passé.
Structure permettant d'agencer et de sauvegarder des données relatives à un ou plusieurs projets
Cette structure peut être relationnelle ou non (SGBD =/= SGBDR)
Les données doivent être protégées mais accessibles en continue
Nous allons utiliser PhpMyAdmin (inclus avec Wamp)
BDD
Langage de communication avec une base de données,
Découle en général du modèle MERISE,
Opérations CRUD (Create, Read, Update, Delete)
Le T-SQL (ou PL-SQL) permettant le SQL Avancé et les opérations plus complexes.
SQL
Démonstration de PhpMyAdmin avec Wamp et utilisation de MySQL
PhpMyAdmin
&
MySQL
Identifiant (par défaut) : root
mot de passe (par défaut) : (vide)
On va commencer par créer une base de données. Rien de plus simple pour l'instant.
CREATE DATABASE php_formation;
Ensuite, on va se placer sur cette base depuis phpymyadmin et on va créer une table. L'exemple ressemble beaucoup au besoin pour l'exercice de fin de chapitre.
CREATE TABLE articles (
id int PRIMARY KEY NOT NULL AUTO_INCREMENT,
titre varchar(50) NOT NULL,
contenu varchar(300) NOT NULL,
date_parution date,
couverture blob,
est_public bit NOT NULL
)
PRIMARY KEY : identifiant unique auto-incrémenté par le SGBD
Nous allons voir ensemble plusieurs opérations possibles sur cette table.
C
R
U
D
reate : Création de nouveaux éléments dans la BDD
ead : Lecture d'éléments dans la BDD
pdate : Modification dans la BDD
elete : Suppression dans la BDD
La clé primaire étant le champ qui permet de rendre unique chaque champ d'une table, la clé étrangère est la référence à cette clé dans une autre table. Prenons l'exemple de la table article, on souhaite lier un article à un auteur (nom, prénom, date de naissance).
CREATE TABLE auteurs (
id int PRIMARY KEY AUTO_INCREMENT,
nom varchar(50) NOT NULL,
prenom varchar(50) NOT NULL,
date_naissance date
)
ALTER TABLE articles
ADD auteur_id INT;
ALTER TABLE articles ADD CONSTRAINT FOREIGN KEY (auteur_id)
REFERENCES auteurs(id);
Table auteur
Clé étrangère ajoutée à articles
Auteur |
---|
id |
... |
Articles |
---|
id |
auteur_id |
... |
Une jointure permet de lier les données d'une table à une autre grâce à la relation de clé primaire / clé étrangère.
Nous allons voir qu'une seule jointure, mais si ça vous intéresse on peut prendre de voir les deux autres les plus courantes.
Jointure interne (présence de clé étrangère obligatoire pour avoir un retour (NOT NULL))
SELECT *
FROM articles ar
INNER JOIN auteurs au ON ar.auteur_id = au.id
Comme pour PHP, vous pouvez vous référer à la documentation SQL afin de trouver des exemples ou la syntaxe pour réaliser les opérations voulues. Nous en avons vu quelques exemples, mais les cas de requêtage en SQL sont presque illimités.
Voici le lien de la documentation : https://sql.sh/
LA DOC ?
C'est réellement ce qui peut vous sauver des heures de recherches inutiles, prenez le reflexe également pour le SQL !
Une méthode de connexion à la base de données pour pouvoir communiquer avec elle depuis PHP
Paramétrage de la connexion (localhost)
Requêtage directement en SQL
Récupération des résultats
Plusieurs opérations possibles (CRUD)
Requêtes préparées (plus sécurisées)
On pourrait aussi utiliser PDO !
mysqli_connect(hote, user, password, dbName, port, socket);
La connexion se ferme automatiquement à la fin d'exécution du script, mais vous pouvez utiliser mysqli_close($connexion); pour la fermer explicitement.
<?php
function connectDB() {
$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'users';
$port = 3306; // A remplacer par le port utilisé par MySQL 3306 est le port par défaut
$connexion = mysqli_connect($hostname, $username, $password, $database, $port);
if ($connexion->connect_error) {
die('Connexion échouée : ' . $connexion->connect_error . '<br/>');
} else {
echo 'Connexion réussie' . '<br/>';
}
return $connexion;
}
?>
Un exemple complet de connexion avec mysqli_connect
<?php
require_once("connexion.php");
function getUser($login, $password) {
$conn = connectDB();
if ($conn) {
// La connexion s'est bien passé, vous pouvez faire votre requête en BDD
// La requête se fait via $conn
} else {
// La connexion s'est mal passée
}
}
?>
Appel de cet fonction depuis une autre page (celle de la requête)
Méthodes associées :
Nous allons voir un exemple ensemble
Méthodes associées :
Nous allons voir un exemple ensemble
$result = mysqli_query($connexion, "SQL QUERY");
$rows = mysqli_fetch_all($result);
$req = mysqli_prepare($connexion, $sql);
mysqli_stmt_bind_param($req, 'ds', $id, $plate);
mysqli_stmt_bind_result($req, $reference, $model);
$result = mysqli_stmt_execute($req);
Méthodes associées :
Nous allons voir un exemple ensemble
Méthodes associées :
Nous allons voir un exemple ensemble
$result = mysqli_query($connexion, "SQL QUERY");
$insertedId = mysqli_insert_id($connexion);
$request = mysqli_prepare($connexion, "SQL QUERY");
mysqli_stmt_bind_param($request, "dd", $hotel, $model);
$result = mysqli_stmt_execute($request);
mysqli_stmt_insert_id($request);
Pour ce workshop votre objectif est de réaliser une authentification utilisateur et vous assurer qu'il soit bien connecté en mettant en session les infos si l'utilisateur est bien connecté.
Compléter ce workshop avec :
Atelier : Reprendre le travail effectué pour la fin de la partie précédente (articles de blog). L'objectif est de permettre le stockage, l'ajout, la modification ou la suppression d'articles en base de données.
Il nous faut donc une fonction de récupération des articles, une fonction pour créer un article, une fonction pour modifier un article, une fonction pour supprimer un article.
1. Il va aussi être nécessaire de gérer des auteurs, nous n'allons qu'en gérer l'ajout. (Faire un nouveau formulaire auteur.php action vers auteur.php et require('ajout_auteur.php') pour appeler la fonction d'insertion (valider les données + insertion en base))
Côté BDD : Les deux tables créées précédemment suffisent pour l'instant (articles & auteurs). Il nous faut la connexion à la BDD.
Pour l'instant, le plus simple serait de créer une page .php par fonction avec chacun son formulaire (et des liens rapide pour aller vers les autres pages .php avec un lien <a href="lien/script_update.php"> Modifier </a>)
Session & cookies
Afin de stocker des informations, il est au préalable nécessaire d'authentifier l'utilisateur. Plusieurs méthodes sont possibles, nous ne verrons que celle par un formulaire et renseigné dans la session (et non l'authentification par header http)
Utilisation de setcookie pour créer un cookie côté client et pouvoir le récupérer pour valider l'authentification sur une autre page
Quelques méthodes pour vous aider à gérer les sessions :
Un exemple plus concret en relation avec ce que l'on a fait juste avant avec les cookies. Déjà démarrons notre session :
Ensuite, nous pouvons utiliser la session pour gérer notre authentification :
Mettez en application ce que l'on vient de voir avec les sessions :
HTTP Request
Demande du client à effectuer une action via le protocole HTTP
HTTP Response
Réponse formatée par le serveur pour retourner l'information voulue au client via HTTP
Representational State Transfer
De manière générale, le Web est composé de REST (états et fonctionnalités basées sur des appels d'URL).
Nous allons mettre en place une API REST from scratch (de zéro) en PHP.
GET
HEAD
PUT
DELETE
POST
OPTIONS
Récupération d'un contenu
Comme GET mais pour le header (méta)
Mise à jour de contenu
Ajout de contenu
Suppression de contenu
Retourne les ressources disponibles
Pourquoi mettre en place une API ?
Nous utilisons des API REST afin de réaliser des endpoints. Ces endpoints ont chacun leur objectif, comme vu dans la slide précédente. Souvent, ils permettent de réaliser des opérations CRUD sur des données en base de données par exemple (nous le ferons en JSON)
A noter qu'il est nécessaire de bien contrôler les demandes qui sont réalisées sur cet API. Très souvent, nous utilisons un framework pour les réaliser, mais dans notre exemple, nous allons la réaliser de zéro pour bien comprendre comment ça fonctionne en PHP.
Dans une slide suivante, nous rajouterons une notion importante de gestion des droits que l'on appliquera pas car il est encore trop tôt pour réaliser une API complète avec gestion des droits et d'authentification.
Les étapes de mise en place
Utilisation de la commande curl
curl est une commande simple permettant d'appeler des URL en REST, cette commande vous permettra de communiquer avec l'API REST proposée par couchdb et donc travailler sur votre base de données.
curl http://localhost:5984/
Conseillé sous Unix
Documentation
Utilisation de Postman
Postman est un outil de requêtage REST très pratique.
Conseillé sous Windows
Il permet de faire tout type de requêtes, il est possible de passer des paramètres pour nos requêtes POST ou même gérer l'authentification (non nécessaire pour nos exemples)
Explications du code nécessaire
Je fais exprès de faire des captures et expliquer étapes par étape pour éviter de faire un simple copier / coller, mais je vous donnerai accès au code complet après l'exercice.
La variable $_SERVER
Voici comment mettre en place un endpoint en GET, accessible via
Pour connaître le contenu utile de la variable $_SERVER, vous pouvez utiliser print_r($_SERVER).
Un simple endpoint en GET
Explications du code nécessaire
Un endpoint en POST
Le else pour les endpoints non existants
Ici le endpoint est un endpoint en POST, il nécessite des inputs qui devront être contrôlées
Ici, on dit que si le endpoint n'est pas connu des if / else if, la requête n'est pas connue et on renvoie une not found (code 404)
Explications du code nécessaire
Les retours d'un endpoint
Ceci est un retour avec header de type json afin de renvoyer des données trouvées.
header permet de formater le type de retour pour un format json par exemple (ou html ou xml ...)
Ceci est un retour remontant une bad request, c'est souvent utilisé lorsque des paramètres sont manquants ou ne correspondent pas à une clé existante
Explications du code nécessaire
La gestion des entrées utilisateurs ($_GET)
Ici, nous vérifions que le paramètre $_GET est présent dans la requête effectuée. C'est un contrôle d'entrée utilisateur nécessaire pour un endpoint (s'il entrée utilisateur il y a).
Un paramètre $_GET est passé via l'url :
Explications du code nécessaire
La gestion des entrées utilisateurs ($_POST)
Ici, on récupère dans un tableau $data les éléments qui sont passés dans le body de la requête.
Un paramètre POST est passé via la request (en json souvent)
Explications du code nécessaire
Un exemple de endpoint complet
Explications du code nécessaire
Petite démonstration du code & l'utilisation pour les endpoints
Exercice d'application
Cet exercice a pour objectif de mettre en place une API REST qui va proposer des endpoints pour gérer des profils utilisateurs (nom, prénom, âge) stockés dans un fichier json.
Envoyer workshop API
Pour réaliser des opérations sécurisées sur vos APIs, il vous faut pouvoir authentifier et maintenir les sessions de vos utilisateurs. Le maintient de la session est à considérer comme temporaire.
On recharge la session régulièrement et surtout on recharge la session avant une opération critique !
(même si l'idéal est d'éviter qu'un utilisateur lambda puisse réaliser une opération critique sur votre API)
RGPD
Vérifier les entrées utilisateurs !
N'importe qui peut modifier le payload, c'est à vous de vous assurer de la cohérence des données qui vont pouvoir atteindre votre base.
Vérifier la présence d'une authentification
En étant en invité, l'utilisateur ne devrait uniquement que pouvoir créer un compte et lire les données accessibles aux visiteurs.
Encoder les données avant retour
Des données encodées sont des données qui, si elles peuvent être intercéptées, ne pourront pas être lues sans l'opération de décryptage.
Vos APIs doivent gérer les droits et utilisateurs également. Ceci vous permettra de bien vérifier qui accède à quoi et surtout contrôler les accès de chaque utilisateur (ou pour chaque rôle).
Le nombre d'appels maximum à votre API est également à contrôler.
L'utilisation de Framework est conseillée mais pas obligatoire. Ce dernier peut directement intégrer la gestion des droits. Prenons un exemple avec Directus.
Utilisateur
Rôle(s)
Droits
Authentification
Authorisations
Utilisation d'une entrée utilisateur non protégée pour modifier le comportement de la requête SQL derrière l'action à effectuer.
Parades :
Rendez-vous sur
https://free.codebashing.com/courses/php
Suivez les 3 leçons gratuites en PHP. Il y'a normalement 24 minutes de tuto, je vous laisse 30 minutes au cas où vous voulez regarder plusieurs langages.
Atelier : Mise en place d'une création de compte utilisateur (admin pour l'instant), une connexion avec vérification de mot de passe (pour l'instant non crypté) et forcer la connexion pour pouvoir accéder aux formulaires de gestion des articles.
Vous allez créer une nouvelle table "utilisateur" avec un email et un mot de passe uniquement pour l'instant. On va ajouter un formulaire de création d'utilisateur et un formulaire de connexion avec vérification en base de données.
Ensuite, vous pouvez simplement créer un élément en session pour valider que l'utilisateur est connecté et donc forcer la connexion sur la page contenant les actions.
Profitez-en pour faire des requêtes préparées, comme vu précédemment. (Eviter les injections SQL)
PHP permet d'utiliser des expressions régulières pour formater des chaînes de caractères, voici quelques exemples (les explications sont dans la slide suivante)
Exemples de directives :
Configuration (php.ini) et fichier de log contenant les erreurs php. Ceci est directement accessible depuis wamp.
Premièrement, vous devez activer l'affichage d'erreurs dans le fichier php.ini, une variable display_errors doit être mise à On, pour ma part celle ci se trouve ligne 474.
Ensuite, vous pouvez consulter le fichier php_error.logs contenant les logs et des informations lorsqu'une erreur intervient dans un script.
Il est possible de gérer les erreurs directement dans vos scripts PHP. Ceci grâce aux instructions try {} catch {} finally {}.
Voici un exemple très simpliste.
Vous pouvez également vous même anticiper les erreurs et les renvoyer à votre guise grâce à l'instruction throw.
L'idéal est de stocker les erreurs dans un fichier de log ou même directement en base de données, vous pouvez réaliser une fonction de log afin de l'utiliser dans vos catch et logger chaque exception avant de la renvoyer à l'interface (client)
Voici la liste des types d'exception en PHP ainsi que leur arborescence :
Atelier : Ajouter une gestion des erreurs cohérente pour votre blog.
Ceci incluant :
Atelier : Ajouter une gestion des erreurs cohérente pour votre formulaire d'articles
PHP permet de gérer les mails via la fonction native mail(). Nous allons voir un exemple simple et un exemple MIME. Ceci n'empêche pas de devoir configurer un serveur mail en local.
Dans un premier temps : Configuration d'un serveur mail en local. Nous allons utiliser sendmail (https://www.glob.com.au/sendmail/)
On va récupérer le zip et le dezipper sous C:/wamp64/.
Il nous faut modifier le fichier sendmail.ini pour configurer notre serveur smtp (mailtrap.io par exemple)
Ensuite, ouvrons le php.ini et modifions la ligne 1080:
sendmail_path = "C:\wamp64\sendmail\sendmail.exe"
Puis nous allons redémarrer wamp.
Utilisation de la fonction mail() associée à un formulaire simple:
Utilisation de la fonction mail() associée à un contenu de mail riche :
Le XML est une structure de stockage de données qui peut être gérée en PHP, pour la création, la lecture ou la modification d'un fichier XML depuis PHP. Nous allons voir uniquement la lecture.
De même pour lire le JSON :
De même pour écrire du JSON :
{
"premierNoeudTableauObject": [
{
"premierObjet" : {
"nom": "BRASSEUR",
"prenom": "Cédric",
},
},
{
"secondObjet" : {
"nom": "JEAN",
"prenom": "Sébastien",
},
},
],
"secondNoeudSimpleValeur" : 10,
},
Le JSON permet de stocker des données comme on le souhaite, sous forme de tableaux, d'objets ou de simple association
clé => valeur
Démo live par le formateur
Lecture d'un fichier csv pour récupérer les données dans un tableau en PHP:
Envoyer le sujet du workshop.
Ce workshop a pour objectif d'appréhender correctement l'import de données depuis des fichiers csv (en .txt) vers une base de données MySQL.
L'exercice va prendre un certain temps, n'hésitez pas à me demander de l'aide si vous êtes bloqués, j'ai essayé d'être le plus précis possible dans les commentaires sur le sujet.
Bon courage !
Envoyer le sujet du workshop.
Ce workshop a pour objectif d'appréhender correctement l'utilisation du format JSON en tant que données exploitables (CRUD).
L'exercice va prendre un certain temps, n'hésitez pas à me demander de l'aide si vous êtes bloqués, j'ai essayé d'être le plus précis possible dans les commentaires sur le sujet.
Bon courage !
Création d'une tâche cron pour lancer notre script php.
Ou directement avec le planificateur de tâche de Windows.
Doc Unix
Il est possible de réaliser un moteur de recherche dans une base de données grâce à PHP, mais surtout grâce à votre requête SQL.
Voici un exemple classique sur la table articles :
Précisions:
Aparté sur ElasticSearch: C'est un outil (qui peut être intégré à PHP) permettant de réaliser plus facilement ce type d'opérations de recherche directement dans le contenu de fichiers. Ceci pourrait éviter l'import de données et grandement accélérer vos recherches.
Réaliser un moteur de recherche sur toutes les tables de la base de données.
Un formulaire contenant les différents input de recherche ainsi que les options de recherche (Commence par, Termine par, Contient).
L'objectif est de rechercher dans toutes les tables, à votre convenance, soit 3 UNION, soit les jointures (conseillé) grâce à notre requête SQL.
Début d'après-midi :
La finalité sera d'afficher les informations importantes des éléments trouvés.
Nous allons directement voir un exemple de code accessible sur github
(dans CorrectedExercice /Workshop/Partie4)
Création de classes : Structure contenant des propriétés et des méthodes qui lui sont propres. C'est un modèle qui est défini pour un futur objet.
Instanciation d'objets : Permet de créer des objets respectant le modèle de la classe.
POO
Une classe est une structure contenant des propriétés et des méthodes qui lui sont propres. C'est un modèle.
Une propriété est une variable rendu disponible dans la classe.
Un (ou plusieurs) constructeur permet de réaliser des opérations et spécifier la création d'un objet. On l'utilise très fréquemment pour valoriser les propriétés d'une classe.
Un destructeur permet de réaliser une action particulière lors de la destruction de l'objet (soit manuelle, soit automatiquement à la fin d'un script).
Les méthodes sont l'équivalent d'une fonction que l'on a déjà vu, mais elle sera propre a l'objet, en général elle permet de réaliser des opérations avec les propriétés de l'objet.
Permet de créer un ou plusieurs objets respectant le modèle.
Définir une classe "User" ayant pour propriétés :
Ajoutez un constructeur permettant de valoriser $name, $firstname et $language. De plus initialiser le timestamp avec un time();
Ajoutez ensuite deux fonctions :
Faites un destructeur qui affiche que l'objet est détruit.
Instanciez un objet et utilisez les méthodes créées précédemment.
L'héritage permet de partager des propriétés et méthodes entre les classes, il suffit d'utiliser le mot clé extends pour que cette classe (fille) hérite de la classe de base (mère).
Le partage de code s'effectue de manière descendante uniquement.
Une interface est un contrat a respecter, il défini la signature des méthodes (définition de méthode sans leur implémentation) qui doivent être implémentées dans les classes respectant ce contrat d'interface.
Une classe abstraite (mère) permet de définir les signatures des méthodes et les propriétés qui seront partagés à la classe qui va étendre cette classe abstraite (fille)
Le mot clé static permet de ne pas avoir à instancier une classe pour en utiliser une propriété statique ou une méthode statique.
PARTIE 1 :
Ecrire une classe pour modéliser un Author (Auteur).
Propriétés :
Constructeur : Réalisez un constructeur permettant de valoriser les propriétés de l'objet.
Méthodes:
PARTIE 2 :
Créer un nouveau script php, nommé "accueil.php" et insérez y le code HTML permettant d'afficher une page HTML intitulé "Accueil".
Au début du script, écrivez l'instruction afin d'inclure le fichier contenant la classe créée précédemment.
Dans la page HTML, insérez du PHP qui permettra d'instancier un objet Auteur, afficher sur la page les informations depuis la méthode format de cet objet.
Ajoutez ensuite les instructions de gestion des erreurs afin de pouvoir afficher une erreur en gras sur la page.
Atelier fil rouge : Adapter le blog créé précédemment pour transformer le procédural en orienté objet.
Créez des classes pour tout ce qui a déjà été effectué sur l'atelier fil rouge depuis le début. Si vous ne savez pas par où commencer, créez une classe de connexion, celle ci étant utilisée partout vous saurez où des modifications sont nécessaires.
U
M
L
nifed
odeling
anguage
Suite de diagrammes ayant chacun un but précis dans le but de modéliser l'intégralité d'un projet voire même d'un système d'information complet !
Since 1997
Le diagramme de packages permet de décomposer le système en catégories ou parties plus facilement observables, « packages ».
C’est un diagramme de contexte avec une granularité plus forte concernant les composants du système d’information.
Ça nous permet de savoir quels sont les différents ensembles qui composent le SI.
Le diagramme de cas d’utilisation représente les fonctionnalités (ou cas d’utilisation) pouvant être réalisées par les acteurs. Elles doivent TOUTES être présente dans le diagramme de cas d’utilisations.
On peut faire un diagramme de cas d’utilisation pour le SI entier ou un pour chaque package.
Exercice (Réaliser un diagramme de cas d’utilisations)
Diagramme qui permet d’avoir une vision d’ensemble des actions qui peuvent être effectués sur le SI. Il développe les scénarios, que ce soit le scénario classique, les exceptions ou les scénarios alternatifs.
Chaque action fait office d’un diagramme a part entière
C’est un diagramme qui a un début d’action, qui en défini les étapes et qui possède une fin.
Début
Fin
Exercice (Réaliser un diagramme d’activité)
Il permet de représenter des échanges entre les différents objets et acteurs du système en fonction du temps. Celui-ci représente les méthodes (en termes de développement).
Il ajoute la notion d’acteurs et des informations « temporelles » au diagramme d’activités.
Exercice (Réaliser un diagramme de séquences)
Durant la phase d’analyse, le diagramme de classes représente les informations manipulées par les utilisateurs
Durant la phase de conception, le diagramme de classes représente les objets, propriétés et méthodes de notre projet.
En soit, c’est le seul diagramme OBLIGATOIRE pour une modélisation UML.
Réalisez le diagramme de classes des informations ci-dessous
Exercice (Réaliser un diagramme de classes)
Patterns créateurs (Singleton, factory, abstract factory)
Patterns aidant à la gestion de la création d’objet
Patterns structurants (Façade, proxy, decorator, composite, adapter)
On parle de travailler sur la partie externe des classes du pattern. L’extensibilité et l’encapsulation des classes.
Patterns comportementaux (Strategy, iterator, observer, state)
Ici, on travaille sur la partie interne des classes du pattern. La dynamique des classes du pattern. Améliorer la qualité du code, éviter les duplications ou gérer des problématiques connues.
L'idée principale est de pouvoir mettre en place une certaine stratégie ou ce que l’on va régulièrement appeler un comportement afin de pouvoir en changer dynamiquement au runtime.
Sans pattern stratégie, on serait obligé de multiplier les classes en produit cartésien pour pouvoir avoir autant de combinaisons de comportements que nécessaire. (Horrible)
L’héritage est puissant mais il ne permet de partager du code que de manière verticale, c’est-à-dire à ses enfants.
Par contre, si les enfants veulent partager du code entre eux, aucun moyen de le faire à part en dupliquant le code (Horrible).
Meilleure lisibilité du code. (Pas de duplication, pas de gros pavés de méthodes dans une seule classe)
S’assurer que chaque élément à sa propre responsabilité (découplage fort)
Et surtout avoir des algorithmes interchangeables au runtime sans avoir à multiplier les classes.
Définir une dépendance entre un objet observé et un ou plusieurs objets observants.
L’objectif étant de pouvoir notifier les objets observants lorsqu’un changement de statut est opéré sur l’objet observé.
On a parfois besoin de connaître le changement de statut d’un autre objet. Il est possible d’interroger l’objet en continue pour connaître son statut et le mettre à jour si nécessaire.
Ceci est très gourmand s’il y’a plusieurs abonnés et surtout si on interroge toutes les secondes, alors que le statut change de manière aléatoire ?
Ceci n’est pas efficace.
* Optionnelle : Si on ne met pas de lien entre concreteSubject et ConcreteObserver, ça nous force à passer un objet ConcreteSubject dans la méthode update()
* Optionnelle
Eviter les opérations de PULL massives et simplement effectuer un push / pull lorsque c’est nécessaire.
Plus concrètement, améliorer la logique métier
Diminuer le coûts de l’observation
Supprimer la question de l’intervalle d’interrogation
Comme son nom l’indique, il a pour objectif de rendre une interface non adaptée à une autre, compatible. En rajoutant un objet intermédiaire nommé « Adapter ».
Les interfaces exposées ne sont pas toujours compatibles avec ce que nous avons, il nous faut donc réaliser une adaptation intermédiaire pour pouvoir coupler les deux.
Adapter une interface pour qu’elle s’imbrique dans une autre, tout simplement.
Découplage fort
Peut-être facilement mis en place même après coup, à moindre coût (sauf pour le code client, qui va forcément devoir être adapté ou il ne sera pas homogène)
Permet d’ajouter dynamiquement des propriétés à un objet.
En pouvant empiler/décorer avec autant d’objets décorable que l’on souhaite.
L’objet décoré et le ou les objets décorants s’utilisent de la même façon, excepté que la plupart du temps, les objets décorants ne peuvent pas exister sans objet à décorer.
Duplication de code et multiplication des classes pour gérer toutes les possibilités (inutiles).
Simple à mettre en place
Evite la multiplication des classes
Permet d’ajouter des caractéristiques multiples sans limite (excepté celles définies par l’interface) à un objet de base.
Le fait d’envelopper permet de facilement exécuter des opérations qui sont à effectuer sur chaque enveloppe pour en avoir un résultat global (prix d’une boisson par exemple)
Attention, ça ne permet pas de connaître l'ordre de décoration !!!
Adaptez le diagramme vu ensemble en utilisant la problématique suivante :
On a une boisson de plusieurs type : café, chocolat au lait, thé, …
Chaque boisson peut avoir plusieurs décorations : sucre, caramel, chocolat,…
Réalisez le diagramme UML correspondant à ce sujet
Réalisez le code (ou à minima pseudo code) permettant de mettre ceci en œuvre
Décorez un café avec deux fois du caramel et une fois du sucre, par exemple.
30 minutes, si besoin de plus de temps vous pouvez me demander
Le pattern singleton est le plus simple des patterns, il permet de s’assurer qu’un objet est instancier qu’une et une seule fois dans toute votre application.
Ce sera toujours la MÊME instance de l’objet quelque soit depuis quel endroit l’objet est appelé.
On instancie un objet quelque part, on y fait des opérations dessus, puis on souhaite à nouveau réutiliser cet objet à un autre endroit.
Pour que les opérations soient gardées en mémoire, on ne peut pas le faire, car on devra réinstancier la classe puis réeffectuer les opérations dessus. (Ou alors rajouter des dépendances inutiles)
S’assurer qu’un objet est instancier qu’une seule fois et y avoir accès facilement depuis n’importe où dans votre application.
Certains estiment que le pattern singleton est un mauvais pattern (à ne pas confondre avec anti-pattern). Pour deux raisons, à ma connaissance :
1. Le pattern singleton est utilisable uniquement en statique, les débats sont nombreux avec tout ce qui tourne autour du mot clé « static ». Je vous laisserai vous renseigner et vous faire votre propre opinion, mais sachez que pour ma part, je l’utilise très fréquemment.
2. D’après certains développeurs, le fait de dire qu’on est certain que l’on veut une seule instance de son objet à tout jamais dans son application n’est pas en lien avec le fait de faire de son application une application évolutive à toute épreuve.
Pour eux, afin que ça reste évolutif, on ne peut pas se limiter à une seule instanciation.
Je comprends le point de vue, mais je n’y adhère pas. J’utilise fréquemment le singleton pour instancier ma base de données par exemple. Dans 99,99% des cas, je sais à l’avance que je n’aurai qu’une instance de base de données et ceci n’évoluera pas au fil du temps.
Atelier fil rouge : Adapter le blog créé précédemment pour y intégrer des patrons de conceptions intéressants.
A vous de modéliser la chose et rajouter au blog les éléments de code nécessaire à la mise en place des patterns.
N'hésitez pas à rajouter des choses pour que ça puisse correspondre à des patterns que vous souhaitez pratiquer.
Workshop réaliser un jeu du Serpent (version plateau)
Globalement, le but de ce workshop est de réaliser un jeu du serpent en version plateau, deux joueurs doivent lancer un dé au tour par tour et le premier arrivé à la case 50 gagne la partie.
Vous devez enregistrer au format json le résultat des parties.
Envoyer le workshop d'évaluation.
C'est cet exercice qui sera utilisé afin d'évaluer vos compétences