php/mysql · pdf file... base de données contenant les informations sur les livres, ......

Post on 02-Feb-2018

218 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

PHP/MYSQLWeb Dynamique

ENSG Septembre 2009

jeudi 24 septembre 2009

Ces 6 jours de formation

Jour 1 : présentations, attentes, principes, HTML

Jour 2 : HTML, CSS, PHP

Jour 3 : formulaires, connexion à la base de données

Jour 4 : Rappel PHP, sessions, cookies, extraction de données, affichage

Jour 5 : Requêtes, Insertion de données

Jour 6 : Sécurité, questions, retours sur la formation.

jeudi 24 septembre 2009

NOTRE EXEMPLEApplication simple en PHP

jeudi 24 septembre 2009

Gestion de bibliothèque

Enregistrement des ouvrages : titre, auteur, date de publication, catégorie

Ajout de nouveau livres par des utilisateurs autorisés

Recherche par catégorie, par titre, par auteur

Accès par le web

jeudi 24 septembre 2009

Application web

PHP : traitements

MySQL : base de données contenant les informations sur les livres, utilisateurs, etc...

jeudi 24 septembre 2009

PHPLangage de script adapté au web

jeudi 24 septembre 2009

Où trouver tout ce que vous voulez savoir et tout ce que vous ne

voulez pas savoir à propos de PHP ?

jeudi 24 septembre 2009

http://www.php.net

jeudi 24 septembre 2009

AU REVOIRBonne fin de journée !

jeudi 24 septembre 2009

IDE ET DEBUGGEREclipse et XDebug

jeudi 24 septembre 2009

IDE : eclipse + PDTSe simplifier la vie

jeudi 24 septembre 2009

IDE : eclipse + PDT

Auto-complétion

ctrl+espace

Vérification de la syntaxe à la volée

Ajout automatique de commentaires de documentation :

