Introduction au langage de programmation PHP.
Présentation réalisée la première fois le lundi 10 mars 2014 à l'IIM : Institut de l'Internet et du Multimédia pour les années préparatoires.
Cette présentation a pour but d'approfondir les compétences PHP des élèves : utiliser des bases de données, comprendre PDO et le modèle MVC (basique).
Après présentation orale de ces slides, des exercices de mise en pratique ont été réalisés en Atelier avec les élèves.
L'exercice principal était de construire une plateforme similaire à twitter selon un modèle MVC.
Voici le plan de la présentation :
• Les bases de données : MySQL
- Principe
- phpMyAdmin
- Interagir avec une BDD
• Les fonctions
- La machine à carottes
- Exemple avec MySQL
- Les fonctions PHP
• Modèle Vue Contrôleur - MVC
- Principe
- Mise en pratique
• Quelques trucs à savoir a.$_FILES et $_POST
- $_SESSION
- L’indentation
- PHP + HTML = ?
2. Plan de la présentation
1. Les bases de données : MySQL
a. Principe
b. phpMyAdmin
c. Interagir avec une BDD
2. Les fonctions
a. La machine à carottes
b. Exemple avec MySQL
c. Les fonctions PHP
3. Modèle Vue Contrôleur - MVC
a. Principe
b. Mise en pratique
4. Quelques trucs à savoir
a. $_FILES et $_POST
b. $_SESSION
c. L’indentation
d. PHP + HTML = ?
Pierre Faure - pierrefaure.me
3. 1.Les bases de données : MySQL
a.Principe
Photo par closet factory. license CC BY-ND : https://creativecommons.org/licenses/by-nd/2.0/deed.fr
‘‘Une base de donnée est comparable à un placard extensible et modulable
4. 1.Les bases de données : MySQL
a.Principe
La base de donnée contient des tables
Les tables sont organisées sous forme de tableau
id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
Pierre Faure - pierrefaure.me
5. Lier deux tables avec un identifiant
id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
id name user_id
10
476
MySQL 1
PHP 36754
tools
user_id peut également
s’intituler clé étrangère ou
foreign key (FK)
Pierre Faure - pierrefaure.me
6. id et user_id, quelle différence ?
id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
id name user_id
10
476
MySQL 1
PHP 36754
tools
id est un identifiant unique
user_id permet de lier des données
477 PHP 2 36754
Dans user_id, "user" fair référence au nom de la table liée
Pierre Faure - pierrefaure.me
7. 1.Les bases de données : MySQL
b.phpMyAdmin
Pierre Faure - pierrefaure.me
8. b.phpMyAdmin : onglet Bases de données
Les bases de données
utf8_general_ci
Créer une base de données
Pierre Faure - pierrefaure.me
9. b.phpMyAdmin : à l’intérieur de base_de_donnee3
Les tables de la BDD
Créer une table
Pierre Faure - pierrefaure.me
11. b.phpMyAdmin : l’onglet structure
Nom : Nom assigné à la colonne de la table
Type : Type des données à l’intérieur de la colonne
Interclassement : Encodage
Attributs > UNSIGNED : Les valeurs seront supérieures à 0
Null : Non = La valeur ne peut pas être inexistante (vide est différent de null)
Défaut : Valeur par défaut de la cellule
Extra > AUTO_INCREMENT : +1 automatiquement lorsqu’une donnée est ajoutée
Action : Opérations réalisables
Pierre Faure - pierrefaure.me
12. b.phpMyAdmin : syntaxe des noms
Ne jamais utiliser de tiret - dans les noms de vos BDD,
de vos tables ou de vos colonnes
Utilisez underscore _ à la place
Pierre Faure - pierrefaure.me
13. b.phpMyAdmin : créer une table
Créons une table posts
Contenant les colonnes id, title, content, date
Pierre Faure - pierrefaure.me
15. b.phpMyAdmin : type & taille d’une colonne
Les types les plus fréquents
INT : valeurs numériques entre 0 et 4,294,967,295
VARCHAR(*) : valeurs entre 0 et 65,535 caractères (255 anciennes versions de MySQL)
TEXT : valeurs entre 0 et 65,535 caractères
MEDIUMTEXT : valeurs entre 0 et 16,777,215 caractères
TIMESTAMP : Date au format : AAAA-MM-JJ HH:MM:SS
DATETIME : Date au format : AAAA-MM-JJ HH:MM:SS
DATE : Date au format : AAAA-MM-JJ
TIMESTAMP, ajouts et mises à jour - date d’ajout/modification d’un article/commentaire/message …
DATETIME, date spécifique - Événements : anniversaire… | Ne fonctionne pas avec les fuseaux horaires des serveurs
(*) Vous devez obligatoirement spécifier une valeur
Pierre Faure - pierrefaure.me
16. b.phpMyAdmin : La valeur par défaut
Défaut : Valeur par défaut lors de l’insertion
CURRENT_TIMESTAMP : Date & heure du serveur
Pierre Faure - pierrefaure.me
17. b.phpMyAdmin : L’interclassement
utf8_general_ci : Suffisant pour les langues telles que le français et l’anglais
utf8_unicode_ci : Pour les langues comme l’allemand, le russe …
Pierre Faure - pierrefaure.me
18. b.phpMyAdmin : Attribut > UNSIGNED
Attributs > UNSIGNED : Les valeurs stockées seront supérieures à 0
Pierre Faure - pierrefaure.me
19. b.phpMyAdmin : NULL
Null : Non = La valeur ne peut pas être inexistante
‘‘Une valeur vide n’est pas similaire/égale à une valeur NULL
Pierre Faure - pierrefaure.me
20. b.phpMyAdmin : Index > PRIMARY
Index PRIMARY : clé primaire & unique de la table « id »
Pierre Faure - pierrefaure.me
21. b.phpMyAdmin : Auto Incrémentation
A_I (Auto_Increment) : +1 automatiquement lorsqu’une donnée est ajoutée
Pierre Faure - pierrefaure.me
23. b.phpMyAdmin : Le moteur de stockage
INNODB :
- Plus flexible avec les identifiants (clés étrangères)
- Utilisé pour les applications bancaires
MyISAM :
- Plus rapide pour des sites classiques (Insertion et lecture de données)
- Les requêtes de recherche s’effectuent plus rapidement
On utilisera INNODB
cette semaine
Pierre Faure - pierrefaure.me
24. 1.Les bases de données : MySQL
c. Interagir avec une BDD
The Wolf of Wall Street
Pierre Faure - pierrefaure.me
25. c. Interagir avec une BDD : Se connecter
PDO
Pierre Faure - pierrefaure.me
26. c. Interagir avec une BDD : Se connecter
PDO
Est le procédé conseillé par PHP pour se connecter aux bases de données
Permet d’interagir plus simplement avec MySQL, Oracle, PostgreSQL …
Pierre Faure - pierrefaure.me
27. c. Interagir avec une BDD : Se connecter
$host = 'localhost';
$dbname = '';
$user = 'root';
$pass = '';
$db = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
PDO
$pass = 'root';
Pierre Faure - pierrefaure.me
29. Construction d’une requête
id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
$sql = 'SELECT * FROM users'; Sélectionner toutes les données de la table users1
SELECT
Pierre Faure - pierrefaure.me
30. Envoi et traitement d’une requête
$req = $db->prepare($sql);
$req->execute();
Envoi de la requête au serveur
Exécution de la requête
$sql = 'SELECT * FROM users'; Sélectionner toutes les données de la table users1
2
SELECT
Pierre Faure - pierrefaure.me
31. Traduction du résultat de MySQL pour PHP : fetchAll
$req = $db->prepare($sql);
$req->execute();
Envoi de la requête au serveur
Exécution de la requête
$sql = 'SELECT * FROM users'; Sélectionner toutes les données de la table users1
2
$result = $req->fetchAll(); On stock le résultat de la requête dans $result3
Pourquoi une traduction ?
Car MySQL peut communiquer avec d’autres langages comme Ruby, Python …
Il faut donc traduire le résultat pour PHP
SELECT
fetchAll() permet de convertir le résultat en tableau. Il joue un rôle de traducteur
fetchAll(PDO::FETCH_ASSOC) le tableau sera associatif
Pierre Faure - pierrefaure.me
32. Pour résumer
$req = $db->prepare($sql);
$req->execute();
$sql = 'SELECT * FROM users';1
2
$result = $req->fetchAll();3
$db = new PDO(...); Connexion à la base de données0
Ne pas oublier de se connecter une seule fois au tout début du script
Sélectionner toutes les données de la table users
On stock le résultat de la requête dans $result
Envoi de la requête au serveur
Exécution de la requête
SELECT
Pierre Faure - pierrefaure.me
33. SELECT
Type de requête
SELECT
Destination
FROM
Conditions
WHERE et AND / OR
LIMIT
GROUP BY
ORDER BY
...
Construction d’une requête
SELECT * FROM users WHERE age > 18 AND sex = 0 ORDER BY f_name LIMIT 20
Sélectionner toutes les colonnes de la table users où l’âge est supérieur à 18 et le sexe
est masculin, les classer par prénom, limiter à 20 lignes
age, sex et f_name sont des colonnes de la table users
Pierre Faure - pierrefaure.me
34. SELECT * FROM users WHERE age > 18 AND sex = 0 ORDER BY f_name LIMIT 20
SELECT
Les requêtes préparées
SELECT * FROM users WHERE age > :ag AND sex = :sx ORDER BY f_name LIMIT 20
$req = $db->prepare($sql);
$req->execute(array(
':ag' => $age,
':sx' => $sex
));
$sql = ' ';
Passer les paramètres dans le « execute » permet d’éviter les injections SQL
« prepare » est également très utile lorsqu’on « execute » plusieurs fois de suite la
même requête et que les paramètres sont différents d’une fois à l’autre
Pierre Faure - pierrefaure.me
35. id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
$sql = "SELECT * FROM users";
$req = $db->prepare($sql);
$req->execute();
$result = $req->fetchAll(PDO::FETCH_ASSOC);
Pour sélectionner toutes les données de la table users
SELECT
Pierre Faure - pierrefaure.me
37. id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
$sql = "SELECT f_name, l_name FROM users";
$req = $db->prepare($sql);
$req->execute();
$result = $req->fetchAll(PDO::FETCH_ASSOC);
Pour sélectionner uniquement les prénoms et noms de la table users
SELECT
Pierre Faure - pierrefaure.me
38. Array(
[0] => Array(
[f_name] => David
[l_name] => Axmark
)
[1] => Array(
[f_name] => Rasmus
[l_name] => Lerdorf
)
)
var_dump($result);
Que contient $result ?
Un tableau !
SELECT
Pierre Faure - pierrefaure.me
39. id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
$sql = "SELECT * FROM users WHERE f_name = :fnm ";
$req = $db->prepare($sql);
$req->execute(array(':fnm' => $f_name));
$result = $req->fetchAll(PDO::FETCH_ASSOC);
Pour sélectionner toutes les données de la table users qui ont pour f_name David
SELECT
$f_name = 'David';
Pierre Faure - pierrefaure.me
40. Array(
[0] => Array(
[id] => 1
[f_name] => David
[l_name] => Axmark
[birth] => 1962-04-28
[website] => http://www.mysql.com/
)
)
var_dump($result);
Que contient $result ?
Encore un tableau !
SELECT
Pierre Faure - pierrefaure.me
42. INSERT
Construction d’une requête
id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
$sql = "INSERT INTO users SET f_name = :fnm, l_name = :lnm,
birth = :birth, website = :wsite)";
1
On ajoute Mark Zuckerberg à la base de données
Pierre Faure - pierrefaure.me
43. INSERT
1
$req = $db->prepare($sql);
$req->execute(array(
':fnm' => 'Mark',
':lnm' => 'Zuckerberg',
':birth' => '1984-05-14',
':wsite' => 'http://facebook.com'
));
Envoi de la requête au serveur
Exécution de la requête
2
On ajoute Mark Zuckerberg à la base de données
Envoi et traitement d’une requête
$sql = "INSERT INTO users SET f_name = :fnm, l_name = :lnm,
birth = :birth, website = :wsite)";
Pierre Faure - pierrefaure.me
44. INSERT
Pour résumer
On ajoute Mark Zuckerberg à la base de données
1
$db = new PDO(...); Connexion à la base de données0
Ne pas oublier de se connecter une seule fois au tout début du script
$req = $db->prepare($sql);
$req->execute(array(
':fnm' => 'Mark',
':lnm' => 'Zuckerberg',
':birth' => '1984-05-14',
':wsite' => 'http://facebook.com'
));
Envoi de la requête au serveur
Exécution de la requête
2
$sql = "INSERT INTO users SET f_name = :fnm, l_name = :lnm,
birth = :birth, website = :wsite)";
Pierre Faure - pierrefaure.me
46. Construction d’une requête
id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
$sql = "UPDATE users SET f_name = :newnm WHERE id = 1";1
UPDATE
Modification du prénom par Pierre pour l’utilisateur ayant l’id 1
Pierre Faure - pierrefaure.me
47. $sql = "UPDATE users SET f_name = :newnm WHERE id = 1";1
UPDATE
Modification du prénom par Pierre pour l’utilisateur ayant l’id 1
$req = $db->prepare($sql);
$req->execute(array(':newnm' => 'Pierre'));
Envoi de la requête au serveur
Exécution de la requête
2
Envoi et traitement d’une requête
Pierre Faure - pierrefaure.me
48. Pour résumer
$sql = "UPDATE users SET f_name = :newnm WHERE id = 1";1
UPDATE
Modification du prénom par Pierre pour l’utilisateur ayant l’id 1
2
$db = new PDO(...); Connexion à la base de données0
Ne pas oublier de se connecter une seule fois au tout début du script
$req = $db->prepare($sql);
$req->execute(array(':newnm' => 'Pierre'));
Envoi de la requête au serveur
Exécution de la requête
Pierre Faure - pierrefaure.me
50. Construction d’une requête
id f_name l_name birth
1
36754
David Axmark 1962-04-28
website
http://…
http://…Rasmus 1968-11-22Lerdorf
users
$sql = "DELETE FROM users WHERE id = 1";1
Suppression de l’utilisateur ayant l’id 1
DELETE
Pierre Faure - pierrefaure.me
51. $sql = "DELETE FROM users WHERE id = 1";1
DELETE
Suppression de l’utilisateur ayant l’id 1
$req = $db->prepare($sql);
$req->execute();
Envoi de la requête au serveur
Exécution de la requête
2
Envoi et traitement d’une requête
Pierre Faure - pierrefaure.me
52. Pour résumer
$sql = "DELETE FROM users WHERE id = 1";1
DELETE
Suppression de l’utilisateur ayant l’id 1
$req = $db->prepare($sql);
$req->execute();
Envoi de la requête au serveur
Exécution de la requête
2
$db = new PDO(...); Connexion à la base de données0
Ne pas oublier de se connecter une seule fois au tout début du script
Pierre Faure - pierrefaure.me
53. JOINTURES SQL
t1 t2 t2t1
t2t1
t2t1 t2t1
SELECT *
FROM t1
LEFT JOIN t2
ON t1.key = t2.key
SELECT *
FROM t1
RIGHT JOIN t2
ON t1.key = t2.key
SELECT *
FROM t1
FULL OUTER JOIN t2
ON t1.key = t2.key
SELECT *
FROM t1
FULL OUTER JOIN t2
ON t1.key = t2.key
WHERE t1.key IS NULL
OR t2.key IS NULL
SELECT *
FROM t1
INNER JOIN t2
ON t1.key = t2.key
Soit t1 et t2, deux tables pouvant être reliées l’une à l’autre grâce à des clés étrangères
Modèle original : C.L. Moffatt Pierre Faure - pierrefaure.me
54. COLLE
2.Les fonctions
On peut comparer une fonction à une machine
qui effectue toujours les mêmes actions
a.La machine à carottes
Les paramètres
Le résultat : return
Pierre Faure - pierrefaure.me
55. 2.Les fonctions
Rappels
Une fonction effectue une ou plusieurs actions et retourne un résultat
function validPassword($pass){
if(strlen($pass) > 4){
return true;
}
else{
return false;
}
}
Si la longueur du mot de passe est supérieure à 4
On renvoie true
Sinon
On renvoie false
validPassword('1234'); false
validPassword('12345'); true
Pierre Faure - pierrefaure.me
56. 2.Les fonctions
Avec MySQL : supprimer un article
$host = 'localhost';
$dbname = '';
$user = 'root';
$pass = '';
$db = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
function deletePost($db, $id){
$sql = "DELETE FROM posts WHERE id = :id";
$req = $db->prepare($sql);
$req->execute(array(':id' => $id));
}
deletePost($db, 1);
Pierre Faure - pierrefaure.me
57. 2.Les fonctions
Les fonctions proposées par PHP
isset(); est définie
empty(); est vide
!empty(); n’est pas vide
explode(); coupe une chaîne de caractère
Liste de l’ensemble des fonctions sur http://php.net/
Pierre Faure - pierrefaure.me
58. 3.Le Modèle MVC
M V CO
D
È
L
E
U
E
O
N
T
R
Ô
L
E
U
R
Pierre Faure - pierrefaure.me
59. 3.Le Modèle MVC
a.Principe
MODÈLE
VUE
CONTRÔLEUR
Contient la plupart de votre code PHP, les fonctions, les requêtes SQL …
Contient vos pages HTML avec peu de PHP (boucles, conditions …)
Fais la liaison entre le modèle et la vue, il permet d’initialiser la logique de votre code avec
des « include » et des vérifications basiques (utilisateur authentifié, connexion à la BDD …)
Pierre Faure - pierrefaure.me
60. b.Mise en pratique
monsite Dossier racine
Contrôleur
Configurations (BDD …)
fonctions, requêtes …
fichiers html, images …
config
model
view
index.php
css
img
js
index.html
Pierre Faure - pierrefaure.me
65. a.$_FILES
1 Choix de l’image via le bouton Parcourir … L’image est chez vous
L’image est temporairement
sur le serveur
2 Verifications diverses
Extension : strrchr()
Type MIME : $_FILES["file"]["type"]
Taille : getimagesize()
3 Déplacer l’image dans le dossier de votre choix
avec le nom désiré
move_uploaded_file()
L’image est définitivement
sur le serveur
Les étapes de l’envoi de fichier
‘‘Avec les éléments ci-dessus, la sécurité n’est pas nécessairement assurée
Beaucoup de paramètres peuvent entrer en jeu entre votre serveur et votre fichier .htaccess
Pierre Faure - pierrefaure.me
66. a.$_FILES
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit">
</form>
$_FILES et $_POST sont interprétés différemment par le navigateur
L’envoi de fichier est rendu possible par :
le type="file" qui permet de sélectionner un fichier
le enctype="multipart/form-data" qui signale au navigateur
qu’il va devoir traiter un fichier
Comment modifier le formulaire pour envoyer un fichier
Pierre Faure - pierrefaure.me
67. a.$_FILES et $_POST
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<textarea name="description"></textarea>
<input type="submit">
</form>
var_dump($_POST);
array(1) {
["description"]=> string(22) "description de l'image"
}
Pierre Faure - pierrefaure.me
68. 4.Quelques trucs à savoir
b.$_SESSION
$_SESSION
accueil profil article
‘’En changeant de page, restez connecté grâce à la SESSION
Pierre Faure - pierrefaure.me
69. b.$_SESSION : initialisation
session_start(); permet d’initialiser une nouvelle SESSION
Il doit se situer sur chaque page de votre code ou vous souhaitez utiliser la SESSION
Pierre Faure - pierrefaure.me
71. b.$_SESSION : se déconnecter
Savoir détruire une SESSION peut s’avérer utile lorsque par exemple,
un utilisateur se déconnecte
session_unset();
session_destroy();
Permet de "nettoyer" les variables de SESSION
Elles seront vides
Permet de supprimer la SESSION
Elle ne sera plus existante
Pierre Faure - pierrefaure.me
76. 4.Quelques trucs à savoir
d.HTML et PHP
</> <?>&
Pierre Faure - pierrefaure.me
77. 4.Quelques trucs à savoir
d.HTML et PHP
<div id="content">
<ul id="account">
<?php
if($connected == true){
echo '<li>Bienvenue Pierre !</li>';
}
else{
echo '<li><a href="">Inscrivez-vous</a></li>';
}
?>
<li><a href="">Notre newsletter</a></li>
</ul>
</div>
‘‘Vous pouvez mettre du php dans un fichier .html et du html dans un fichier .php
Pierre Faure - pierrefaure.me
79. Made by Pierre Faure
Check out my blog: pierrefaure.me
A big thanks to the noun project for the icons
Fonts: Courier Prime & Marvel
Pierre Faure - pierrefaure.me