php 2 - approfondissement mysql, pdo et mvc
Post on 23-Jan-2018
2.086 Views
Preview:
TRANSCRIPT
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
1.Les bases de données : MySQLa.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
1.Les bases de données : MySQLa.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
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 égalements’intituler clé étrangère ou foreign key (FK)
Pierre Faure - pierrefaure.me
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
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
b.phpMyAdmin : à l’intérieur de base_de_donnee3
Les tables de la BDD
Créer une table
Pierre Faure - pierrefaure.me
b.phpMyAdmin : à l’intérieur de la table vehicles
Les colonnes
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 à 0Null : 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éeAction : Opérations réalisables
Pierre Faure - pierrefaure.me
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
b.phpMyAdmin : créer une table
Créons une table posts
Contenant les colonnes id, title, content, date
Pierre Faure - pierrefaure.me
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 valeurPierre Faure - pierrefaure.me
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
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
b.phpMyAdmin : Attribut > UNSIGNED
Attributs > UNSIGNED : Les valeurs stockées seront supérieures à 0
Pierre Faure - pierrefaure.me
b.phpMyAdmin : NULL
Null : Non = La valeur ne peut pas être inexistante
‘‘Une valeur vide n’est pas similaire/égale à une valeur NULLPierre Faure - pierrefaure.me
b.phpMyAdmin : Index > PRIMARY
Index PRIMARY : clé primaire & unique de la table « id »
Pierre Faure - pierrefaure.me
b.phpMyAdmin : Auto Incrémentation
A_I (Auto_Increment) : +1 automatiquement lorsqu’une donnée est ajoutée
Pierre Faure - pierrefaure.me
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
1.Les bases de données : MySQLc. Interagir avec une BDD
The Wolf of Wall StreetPierre Faure - pierrefaure.me
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
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
SELECTINSERTUPDATE
DELETE
c. Interagir avec une BDD : Requêtes
Pierre Faure - pierrefaure.me
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
Envoi et traitement d’une requête
$req = $db->prepare($sql);$req->execute();
Envoi de la requête au serveurExé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
Traduction du résultat de MySQL pour PHP : fetchAll
$req = $db->prepare($sql);$req->execute();
Envoi de la requête au serveurExé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 traducteurfetchAll(PDO::FETCH_ASSOC) le tableau sera associatif
Pierre Faure - pierrefaure.me
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 serveurExécution de la requête
SELECT
Pierre Faure - pierrefaure.me
SELECT
Type de requête
SELECT
Destination
FROM
Conditions
WHERE et AND / ORLIMIT GROUP BYORDER 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 usersPierre Faure - pierrefaure.me
SELECT * FROM users WHERE age > 18 AND sex = 0 ORDER BY f_name LIMIT 20
SELECTLes 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
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
Array( [0] => Array( [id] => 1 [f_name] => David [l_name] => Axmark [birth] => 1962-04-28 [website] => http://www.mysql.com/ ) [1] => Array( [id] => 36754 [f_name] => Rasmus [l_name] => Lerdorf [birth] => 1968-11-22 [website] => http://php.net ) )
var_dump($result);
Que contient $result ?
Un tableau !
SELECT
Pierre Faure - pierrefaure.me
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
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
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
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
SELECTINSERTUPDATE
DELETE
c. Interagir avec une BDD : Requêtes
Pierre Faure - pierrefaure.me
INSERTConstruction 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
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 serveurExé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
INSERTPour 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 serveurExé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
SELECTINSERTUPDATE
DELETE
c. Interagir avec une BDD : Requêtes
Pierre Faure - pierrefaure.me
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
$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 serveurExécution de la requête
2
Envoi et traitement d’une requête
Pierre Faure - pierrefaure.me
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 serveurExécution de la requête
Pierre Faure - pierrefaure.me
SELECTINSERT
DELETE
c. Interagir avec une BDD : Requêtes
UPDATE
Pierre Faure - pierrefaure.me
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
$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 serveurExécution de la requête
2
Envoi et traitement d’une requête
Pierre Faure - pierrefaure.me
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 serveurExé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
JOINTURES SQL
t1 t2 t2 t1
t2 t1
t2 t1 t2 t1
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.keyWHERE 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
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
2.Les fonctionsRappels
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 à 4On renvoie true
SinonOn renvoie false
validPassword('1234'); false
validPassword('12345'); true
Pierre Faure - pierrefaure.me
2.Les fonctionsAvec 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
2.Les fonctionsLes 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
3.Le Modèle MVCa.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
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
b.Mise en pratique
index.php
index.html
function.phpinclude 'config/db.php';
C ONTRÔLEUR
M ODÈLE
VUE
db.php
Connexion à la BDD
include 'model/function.php';
include 'view/index.html';
a.$_FILES
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="image"> <input type="submit"> </form>
var_dump($_FILES['image']);
array(5) { ["name"]=> string(53) "screenshot.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(36) "/tmp/php/php70mcrk" ["error"]=>int(0) ["size"]=>int(115383) }
Pierre Faure - pierrefaure.me
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éeBeaucoup de paramètres peuvent entrer en jeu entre votre serveur et votre fichier .htaccess
Pierre Faure - pierrefaure.me
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
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
4.Quelques trucs à savoirb.$_SESSION
$_SESSION
accueil profil article
‘’En changeant de page, restez connecté grâce à la SESSION
Pierre Faure - pierrefaure.me
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
$_SESSION['username'] = 'Pierre'; $_SESSION['email'] = 'mail@example.com'; $_SESSION['profil-picture'] = 'profil.jpg';
var_dump($_SESSION);
array(3) { ["username"]=> string(6) "pierre" ["email"]=>string(16) "mail@example.com" ["profil-picture"]=>string(10) "profil.jpg" }
echo 'Bonjour '.$_SESSION['username']; Bonjour Pierre
b.$_SESSION : déclarer des variables
Pierre Faure - pierrefaure.me
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 SESSIONElle ne sera plus existante
Pierre Faure - pierrefaure.me
c.L’indentation
if(){
}
}
}
}
if(){
else{
for($i=0;$i<10;$i++){
Pour le PHP
Pierre Faure - pierrefaure.me
c.L’indentation
<div id="content">
</div>
</ul>
</li>
</div>
<div id="header">
<ul id="list">
<li>
Pour le HTML
Pierre Faure - pierrefaure.me
c.L’indentation
<div id="content">
</div>
}
</div>
</div>
<div id="header">
if{
<div id="connected">
Pour le HTML et le PHP
Pierre Faure - pierrefaure.me
4.Quelques trucs à savoird.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
Made by Pierre FaureCheck out my blog: pierrefaure.me
A big thanks to the noun project for the icons Fonts: Courier Prime & Marvel
Pierre Faure - pierrefaure.me
top related