/** + retour chariot devant une déclaration de fonction ou sur un en-tête de fichier

Intégration avec XDebug (point d’arrêts, lancement)

jeudi 24 septembre 2009

DEBUGGER ET PHPXDebug

jeudi 24 septembre 2009

XDebug : debugger de PHPPHP : langage de script

Debu!er non prévu à l’origine comme en C/C++/java/.Net

Debu!er :

Points d’arrêts,

Pas à pas,

Exploration des variables

jeudi 24 septembre 2009

Configurer XAMPP sans installation

Récupérer et décompresser le .zip dans un répertoire adéquat (pas le bureau)

Lancer setup_xampp.bat

Aux questions, voyons les réponses ensemble

jeudi 24 septembre 2009

Configuration de XDebug

Utiliser XAMPP : XDebug est installé mais pas activé

ouvrir <XAMPP>/php/php.ini avec un éditeur texte

Décommenter les lignes de configuration de la section [XDebug]

Décommenter la ligne zend_extension = ..php_xdebug.dll

Relancer apache via XAMPP

jeudi 24 septembre 2009

Nouveau projet EclipseOuvrir eclipseChoisir <XAMPP>/htdocs/eclipse (créer le dossier) comme workspaceCréer un projet PHP :

Clic droit dans la liste des projets : New > PHP ProjectClic droit sur le dossier : New > PHP File > index.php

Écrire : <?php phpinfo(); et sauvegarderConfigurer le debu!er :

Clic droit sur le projet > debug asChoisir XDebug,Nouveau serveur Web :

Donner un nom, URL : http://localhost/eclipse/Cliquer sur Debug pour tester : le navigateur doit s’ouvrir sur une page non vide

jeudi 24 septembre 2009

LANGAGE PHPIntroduction

jeudi 24 septembre 2009

BONJOUR LE MONDELe n-ième He$o World

jeudi 24 septembre 2009

Hello world

Nouveau langage, nouveau He$o world !

Créer un fichier index.php

jeudi 24 septembre 2009

Hello world

Nouveau langage, nouveau He$o world !

Créer un fichier index.php

<?phpecho “Hello world”;

?>

jeudi 24 septembre 2009

Explications

<?phpecho “Hello world”;

?>

jeudi 24 septembre 2009

Explications

<?phpecho “Hello world”;

?>

Délimitent le code PHP

jeudi 24 septembre 2009

Explications

<?phpecho “Hello world”;

?>

Délimitent le code PHP

Tout ce qui est en dehors de ces balises n’est pas interprété comme du code PHP mais directement envoyé au client.

jeudi 24 septembre 2009

Hello world 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

<head><title>Mon index.php !!!</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" />

</head><body>

<p><?php

echo “Hello World !”;?></p>

</body></html>

jeudi 24 septembre 2009

Hello world 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

<head><title>Mon index.php !!!</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" />

</head><body>

<p><?php

echo “Hello World !”;?></p>

</body></html>

Seule partie interprétée par PHP

jeudi 24 septembre 2009

LES VARIABLESet les opérateurs

jeudi 24 septembre 2009

PHP et les variables

Pas besoin de déclarer les variables

Pas de type de données

Pas de gestion mémoire

jeudi 24 septembre 2009

PHP et les variables

Pas besoin de déclarer les variables

Pas de type de données

Pas de gestion mémoire

<?php$foo = “bar”;$foo = 3;$foo++;

?>

jeudi 24 septembre 2009

Opérateurs

Opérateur Exemple Résultat si $bar = 3

= affectation $foo = $bar 3

+ addition 2+3+$bar; 8

- soustraction 2-3-$bar; -2

* multiplication 2*3*$bar; 18

/ division $bar/2; 1.5

% modulo $bar%2 1

. concaténation $bar.” ok ” “3 ok”

jeudi 24 septembre 2009

Opérateurs

Opérateur Exemple Résultat si $bar = 3

= affectation $foo = $bar 3

+ addition 2+3+$bar; 8

- soustraction 2-3-$bar; -2

* multiplication 2*3*$bar; 18

/ division $bar/2; 1.5

% modulo $bar%2 1

. concaténation $bar.” ok ” “3 ok”Ne pas confondre avec l’opérateur de comparaison ==

jeudi 24 septembre 2009

Opérateurs de comparaisonOpérateur Exemple Résultat

== égalité de valeur “3” == 3 TRUE

=== égalité valeur et type

“3” === 3 FALSE

< inférieur strict “3” < 3 FALSE<= inférieur ou égal “3” <= 3 TRUE> supérieur strict “3” > 3 FALSE>= supérieur ou égal “3” >= 3 TRUE!= différent (valeur) “3” != 3 FALSE

!== différent (valeur ou type)

“3” !== 3 TRUE

jeudi 24 septembre 2009

Opérateurs logiques

Opérateur

! NON

&& ET

|| OU

jeudi 24 septembre 2009

LES TABLEAUXUne structure de données très utile

en PHP

jeudi 24 septembre 2009

PHP et les tableaux<?php

// Création (facultatif)$montab = array();

// Initialisations$montab[0] = 1;$montab[1] = 32.5;$montab[2] = “Hello World”;

// Tableaux à plusieurs dimensions$montab[3] = array();$montab[3][0] = 1;$montab[3][2] = “Hello World”;

// Initialisation sans connaître le numéro$montab[] = 32; // Équivalent à $montab[4] = 32;

// Création et initalisation$tableau2 = array(1,32.5,”Hello World”,32);

?>

jeudi 24 septembre 2009

Tableaux de hachage

<?php// Création (facultatif)$montab = array();

// Initialisations$montab[“couleur”] = “vert”;$montab[“temperature”] = 32.5;$montab[“message”] = “Hello World”;

// Création et initalisation$tableau2 = array(“couleur”=>”vert”,

“temperature”=>32.5,“message”=>”Hello World”);

?>

jeudi 24 septembre 2009

Tableaux de hachage

<?php// Création (facultatif)$montab = array();

// Initialisations$montab[“couleur”] = “vert”;$montab[“temperature”] = 32.5;$montab[“message”] = “Hello World”;

// Création et initalisation$tableau2 = array(“couleur”=>”vert”,

“temperature”=>32.5,“message”=>”Hello World”);

?>

NB : les tableaux à plusieurs dimensions sont aussi possibles

jeudi 24 septembre 2009

Parcours de tableaux

<?php// Récupération de la cléforeach ($tableau as $cle => $valeur){

echo “<p>La clé ”.$cle.” est associée à la valeur : ”.$valeur.”<p>”;}

// Pas de récupération de la cléforeach ($tableau as $valeur){

echo “<p>Le tableau contient la valeur : ”.$valeur.”<p>”;}

?>

jeudi 24 septembre 2009

Boucles<?php

// Boucle «Pour» de 0 à 99for ($compteur = 0; $compteur < 100 ; $compteur++){

echo “<p>Le compteur a la valeur ”.$compteur.”</p>”;}

// Boucle «Tant que»while ($test == false){

echo “<p>Le test est faux<p>”;$test = true;

}

// Boucle «Répeter jusqu’à»do{

echo “<p>Traitement<p> “;$test = true;

} while ($test == false)

?>

jeudi 24 septembre 2009

Tests

<?phpif ($truc == “machin”){

// Si truc = machin}else{

// Sinon }

?>

jeudi 24 septembre 2009

LES FORMULAIRESInteractions avec l’utilisateur

jeudi 24 septembre 2009

Données des formulaires

<form action=”fichier.php” method=”get”><input type=”text” name=”nom” /><input type=”submit” value=”Envoyer” />

</form>

Code source HTML

jeudi 24 septembre 2009

Données des formulaires

<form action=”fichier.php” method=”get”><input type=”text” name=”nom” /><input type=”submit” value=”Envoyer” />

</form>

Fichier qui devra analyser le formulaire

Code source HTML

jeudi 24 septembre 2009

Données des formulaires

<form action=”fichier.php” method=”get”><input type=”text” name=”nom” /><input type=”submit” value=”Envoyer” />

</form>

Fichier qui devra analyser le formulaire

Valeur renvoyée par l’utilisateur accessible via

$_GET[“nom”]

Code source HTML

jeudi 24 septembre 2009

Méthodes de formulaires

GET POST

passé dans la barre d’adresse passé en HTTP

marques-page et liens possibles pas de marque-page

$_GET[“nom”] $_POST[“nom”]

jeudi 24 septembre 2009

PETIT EXERCICEFormulaire d’authentification

jeudi 24 septembre 2009

Exo : formulaire et PHPCréer un formulaire d’authentification dans un fichier phpTraiter le résultat du formulaire avec le même fichierSi le login est “admin” et le mot de passe “pipo” remplacer le formulaire par un cadre rappelant l’identité de l’utilisateurAfficher une information “secrète”Fonctions utiles : array_key_exists() et is_array() (voir la documentation de PHP)

jeudi 24 septembre 2009

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">! <head>! <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>Exercice 1</title>! </head>! <body>! <h1>Page web protégée</h1>! <div id="identite"><?php if (is_array($_POST) && array_key_exists("login",$_POST) && array_key_exists("pass",$_POST) && $_POST["login"]=="admin" && $_POST["pass"]=="pipo") { // Ok $connecte = true; echo "<p>Bienvenue Admin !</p>"; }else{ $connecte = false; // Formulaire?> <form method="post" action="index.php"> <dl> <dt>Nom</dt> <dd><input type="text" name="login" /></dd> <dt>Mot de passe</dt> <dd><input type="password" name="pass" /></dd> </dl> <p><input type="submit" value="Connexion" /></p> </form><?php }

?> </div> <div id="contenu"> <?php if ($connecte) { ?> <p>Informations confidentielles, accessibles uniquement pour l'admin ! Trop fort !</p><?php }else { ?> <p>Connectez-vous d'abord !</p> <?php } ?> </div>! </body></html>

jeudi 24 septembre 2009

Comment fait-on pour gérer les identités grâce à la base de données ?

jeudi 24 septembre 2009

MYSQLSGBD libre

jeudi 24 septembre 2009

SGBD libre

Système de gestion de bases de données libre

Bases de données relationnelle (standard)

Suffit à la plupart des usages du web

Grand succès grâce au lien fort avec PHP

Libre : open source et gratuit

jeudi 24 septembre 2009

SGBD simple

Pas de transactions (sur MyISAM)

Pas de procédures stockées

Pas de contrôle d’intégrité

jeudi 24 septembre 2009

SQLÉchanger avec la base de données

jeudi 24 septembre 2009

Un langage standard

Langage normalisé

Repris par tous les SGBD, mais adapté aux besoins :

petites différences dans la syntaxe

base et principes communs

jeudi 24 septembre 2009

Manipulation des données

SELECT : récupération de données selon certains critères

INSERT : enregistrement de nouvelles données

UPDATE : modification de données existantes

DELETE : suppression de données

jeudi 24 septembre 2009

Manipulation de la structure

CREATE : création d’une table ou d’une base de données

DROP : effacement d’une table ou base

ALTER : modifier une table existante

jeudi 24 septembre 2009

MODÉLISATIONCréer un schéma de base de données

jeudi 24 septembre 2009

Identifier les données

Utilisateurs

Livres

Auteurs

Catégories

jeudi 24 septembre 2009

Modélisation de la base de données

njeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

1.Identifier les objets

njeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

1.Identifier les objets2.Trouver des identifiants uniques

njeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

1.Identifier les objets2.Trouver des identifiants uniques

id

id

ISBN

id

njeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

1.Identifier les objets2.Trouver des identifiants uniques3.Trouver les relations entre objets et les cardinalités

id

id

ISBN

id

1 auteur écrit plusieurs liv

res

1 livre n’a qu’un auteur

njeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

1.Identifier les objets2.Trouver des identifiants uniques3.Trouver les relations entre objets et les cardinalités

id

id

ISBN

id

1 auteur écrit plusieurs liv

res

1 livre appartient à 1

ou plusieurs catégories

1 livre n’a qu’un auteur

1 catégorie peut contenir

plusieurs livres

njeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

1.Identifier les objets2.Trouver des identifiants uniques3.Trouver les relations entre objets et les cardinalités

id

id

ISBN

id

1 auteur écrit plusieurs liv

res

1 livre appartient à 1

ou plusieurs catégories

1 livre n’a qu’un auteur

1 catégorie peut contenir

plusieurs livres

1,1

1,n

1,n

n

0,n

jeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

id

id

ISBN

id

n

1,1

1,n

1,n

0,n

jeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

4.Relations 1-n : mettre une clé étrangère dans la table des objets qui ne sont liés qu’à un seul objet

id

id

ISBN

id

n

#auteur

1,1

1,n

1,n

0,n

jeudi 24 septembre 2009

Modélisation de la base de données

Utilisateur

NomPrénomLoginMot de passe

Livre

ISBNTitreAnnée de publication

Auteur

NomPrénom

Catégorie

Nom

4.Relations 1-n : mettre une clé étrangère dans la table des objets qui ne sont liés qu’à un seul objet

5.Relations n-n : créer une table de liaison

id

id

ISBN

id

n

#auteurAppartenance

#catégorie#livre

1,11,1

1,1

1,n

1,n

0,n

jeudi 24 septembre 2009

Exemples de donnéesISBN Titre Auteur

32234S Le Calme 108534G Tempête 1 id Nom Prénom

1 Dupond Jean2 Dupont Georges

id Catégorie

1 Roman2 Policier

ISBN Categorie

08534G 108534G 2

jeudi 24 septembre 2009

Exemples de donnéesISBN Titre Auteur

32234S Le Calme 108534G Tempête 1 id Nom Prénom

1 Dupond Jean2 Dupont Georges

id Catégorie

1 Roman2 Policier

ISBN Categorie

08534G 108534G 2

jeudi 24 septembre 2009

Exemples de donnéesISBN Titre Auteur

32234S Le Calme 108534G Tempête 1 id Nom Prénom

1 Dupond Jean2 Dupont Georges

id Catégorie

1 Roman2 Policier

ISBN Categorie

08534G 108534G 2

jeudi 24 septembre 2009

Exemples de donnéesISBN Titre Auteur

32234S Le Calme 108534G Tempête 1 id Nom Prénom

1 Dupond Jean2 Dupont Georges

id Catégorie

1 Roman2 Policier

ISBN Categorie

08534G 108534G 2

jeudi 24 septembre 2009

Exercice

Créez des tables

Écrivez des données d’exemple : comptes d’utilisateurs, livres, catégories, auteurs

Écrivez et testez avec phpMyAdmin des requêtes qui permettent de récupérer

les livres d’une certaine catégorie ou

les ouvrages d’un auteur (selon son nom)

jeudi 24 septembre 2009

AUTHENTIFICATIONAvec utilisation de la base de données

jeudi 24 septembre 2009

Fonctions de hachage

jeudi 24 septembre 2009

Fonctions de hachage

hash

jeudi 24 septembre 2009

Fonctions de hachage

hashTexte, fichier(Peut être très long)

Empreinte de taille fixe

jeudi 24 septembre 2009

Fonctions de hachage

hashTexte, fichier(Peut être très long)

Empreinte de taille fixe

XImpossible(ou au moins très difficile)

jeudi 24 septembre 2009

ExerciceUtilisez la base de données pour vérifier l’authentificationStockez en base de données le mot de passe haché (md5 ou sha-1)

Ne jamais stocker les mots de passe en clair dans la base de donnéesNe jamais chiffrer les mots de passe dans la base de donnéesToujours stocker des mots de passe hachés

jeudi 24 septembre 2009

Fonctions MySQL de PHP

Rechercher dans la documentation PHP des informations sur MySQL

mysql_connect()

mysql_query()

mysql_real_escape_string()

mysql_fetch_object() ou mysql_fetch_array()

jeudi 24 septembre 2009

Connexion à une base de données

Fonction mysql_connect(host, user, password)

N’utiliser qu’une seule fois dans un script

Script plus rapide

Moins de charge sur la base de données<?php

$lienDB = @mysql_connect(“localhost”, “utilisateur”,”motDePasse”);if (!$lienDB)

die(“Erreur de connexion à la base de données”);?>

jeudi 24 septembre 2009

Exécution d’une requête

Fonction mysql_query()

<?php$lienDB = @mysql_connect(“localhost”, “utilisateur”,”motDePasse”);if (!$lienDB)

die(“Erreur de connexion à la base de données”);@mysql_query(“INSERT INTO livres (titre,auteur) VALUES (‘Test’,1)”,$lienDB);

?>

jeudi 24 septembre 2009

Récupération de données

Fonction mysql_fetch_array() ou mysql_fetch_object()<?php

$lienDB = @mysql_connect(“localhost”, “utilisateur”,”motDePasse”);if (!$lienDB)

die(“Erreur de connexion à la base de données”);$resultat = @mysql_query(“SELECT * FROM livres”,$lienDB);

for ($i=0;$i<@mysql_num_rows($resultat);$i++){

$livres[] = @mysql_fetch_object($resultat);}

// Accès aux donnéesecho “<ul>”;foreach($livres as $livre){

echo “<p>”.$livre->titre.”</p>”;}echo “</ul>”;

?>

jeudi 24 septembre 2009

Sécurisation des requêtesTous les paramètres reçus de l’utilisateur et utilisés dans une requête doivent-être sécurisés : mysql_real_escape_string()

FormulairesBase de donnée

<?php$lienDB = @mysql_connect(“localhost”, “utilisateur”,”motDePasse”);if (!$lienDB)

die(“Erreur de connexion à la base de données”);// Sécurisation$login = mysql_real_escape_string($_POST[“login”],$lienDB);@mysql_query(“SELECT * FROM utilisateurs WHERE login=’”.$login.”’”,$lienDB);

?>

Le paramètre magic_quotes de PHP peut poser des problèmes. Avant sa désactivation, il faut vérifier que tous les paramètres sont sécurisés !

jeudi 24 septembre 2009

MODÉLISATION DE L’APPLICATION

Quels fichiers, quelles fonctions ?

jeudi 24 septembre 2009

QUELLES FONCTIONS ?

Un fichier par fonction de l’application

jeudi 24 septembre 2009

Utilisation de librairies PHP

Appel à des fonctions définies dans un autre fichier : include / include_oncerequire / require_once : erreur si le fichier n’est pas trouvé

*_once : le fichier n’est pas parsé une deuxième fois, évite les erreurs (fonctions déjà déclarées)include ou require : équivalent à la recopie du fichier appelé à la place de l’instruction d’inclusion

jeudi 24 septembre 2009

QUELLE LIBRAIRIES UTILISÉES PAR TOUTE

L’APPLICATION ?Un fichier par librairie !

jeudi 24 septembre 2009

Librairies

Connexion, requêtes MySQL

Authentification et gestion de l’identité

Affichage des éléments de la page : titre, menu, footer, etc...

jeudi 24 septembre 2009

CRÉEZ LES LIBRAIRIES

Et incluez les au bon endroit.

jeudi 24 septembre 2009

top related