Php 2 - Approfondissement MySQL, PDO et MVC

Post on 23-Jan-2018

2.086 views 10 download

Transcript of Php 2 - Approfondissement MySQL, PDO et MVC

<?php

2Pierre Faure - pierrefaure.me

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

1.Les bases de données : MySQLb.phpMyAdmin

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

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

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

Pierre 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 MVC

M V CODÈ L E

UE

ONTRÔLEUR

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';

4.Quelques trucs à savoir

Pierre Faure - pierrefaure.me

4.Quelques trucs à savoira.$_FILES et $_POST

&Pierre Faure - pierrefaure.me

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

4.Quelques trucs à savoirc.L’indentation

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

</> <?>&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

?>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