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