Formation PHP

27 930 vues

Publié le

Un support de cours PHP réalisé pour Junior ISEP.

Publié dans : Technologie
2 commentaires
23 j’aime
Statistiques
Remarques
  • comment je peux télécharger ce document en ppt ou en pdf. Lors de téléchargement, je trouve un dossier compressé avec des fichiers xml!
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • _____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
Aucun téléchargement
Vues
Nombre de vues
27 930
Sur SlideShare
0
Issues des intégrations
0
Intégrations
179
Actions
Partages
0
Téléchargements
1 814
Commentaires
2
J’aime
23
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Formation PHP

  1. 1. Formation PHP <ul><ul><li>Junior Isep 2006 </li></ul></ul>Pierre de La Morinerie
  2. 2. Pourquoi PHP ? <ul><li>PHP permet de : </li></ul><ul><ul><li>Utiliser des formulaires </li></ul></ul><ul><ul><li>Proposer des pages dynamiques </li></ul></ul><ul><ul><li>Traiter des données sur un serveur </li></ul></ul><ul><ul><li>Communiquer avec une Base de données </li></ul></ul><ul><li>PHP (ou un autre langage serveur) est quasiment indispensable à la réalisation d'un site Web avancé. </li></ul>
  3. 3. Historique <ul><li>Présentation : </li></ul><ul><ul><li>1994 : créé par Rasmus Lerdorf pour sa page perso </li></ul></ul><ul><ul><li>D'abord en Perl, puis en C : Personnal Home Page </li></ul></ul><ul><ul><li>1997 : repris par Andi Gutmans et Zeev Suraski </li></ul></ul><ul><ul><li>Sortie de PHP3, largement utilisé depuis </li></ul></ul><ul><li>Particularités : </li></ul><ul><ul><li>Ressemble au C/C++ </li></ul></ul><ul><ul><li>Faiblement typé </li></ul></ul>
  4. 4. Sommaire <ul><li>Installation des serveurs (WAMP, EasyPHP) </li></ul><ul><li>Première page PHP </li></ul><ul><li>Structures du langage : variables, boucles, conditions </li></ul><ul><li>Fonctions et manipulation de tableaux </li></ul><ul><li>Base de données : présentation, administration </li></ul><ul><li>Base de données : requêtes, insertions, mises à jour </li></ul><ul><li>Formulaires XHTML </li></ul><ul><li>Sécurité </li></ul>
  5. 5. Installation des serveurs (WAMP)
  6. 6. Installation des serveurs <ul><li>Pourquoi utiliser un serveur ? </li></ul><ul><ul><li>Seul le serveur sait interpréter du PHP </li></ul></ul><ul><li>Que doit-on installer ? </li></ul><ul><ul><li>Apache : pour communiquer avec le navigateur </li></ul></ul><ul><ul><li>PHP : pour interpréter les fichiers .php </li></ul></ul><ul><ul><li>MySQL : pour utiliser la Base de Données </li></ul></ul><ul><li>Ces trois outils, couplés à Linux ou Windows, forment une solution LAMP ou WAMP </li></ul>
  7. 7. Installation des serveurs <ul><li>WAMP : </li></ul><ul><ul><li>regroupe tous ces serveurs </li></ul></ul><ul><ul><li>intègre aussi des outils d’administration </li></ul></ul><ul><ul><li>est gratuit </li></ul></ul><ul><li>WAMP n'est pas obligatoire ! On pourrait installer chaque serveur séparément – il est d'ailleurs bon de savoir le faire. </li></ul>
  8. 8. Installation des serveurs <ul><li>Installation de WAMP </li></ul><ul><ul><li>Télécharger WAMP depuis www.wampserver.com , ou EasyPHP </li></ul></ul><ul><li>Questions posées par l'installeur : </li></ul><ul><ul><li>« Lancer les services automatiquement » : Oui </li></ul></ul><ul><ul><li>« Dossier racine » : par défaut </li></ul></ul><ul><ul><li>« Serveur SMTP » : par défaut (localhost) </li></ul></ul><ul><ul><li>« Adresse email » : défaut </li></ul></ul><ul><ul><li>« Navigateur par défaut » : Si Firefox, aller chercher firefox.exe, sinon laisser explorer.exe </li></ul></ul><ul><ul><li>« Alerte du pare-feu » : débloquer Apache </li></ul></ul>
  9. 9. Installation des serveurs <ul><li>Tester l'installation </li></ul><ul><ul><li>Tapez « localhost » dans la Barre d'adresse de votre navigateur </li></ul></ul><ul><ul><li>La page d'accueil de WAMP doit s'afficher </li></ul></ul><ul><li>L'interface de WAMP : </li></ul><ul><ul><li>Sert à démarrer ou arrêter les serveurs </li></ul></ul><ul><ul><li>Réside ensuite dans la Zone de notification </li></ul></ul><ul><ul><li>Contient des raccourcis vers les outils d'administration : phpMyAdmin, sqlLiteManager </li></ul></ul><ul><ul><li>Permet également de configurer Apache et PHP </li></ul></ul>
  10. 10. Première page PHP
  11. 11. Première page PHP <ul><li>Arborescence des dossiers </li></ul><ul><ul><li>Les fichiers PHP doivent être visibles par Apache </li></ul></ul><ul><ul><li>Ils faut donc qu'ils soient dans le dossier WebRoot d'Apache (par défaut C:wampwww ) </li></ul></ul><ul><ul><li>Créez un dossier test dans le dossier www </li></ul></ul><ul><li>Premier fichier PHP </li></ul><ul><ul><li>Ouvrez une page HTML avec Notepad++ </li></ul></ul><ul><ul><li>Enregistrez-la dans www estindex.php </li></ul></ul>
  12. 12. Première page PHP <ul><li>Affichage de la page </li></ul><ul><ul><li>Ouvrez votre navigateur </li></ul></ul><ul><ul><li>Tapez l'adresse http:ocalhost estindex.php </li></ul></ul><ul><ul><li>La page HTML, servie par Apache, s'affiche </li></ul></ul>
  13. 13. Première page PHP <ul><li>Inclusion d'un code PHP </li></ul><ul><ul><li>Ouvrez le fichier www estindex.php avec Notepad++ </li></ul></ul><ul><ul><li>Rajouter dans le <body> la ligne : <p> Date : <?php echo date ( &quot;d-m-Y H:i:s&quot; ) ?> </p> </li></ul></ul><ul><ul><li>Sauvegarder la page </li></ul></ul><ul><li>Affichage </li></ul><ul><ul><li>Ouvrir le navigateur pour tester le résultat </li></ul></ul><ul><ul><li>La page doit comporter une ligne : Date : 14-11-2006 18:15:42 </li></ul></ul><ul><ul><li>Si on rafraîchit la page (F5), la ligne se met à jour </li></ul></ul>
  14. 14. Première page PHP <ul><li>Explication du fonctionnement : côté client </li></ul><ul><ul><li>Schéma d'une requête statique : </li></ul></ul>
  15. 15. Première page PHP <ul><li>Explication du fonctionnement : côté client </li></ul><ul><ul><li>Schéma d'une requête dynamique : </li></ul></ul>
  16. 16. Première page PHP <ul><li>Explication du fonctionnement : côté serveur </li></ul><ul><ul><li><p> Date : <?php echo date ( &quot;d-m-Y H:i:s&quot; ) ?> </p> </li></ul></ul><ul><ul><li>La fonction date() affiche la date actuelle </li></ul></ul><ul><ul><li>Le mot-clef echo sert à afficher le résultat </li></ul></ul>
  17. 17. Première page PHP <ul><li>Une autre fonction pratique : include() </li></ul><ul><ul><li>Include() permet d'insérer une page PHP dans une autre. </li></ul></ul><ul><ul><li>Utilisation : <?php include ( 'une_autre_page.php' ); ?> </li></ul></ul><ul><ul><li>On peut mettre du PHP dans la page incluse. </li></ul></ul><ul><ul><li>La page incluse est directement insérée dans le code : il ne faut pas y mettre des tags <html> ou <body> </li></ul></ul>
  18. 18. Première page PHP <ul><li>Include() </li></ul><ul><ul><li>Exemple d'utilisation : on peut insérer une page « menu.php » en haut de toutes les pages de son site. </li></ul></ul><ul><ul><li>Menu.php : <div class=''menu''> <ul> <li>Lorem</li> <li>Ipsum</li> </ul> </div> </li></ul></ul>
  19. 19. Structures du langage
  20. 20. Structure du langage <ul><li>Syntaxe : </li></ul><ul><ul><li>Syntaxe inspirée du C, comme C++, Java ou C# </li></ul></ul><ul><ul><li>Mais c'est un langage faiblement typé : les variables n'ont pas de type prédéfini, et s'adaptent au contexte </li></ul></ul><ul><li>Avantages : </li></ul><ul><ul><li>La syntaxe C est élégante et largement répandue </li></ul></ul><ul><ul><li>Grande flexibilité donnée par les types faibles </li></ul></ul>
  21. 21. Structure du langage <ul><li>Elements de syntaxe : </li></ul><ul><ul><li>Les lignes se terminent par un point-virgule . </li></ul></ul><ul><ul><li>Les commentaires peuvent s'écrire : <?php // Commentaire de type C /* Commentaire C++ */ # Commentaire Perl ?> </li></ul></ul><ul><ul><li>Les blocs sont délimités par des accolades . </li></ul></ul>
  22. 22. Structure du langage <ul><li>Déclarer une variable </li></ul><ul><ul><li>Il suffit de la nommer ou de l'utiliser : <?php $ma_variable; // Déclaration d'une variable $login = ''admin''; // Autre déclaration ?> </li></ul></ul><ul><ul><li>Les variables sont toutes préfixées du signe  «  $  » </li></ul></ul>
  23. 23. Structure du langage <ul><li>Types des variables : </li></ul><ul><ul><li>Il n'y a pas besoin de déclarer de type : <?php $answer = 42; // Integer $foo = ''bar''; // Chaîne de caractère $is_cool = true; // Booléen ?> </li></ul></ul>
  24. 24. Structure du langage <ul><li>Calculs : </li></ul><ul><ul><li><?php $number = 15; $id = '3'; echo $number * 3; // Affiche '45' echo ++$number; // Affiche '16' echo $id + 1; // Affiche '4' ?> </li></ul></ul>
  25. 25. Structure du langage <ul><li>Fonctions mathématiques : </li></ul><ul><ul><li><?php $angle = 45; echo 'Cos = ' . cos($angle); $a = 3; $b = -5; $c = 1; $x1 = -$b - sqrt( pow($b, 2) – 4 * $a * $c ) / (2*$a); echo 'Solution 1 = ' . $x1; ?> </li></ul></ul><ul><ul><li>Pas besoin d'include particulier pour utiliser ces fonctions </li></ul></ul>
  26. 26. Structure du langage <ul><li>Chaînes de caractères : </li></ul><ul><ul><li>Leur fonctionnement est intuitif : <?php $chaine1 = ''Bonjour ''; $nom = ''Marc''; echo $chaine1 . $nom; // Affiche ''Bonjour Marc'' $nom2 = $nom; // Pas besoin de strcpy() :p echo $nom2; // Affiche ''Marc'' ?> </li></ul></ul>
  27. 27. Structure du langage <ul><li>Chaînes de caractères : </li></ul><ul><ul><li>Les guillemets peuvent être simples ou doubles. </li></ul></ul><ul><ul><ul><li>Guillemets simples : aucune variable n'est remplacée, aucun caractère n'est échappé (plus rapide) </li></ul></ul></ul><ul><ul><ul><li>Guillemets doubles : les variables sont remplacées, les caractères échappés (plus lent) </li></ul></ul></ul><ul><ul><li><?php $nom = ''Ford Escort'' ; echo ''Bonjour, $nom !'' ; echo 'Bonjour, ' . $nom . ' !' ; echo 'Bonjour, $nom !' ; // Affiche ''Bonjour, $nom !'' ?> </li></ul></ul>
  28. 28. Structure du langage <ul><li>Structures conditionnelles et boucles </li></ul><ul><ul><li>Les structures conditionnelles (if, switch) et les boucles (for, while) fonctionnent de la même manière qu'en C </li></ul></ul>
  29. 29. Structure du langage <ul><li>Structures conditionnelles : if </li></ul><ul><ul><li><?php $age = 12; if($age < 10) { echo 'Tu es trop jeune pour entrer...'; } else if ($age >=10 && $age < 12) { echo 'Tu peux rentrer !'; } else { echo 'Tu es trop vieux pour rentrer...'; } ?> </li></ul></ul>
  30. 30. Structure du langage <ul><li>Structures conditionnelles : switch </li></ul><ul><ul><li><?php $nom = 'Chewbacca'; switch($nom) { case 'Dark Vador' : echo 'C'est un méchant'; break; case 'Chewbacca': echo 'C'est un gentil'; break; default: echo 'Je ne sais pas...'; break; } ?> </li></ul></ul>
  31. 31. Structure du langage <ul><li>Structures conditionnelles : for </li></ul><ul><ul><li><?php $a = 5; $b = 8; $result = 0; for($i = 0; $i < $b; $i++) { $result = $result + $a; } echo ''$a * $b = $result''; ?> </li></ul></ul>
  32. 32. Structure du langage <ul><li>Structures conditionnelles : while </li></ul><ul><ul><li><?php $a = 115; $log2 = 0; $tmp = $a; while($tmp > 2) { $tmp = $tmp / 2; $log2++; } echo ''Le log2 de $a est $log2.''; ?> </li></ul></ul>
  33. 33. Structure du langage <ul><li>Passage de variables : </li></ul><ul><ul><li>On peut passer des variables comme paramètres à une page PHP </li></ul></ul><ul><ul><li>Il suffit de les insérer dans l'adresse de la page </li></ul></ul><ul><ul><li>Les adresses sont alors de la forme : http://exemple.com/ma_page.php?variable=valeur </li></ul></ul><ul><li>Exemple : </li></ul><ul><ul><li>http://www.google.fr/search.php?q=recherche </li></ul></ul>
  34. 34. Structure du langage <ul><li>Comment récupérer les variables d'une Url ? </li></ul><ul><ul><li>Les variables d'une Url sont contenues dans un tableau nommé $_GET </li></ul></ul><ul><ul><li>On y accède par : $ma_variable = $_GET['ma_variable']; </li></ul></ul>
  35. 35. Structure du langage <ul><li>Exemple : </li></ul><ul><ul><li>Si on appelle une page par : index.php?nom=alfred&age=12 </li></ul></ul><ul><ul><li>On pourra afficher : <?php echo $_GET[ 'nom' ]; // Affiche ''Alfred'' echo $_GET[ 'age' ]; // Affiche ''12'' ?> </li></ul></ul>
  36. 36. Structure du langage - TD <ul><li>Sujet : </li></ul><ul><ul><li>Créer une page-maître, qui appelle toutes les pages-filles du site </li></ul></ul>TD 1 – Pages dynamiques
  37. 37. Structure du langage - TD <ul><li>Exemple : </li></ul><ul><ul><li>L'adresse de la page d'accueil est : index.php?page=accueil </li></ul></ul><ul><ul><li>L'adresse de la page de contacts est : index.php?page=contacts </li></ul></ul><ul><ul><li>L'adresse 'index.php' sans paramètres doit afficher l'accueil. </li></ul></ul>
  38. 38. Structure du langage - TD <ul><li>Avantages : </li></ul><ul><ul><li>Une seule page pour gérer les éléments communs (titre, menu) </li></ul></ul><ul><ul><li>Seul le contenu variable est à modifier </li></ul></ul><ul><li>Connaissances requises : </li></ul><ul><ul><li>Passer un paramètre à une page </li></ul></ul><ul><ul><li>Récupérer ces paramètres à l'aide de $_GET[] </li></ul></ul><ul><ul><li>Utiliser un switch() pour traiter le paramètre </li></ul></ul><ul><ul><li>Inclure la page-enfant à l'aide d'include() </li></ul></ul>
  39. 39. Tableaux Fonctions
  40. 40. Tableaux – fonctions <ul><li>Présentation des tableaux </li></ul><ul><ul><li>Les tableaux de PHP fonctionnent un peu comme en C </li></ul></ul><ul><ul><li>Ils sont cependant beaucoup plus souples </li></ul></ul>
  41. 41. Tableaux – fonctions <ul><li>Pourquoi utiliser des tableaux : </li></ul><ul><ul><li>Classement de données </li></ul></ul><ul><ul><li>Economie de variables </li></ul></ul><ul><ul><li>Récupération de résultats provenant d'une BDD </li></ul></ul><ul><ul><li>Facilité de manipulation </li></ul></ul>
  42. 42. Tableaux – fonctions <ul><li>Utilisation d'un tableau numéroté : </li></ul><ul><ul><li>Pour ajouter un élément, il suffit de préciser son numéro <?php $tableau = array(); $tableau[0] = 'Riemann'; $tableau[1] = 'Green'; $tableau[] = 'Lebesgue'; // Ajoute à la suite $tableau[5] = 'Schwartz'; echo $tableau[1]; // Affiche ''Green' ?> </li></ul></ul>
  43. 43. Tableaux – fonctions <ul><li>Utilisation d'un tableau numéroté : </li></ul><ul><ul><li>Pour remplir un tableau, on peut aussi utiliser la fonction array() <?php $tableau = array('Tintin', 'Haddock', 'Milou'); echo $tableau[1]; // Affiche ''Haddock'' ?> </li></ul></ul>
  44. 44. Tableaux – fonctions <ul><li>Taille des tableaux : </li></ul><ul><ul><li>La taille des tableaux est gérée automatiquement </li></ul></ul><ul><ul><li>On peut donc rajouter ou supprimer des éléments à volonté </li></ul></ul>
  45. 45. Tableaux – fonctions <ul><li>Tableaux associatifs : </li></ul><ul><li>Le tableau est indicé par une string, et pas par un n° </li></ul><ul><li><?php $pdg = array(); // Bonne pratique $pdg['Microsoft'] = 'Ballmer'; $pdg['Apple'] = 'Jobs'; $pdg[] = 'Stallman'; // $pdg[0] = 'Stallman echo $pdg['Apple']; // Affiche 'Jobs' ?> </li></ul>
  46. 46. Tableaux – fonctions <ul><li>Afficher un tableau : </li></ul><ul><li>« Echo » n'affiche que le type de l'objet </li></ul><ul><li>Il faut utiliser var_dump() pour déboguer </li></ul><ul><li><?php $test = array('Lorem', 'Ipsum'); echo $test; // Affiche 'Array' var_dump($test); // Affiche le contenu du tableau ?> </li></ul>
  47. 47. Tableaux – fonctions <ul><li>Parcourir un tableau : </li></ul><ul><li>Pour un affichage formaté , il faut parcourir le tableau </li></ul><ul><li>Pour les tableaux numérotés , on peut utiliser un for . </li></ul><ul><li><?php $membres = array('Frodon', 'Gandalf', 'Legolas'); for($i = 0; $i < count($membres); $i++) { echo 'Le membre ' . $i . ' est ' . $membres[$i] . '. '; } ?> </li></ul>
  48. 48. Tableaux – fonctions <ul><li>Parcourir un tableau : </li></ul><ul><li>Pour tous les tableaux, y compris associatifs, on utilise la structure foreach . </li></ul><ul><li>Elle permet de récupérer dans une boucle tous les éléments d'un tableau, un par un </li></ul><ul><li><?php // Syntaxe habituelle foreach($tableau as $value) { ... } // On peut aussi récupérer le nom de la clef : foreach($tableau as $key => $value) { ... } ?> </li></ul>
  49. 49. Tableaux – fonctions <ul><li>Parcourir un tableau : </li></ul><ul><li>Exemple de foreach : </li></ul><ul><li><?php $gourous = array( 'GPL' => 'Richard Stallman', 'Linux' => 'Linus Torvalds', 'Microsoft' => 'Bill Gates'); foreach($gourous as $key => $value) { echo ''Le gourou de $key est $value.''; } ?> </li></ul>
  50. 50. Tableaux – fonctions <ul><li>Foreach – nom des variables </li></ul><ul><li>On peut nommer $key et $value comme on veut </li></ul><ul><li>Cela permet souvent de gagner en lisibilité </li></ul><ul><li>Foreach – modification des données </li></ul><ul><li>Foreach fonctionne par copie des éléments du tableau </li></ul><ul><li>En conséquence, si l'on modifie $key ou $value dans le foreach , le tableau original n'est pas modifié. </li></ul>
  51. 51. Tableaux – fonctions <ul><li>Tableaux multidimensionnels </li></ul><ul><li>Il s'agit de tableaux contenant des tableaux </li></ul><ul><li>Ils proviennent habituellement d'une BDD </li></ul><ul><li>Exemple : <?php $tab = array('ligne1' => '', 'ligne2' => ''); $tab['ligne1'] = array('nom' => 'Henri', 'age' => 12); echo $tab['ligne1']['nom']; // Affiche 'Henri' var_dump($tab); // Affiche tout le tableau ?> </li></ul>
  52. 52. Tableaux – fonctions <ul><li>Exercice : </li></ul><ul><li>Réaliser un script qui affiche toutes les variables passées en paramètre de la page </li></ul><ul><li>Exemple : exercice.php?nom=moi&age=32 Doit afficher : Le paramètre 'nom' vaut 'moi'. Le paramètre 'age' vaut '32'. </li></ul><ul><li>Le script doit fonctionner pour n'importe quel paramètre ! </li></ul>
  53. 53. Tableaux – fonctions <ul><li>Introduction aux fonctions </li></ul><ul><ul><li>Les fonctions de PHP sont très semblables aux C </li></ul></ul><ul><ul><li>Cependant : </li></ul></ul><ul><ul><ul><li>Elles sont un peu plus souples </li></ul></ul></ul><ul><ul><ul><li>Elles ne manipulent pas des pointeurs, mais éventuellement des « références » </li></ul></ul></ul><ul><ul><ul><li>Elles peuvent renvoyer des tableaux </li></ul></ul></ul>
  54. 54. Tableaux – fonctions <ul><li>Les fonctions sont très pratiques </li></ul><ul><ul><li>Elles permettent de découper le programme en petits blocs réutilisables </li></ul></ul><ul><ul><li>Elles augmentent la modularité et la lisibilité du code </li></ul></ul><ul><li>Une fonction est une boîte noire </li></ul><ul><ul><li>Idéalement, sa sortie de dépend que de son entrée </li></ul></ul><ul><ul><li>Elle peut éventuellement modifier ses paramètres, s'ils sont passés par référence (~ pointeurs) </li></ul></ul>
  55. 55. Tableaux – fonctions <ul><li>Syntaxe générale </li></ul><ul><ul><li>La syntaxe générale d'une fonction est : <?php function nom_de_la_fonction( $param1 , $param2 ...) { // Du code } ?> </li></ul></ul>
  56. 56. Tableaux – fonctions <ul><li>Exemple de fonction </li></ul><ul><ul><li>Une fonction pour afficher le contenu d'un tableau : <?php function print_array( $array ) { echo 'Tableau :<br />'; foreach($array as $key => $value) { echo ''$key => $value <br />''; } } ?> </li></ul></ul>
  57. 57. Tableaux – fonctions <ul><li>Valeur de retour </li></ul><ul><ul><li>En PHP, on ne précise pas le type de valeur retournée </li></ul></ul><ul><ul><li>La fonction peut retourner (ou non) une valeur de n'importe quel type </li></ul></ul><ul><ul><li>Le mot-clef 'return' n'est pas obligatoire si la fonction ne renvoie rien </li></ul></ul>
  58. 58. Tableaux – fonctions <ul><li>Passage des arguments </li></ul><ul><ul><li>Par défaut, les paramètres (ou arguments) d'une fonction sont passés par valeur </li></ul></ul><ul><ul><li>La fonction travaille donc sur une copie du paramètre </li></ul></ul>
  59. 59. Tableaux – fonctions <ul><li>Passage des arguments </li></ul><ul><ul><li>Exemple de passage par valeur (comportement par défaut) : <?php function add($a, $b) { $a = $a + $b; return $a; } $a = 5; $b = 2; $somme = add($a, $b); echo $a; // Affiche '5' : $a n'est pas modifié ?> </li></ul></ul>
  60. 60. Tableaux – fonctions <ul><li>Passage des arguments </li></ul><ul><ul><li>On peut aussi passer les arguments par référence </li></ul></ul><ul><ul><li>Dans ce cas, on peut modifier les paramètres </li></ul></ul><ul><ul><li>Cette technique est similaire aux pointeurs du C, mais : </li></ul></ul><ul><ul><ul><li>Beaucoup plus intuitive </li></ul></ul></ul><ul><ul><ul><li>Sans risque de fausse manipulation </li></ul></ul></ul><ul><ul><li>Le passage par référence se fait en préfixant le paramètre d'une perluète ' & ' </li></ul></ul>
  61. 61. Tableaux – fonctions <ul><li>Passage des arguments </li></ul><ul><ul><li>Exemple de passage par référence : <?php function add(&$a, $b) { $a = $a + $b; } $a = 5; $b = 2; $somme = add($a, $b); echo $a; // Affiche '7' : $a a été modifié ?> </li></ul></ul>
  62. 62. Tableaux – fonctions <ul><li>Utilité du passage par référence : </li></ul><ul><ul><li>Lorsque l'on veut retourner plusieurs valeurs (quoique dans ce cas l'on utilise plutôt des tableaux) </li></ul></ul><ul><ul><li>Lorsque l'on veut manipuler directement une variable : <?php function check_empty( & $array ) { if(!isset($array) || empty($array)) { $array = array('default value'); } } ?> </li></ul></ul>
  63. 63. Tableaux – fonctions <ul><li>Commentez toujours vos fonctions ! </li></ul><ul><ul><li>Commenter une fonction sert à : </li></ul></ul><ul><ul><ul><li>Avoir les idées plus claires sur sa conception </li></ul></ul></ul><ul><ul><ul><li>Rendre le code réutilisable facilement </li></ul></ul></ul><ul><ul><ul><li>Faciliter la lecture de votre code par d'autres programmeurs </li></ul></ul></ul><ul><ul><li>Indiquez avant chaque fonction : </li></ul></ul><ul><ul><ul><li>Son utilité </li></ul></ul></ul><ul><ul><ul><li>Ses paramètres </li></ul></ul></ul><ul><ul><ul><li>Ce qu'elle renvoie </li></ul></ul></ul>
  64. 64. Tableaux – fonctions <ul><li>PHPDoc </li></ul><ul><ul><li>La syntaxe PHPDoc est une convention pour commenter les fonctions </li></ul></ul><ul><ul><li>Elle permet également de générer la documentation de votre code automatiquement </li></ul></ul><ul><ul><li>Elle n'influence bien sûr pas l'exécution du code PHP </li></ul></ul>
  65. 65. Tableaux – fonctions <ul><li>PHPDoc </li></ul><ul><ul><li>Exemple de fonction commentée en style PHPDoc : <?php /** Affiche le contenu d'un tableau * * @param array $array Le tableau à afficher * @return bool False si $array n'est pas un tableau, true sinon. */ function print_array( $array ) {...} ?> </li></ul></ul>
  66. 66. Tableaux – fonctions <ul><li>PHPDoc </li></ul><ul><ul><li>Exemple de fonction commentée en style PHPDoc : <?php /** Affiche le contenu d'un tableau * * @param array $array Le tableau à afficher * @return bool False si $array n'est pas un tableau, true sinon. */ function print_array( $array ) {...} ?> </li></ul></ul>
  67. 67. Tableaux – fonctions <ul><li>Exercice : </li></ul><ul><ul><li>Afficher le contenu d'un tableau PHP bidimensionnel dans une <table> HTML </li></ul></ul><ul><ul><li>Le script doit permettre d'afficher plusieurs lignes d'un tableau de plusieurs colonnes </li></ul></ul><ul><ul><li>Connaissances requises : </li></ul></ul><ul><ul><ul><li>Créer un tableau bidimensionnel </li></ul></ul></ul><ul><ul><ul><li>Parcourir le tableau avec foreach </li></ul></ul></ul><ul><ul><ul><li>Générer le code HTML correspondant à la volée </li></ul></ul></ul>
  68. 68. Bases de données 1
  69. 69. Bases de données 1 <ul><li>Utilité des BDD </li></ul><ul><ul><li>Elles permettent de... classer des données </li></ul></ul><ul><ul><li>Mais surtout de rechercher selon des critères précis </li></ul></ul><ul><ul><li>Elles peuvent également être mises en relation </li></ul></ul>
  70. 70. Bases de données 1 <ul><li>PHP et les BDD </li></ul><ul><ul><li>PHP comporte de nombreuses fonctions pour communiquer avec une BDD </li></ul></ul><ul><li>BDD communes </li></ul><ul><ul><li>Une des plus connues est MySQL (libre et gratuit) </li></ul></ul><ul><ul><li>Citons aussi Oracle, SQL Server, Firebird... </li></ul></ul>
  71. 71. Bases de données 1 <ul><li>Communiquer avec une BDD </li></ul><ul><ul><li>Une BDD reçoit des requêtes écrites en langage SQL </li></ul></ul><ul><ul><li>SQL est proche du langage naturel </li></ul></ul><ul><li>Administrer une BDD </li></ul><ul><ul><li>On peut administrer une BDD uniquement en envoyant des commandes (comme un FTP sous Linux) </li></ul></ul><ul><ul><li>Cependant des interfaces rendent cette tâche plus intuitive (comme phpMyAdmin) </li></ul></ul>
  72. 72. Bases de données 1 <ul><li>PhpMyAdmin </li></ul><ul><ul><li>Application écrite en PHP </li></ul></ul><ul><ul><li>Permet d'administrer facilement une base MySQL </li></ul></ul><ul><li>Accès à PhpMyAdmin </li></ul><ul><ul><li>Sous easyPHP, taper : http://localhost/mysql/ </li></ul></ul>
  73. 73. Bases de données 1 <ul><li>Vocabulaire : </li></ul><ul><ul><li>Base : « armoire » contenant des tiroirs (les tables) </li></ul></ul><ul><ul><li>Table : Casier contenant des informations classées – le nom et l'age des visiteurs, par exemple </li></ul></ul><ul><ul><li>Champs : colonnes d'une table </li></ul></ul><ul><ul><li>Entrées : lignes d'une table </li></ul></ul>
  74. 74. Bases de données 1 <ul><li>Créons une nouvelle table dans PhpMyAdmin : </li></ul><ul><ul><li>Créer une base nommée 'test' </li></ul></ul><ul><ul><li>Créer une nouvelle table dans cette base, nommée 'users', avec 3 champs </li></ul></ul><ul><ul><li>Créer les trois champs : nom, âge, courriel </li></ul></ul><ul><ul><li>Remplir cette table avec deux ou trois entrées </li></ul></ul>
  75. 75. Bases de données 1 <ul><li>Lire des données avec PHP </li></ul><ul><ul><li>Cela ressemble à peu à la communication avec un FTP </li></ul></ul><ul><ul><li>Il faut d'abord se connecter, puis lancer sa requête, et récupérer la réponse de MySQL </li></ul></ul>
  76. 76. Bases de données 1 <ul><li>Etablir la connexion </li></ul><ul><ul><li>Avant de communiquer avec MySQL, il faut « attirer son attention » </li></ul></ul><ul><ul><li>Nous allons démarrer une conversation avec MySQL </li></ul></ul><ul><ul><li>On utilise pour cela la fonction mysql_connect() </li></ul></ul><ul><li>mysql_connect() </li></ul><ul><ul><li>La fonction mysql_connect() s'utilise comme ceci : mysql_connect($serveur, $login, $mot_de_passe); </li></ul></ul>
  77. 77. Bases de données 1 <ul><li>Exemple : </li></ul><ul><ul><li>Voici comment vous connecter à votre base MySQL : <?php mysql_connect('localhost', 'root', ''); ?> </li></ul></ul><ul><ul><li>Explications : </li></ul></ul><ul><ul><ul><li>'localhost' est le nom du serveur auquel on se connecte – ici, le serveur SQL est sur notre propre machine. </li></ul></ul></ul><ul><ul><ul><li>'root' est le nom de l'utilisateur principal de MySQL </li></ul></ul></ul><ul><ul><ul><li>'' : par défaut, l'utilisateur root n'a pas de mot de passe </li></ul></ul></ul>
  78. 78. Bases de données 1 <ul><li>Que faire une fois connecté ? </li></ul><ul><ul><li>D'abord, sélectionner la base que l'on veut utiliser </li></ul></ul><ul><ul><li>On se sert de la fonction mysql_select_db() mysql_select_db($database); </li></ul></ul>
  79. 79. Bases de données 1 <ul><li>Que faire ensuite ? </li></ul><ul><ul><li>Une fois que l'on a plus besoin de parler à MySQL, il faut terminer la conversation </li></ul></ul><ul><ul><li>Si on ne le fait pas, MySQL finit par la terminer lui-même, mais cela prend du temps inutile </li></ul></ul><ul><ul><li>On utilise la fonction mysql_close() mysql_close() </li></ul></ul>
  80. 80. Bases de données 1 <ul><li>Exemple complet de connexion : </li></ul><ul><ul><li><?php mysql_connect('localhost', 'root', ''); mysql_select_db('test'); // ici, on peut communiquer avec la BDD mysql_close(); ?> </li></ul></ul><ul><ul><li>Si ce code n'affiche rien, tout s'est bien passé </li></ul></ul>
  81. 81. Bases de données 1 <ul><li>Interroger la BDD </li></ul><ul><ul><li>On « parle » à MySQL avec la fonction mysql_query() mysql_query($requete) </li></ul></ul><ul><ul><li>$requete est une chaîne de caractère contenant une commande SQL </li></ul></ul>
  82. 82. Bases de données 1 <ul><li>Le langage SQL </li></ul><ul><ul><li>C'est une façon standardisée de communiquer avec les Bases de Données </li></ul></ul><ul><ul><li>Exemple de requête SQL : SELECT * FROM users </li></ul></ul><ul><ul><ul><li>SELECT : la commande à exécuter (une sélection) </li></ul></ul></ul><ul><ul><ul><li>* : les champs que l'on veut récupérer (tous) </li></ul></ul></ul><ul><ul><ul><li>FROM table : le nom de la table dans laquelle on veut chercher </li></ul></ul></ul>
  83. 83. Bases de données 1 <ul><li>Exemple en PHP </li></ul><ul><ul><li>Voici comment exécuter la requête précédente : <?php // Insérer le code de connexion à la BDD $reponse = mysql_query('SELECT * FROM users'); ?> </li></ul></ul>
  84. 84. Bases de données 1 <ul><li>Comment traiter les réponses ? </li></ul><ul><ul><li>La réponse renvoyée par MySQL est un recordset </li></ul></ul><ul><ul><li>Un recordset est un ensemble de valeurs brutes </li></ul></ul><ul><ul><li>On ne peut pas le manipuler directement </li></ul></ul><ul><ul><li>Il faut donc l'interpréter </li></ul></ul>
  85. 85. Bases de données 1 <ul><li>Transformer la requête en tableau </li></ul><ul><ul><li>mysql_fetch_array() transforme chaque ligne du recordset en un tableau associatif </li></ul></ul><ul><ul><li>Exemple : <?php $ligne1 = mysql_fetch_array($reponse); echo $ligne1['nom']; // Affiche le nom de la 1ère // ligne ?> </li></ul></ul>
  86. 86. Bases de données 1 <ul><li>Boucle sur les résultats </li></ul><ul><ul><li>mysql_fetch_array() renvoie chaque ligne l'une après l'autre </li></ul></ul><ul><ul><li>Lorsqu'il n'y a plus de ligne, elle renvoie false </li></ul></ul><ul><ul><li>On peut donc l'utiliser dans une boucle while() facilement </li></ul></ul>
  87. 87. Bases de données 1 <ul><li>Exemple de boucle sur les données : </li></ul><ul><ul><li><?php $ligne = mysql_fetch_array($reponse); while($ligne != false) { echo $ligne['nom']; $ligne = mysql_fetch_array($reponse); } ?> </li></ul></ul>
  88. 88. Bases de données 1 <ul><li>Autre exemple plus concis : </li></ul><ul><ul><li><?php while($ligne = mysql_fetch_array($reponse)) { echo $ligne['nom']; } ?> </li></ul></ul>
  89. 89. Bases de données 1 <ul><li>Exercice : </li></ul><ul><ul><li>Récupérer toutes les données de la table 'users' </li></ul></ul><ul><ul><li>Les afficher sous forme d'un tableau Html </li></ul></ul>
  90. 90. Bases de données 1 <ul><li>Sélectionner des données </li></ul><ul><ul><li>SQL permet de ne sélectionner que les données dont on a besoin, ou de les classer </li></ul></ul><ul><ul><li>Sélection : WHERE, FROM, LIMIT </li></ul></ul><ul><ul><li>Classement : ORDER BY </li></ul></ul>
  91. 91. Bases de données 1 <ul><li>La clause WHERE </li></ul><ul><ul><li>Utilisée tout le temps </li></ul></ul><ul><ul><li>Elle restreint les lignes à la condition donnée </li></ul></ul><ul><ul><li>Exemple : SELECT * FROM users WHERE age > 16 SELECT * FROM users WHERE nom='Berthe' </li></ul></ul><ul><ul><li>Note : il se peut qu'une requête ne renvoie aucune ligne, si la condition n'est remplie par aucune des entrées </li></ul></ul>
  92. 92. Bases de données 1 <ul><li>La clause LIMIT </li></ul><ul><ul><li>Permet de restreindre le nombre de données renvoyées </li></ul></ul><ul><ul><li>Peu standard, mais souvent utilisée avec MySQL </li></ul></ul><ul><ul><li>Exemple : SELECT * FROM users LIMIT 20 SELECT * FROM users LIMIT 5, 15 </li></ul></ul><ul><ul><li>Le premier exemple renvoie les 20 premières entrées </li></ul></ul><ul><ul><li>Le second exemple renvoie les entrées 5 à 15 </li></ul></ul>
  93. 93. Bases de données 1 <ul><li>La clause ORDER BY </li></ul><ul><ul><li>Permet de grouper les données reçues </li></ul></ul><ul><ul><li>On peut éventuellement spécifier un ordre de tri (ascendant ou descendant) </li></ul></ul><ul><ul><li>Exemples : SELECT * FROM users ORDER BY age SELECT * FROM users ORDER BY name ASC </li></ul></ul><ul><ul><li>La première requête groupe les résultats par age </li></ul></ul><ul><ul><li>La seconde classe les résultats par ordre alphabétique </li></ul></ul>
  94. 94. Bases de données 1 <ul><li>Regroupement et combinaisons </li></ul><ul><ul><li>On peut bien sûr combiner toutes ces clauses </li></ul></ul><ul><ul><li>Exemple : SELECT * FROM users WHERE age > 16 AND prenom = 'Jules' ORDER BY nom ASC LIMIT 20 </li></ul></ul>
  95. 95. Bases de données 2 Formulaires
  96. 96. Bases de données 2 Gestion des erreurs CRUD
  97. 97. Bases de données 1 <ul><li>Gestion des erreurs </li></ul><ul><ul><li>Lorsque une requête est mal formée ou échoue, MySQL renvoie un message d'erreur </li></ul></ul><ul><ul><li>On peut y accéder par la fonction mysql_error() </li></ul></ul><ul><ul><li>mysql_errror() renvoie le dernier message d'erreur généré par MySQL </li></ul></ul>
  98. 98. Bases de données 2 - Formulaires <ul><li>Gestion des erreurs </li></ul><ul><ul><li>Exemple d'utilisation : <?php $sql = 'INSERT bad_data'; mysql_query($sql) or die(mysql_error()); ?> </li></ul></ul>
  99. 99. Bases de données 2 - Formulaires <ul><li>Modification des données </li></ul><ul><ul><li>Les opérations les plus fréquentes sur les BDD sont résumées par l'acronyme CRUD </li></ul></ul><ul><ul><ul><li>Create </li></ul></ul></ul><ul><ul><ul><li>Retrieve </li></ul></ul></ul><ul><ul><ul><li>Update </li></ul></ul></ul><ul><ul><ul><li>Delete </li></ul></ul></ul><ul><ul><li>Certains frameworks pré-implémentent ces opérations </li></ul></ul><ul><ul><li>Voyons comment les réaliser avec des requêtes SQL </li></ul></ul>
  100. 100. Bases de données 2 - Formulaires <ul><li>Create : Insertion dans une base de données </li></ul><ul><ul><li>Pour ajouter une entrée dans une BDD, on utilise la requête INSERT </li></ul></ul><ul><ul><li>INSERT crée une nouvelle entrée à partir de rien </li></ul></ul><ul><ul><li>Structure : INSERT INTO table(liste_des_champs) VALUES(liste_des_valeurs) </li></ul></ul><ul><ul><li>La liste des champs est optionnelle </li></ul></ul>
  101. 101. Bases de données 2 - Formulaires <ul><li>Insertion dans une base de données </li></ul><ul><ul><li>Exemple d'insertion : < ?php $sql = ''INSERT INTO users(prenom, age) VALUES ('Paul', 51) ''; mysql_query($sql) or die(mysql_error()); ?> </li></ul></ul>
  102. 102. Bases de données 2 - Formulaires <ul><li>Update : Mise à jour </li></ul><ul><ul><li>Pour mettre à jour une entrée existante, on utilise la commande UPDATE </li></ul></ul><ul><ul><li>UPDATE table SET field = value WHERE condition </li></ul></ul>
  103. 103. Bases de données 2 - Formulaires <ul><li>Mise à jour </li></ul><ul><ul><li>Exemple : on veut changer l'âge d'un utilisateur <?php $sql = '' UPDATE users SET age = 21 WHERE name = 'Paul' ''; mysql_query($sql) or die(mysql_error()); ?> </li></ul></ul>
  104. 104. Bases de données 2 - Formulaires <ul><li>Delete : Supression </li></ul><ul><ul><li>Pour supprimer une entrée, on utilise la commande DELETE </li></ul></ul><ul><ul><li>DELETE FROM table WHERE condition </li></ul></ul>
  105. 105. Bases de données 2 - Formulaires <ul><li>Suppression </li></ul><ul><ul><li>Exemple : on veut supprimer des utilisateurs <?php $sql = '' DELETE FROM users WHERE name = 'Paul' ''; mysql_query($sql) or die(mysql_error()); ?> </li></ul></ul><ul><ul><li>Autre exemple : $sql = '' DELETE FROM users WHERE age < 16 '' </li></ul></ul>
  106. 106. Bases de données 2 - Formulaires <ul><li>Suppression </li></ul><ul><ul><li>Exemple : on veut supprimer des utilisateurs <?php $sql = '' DELETE FROM users WHERE name = 'Paul' ''; mysql_query($sql) or die(mysql_error()); ?> </li></ul></ul><ul><ul><li>Autre exemple : $sql = '' DELETE FROM users WHERE age < 16 '' </li></ul></ul>
  107. 107. Formulaires
  108. 108. Bases de données 2 - Formulaires <ul><li>Pourquoi utiliser des formulaires ? </li></ul><ul><ul><li>On a vu comment passer des infos à une page PHP, par la méthode GET (variables dans l'Url) </li></ul></ul><ul><ul><li>Ce n'est pas très ergonomique... </li></ul></ul><ul><ul><li>Les formulaires sont user-friendly </li></ul></ul><ul><li>Les formulaires permettent : </li></ul><ul><ul><li>De rentrer des données </li></ul></ul><ul><ul><li>De les envoyer au serveur </li></ul></ul><ul><ul><li>D'afficher des contrôles : zones de textes, menus déroulants, boutons, etc. </li></ul></ul>
  109. 109. Bases de données 2 - Formulaires <ul><li>Méthode de conception </li></ul><ul><ul><li>Les formulaires sont conçus en XHTML </li></ul></ul><ul><ul><li>Les données sont récupérées et interprétées par PHP </li></ul></ul>
  110. 110. Bases de données 2 - Formulaires <ul><li>XHTML – Gabarit de formulaire </li></ul><ul><ul><li>Formulaire = contrôles dans une balise <form> </li></ul></ul><ul><ul><li>Exemple : <form method=''post'' action=''save.php''> <!-- Contrôles du formulaire --> </form> </li></ul></ul><ul><ul><li>Method : type de transmission des données </li></ul></ul><ul><ul><ul><li>Post : passage par paramètre invisible </li></ul></ul></ul><ul><ul><ul><li>Get : passage par l'Url (déconseillé) </li></ul></ul></ul><ul><ul><li>Action : fichier cible du formulaire </li></ul></ul>
  111. 111. Bases de données 2 - Formulaires <ul><li>Contrôles communs </li></ul><ul><ul><li><input type=''text'' /> ligne de texte (une seule ligne) </li></ul></ul><ul><ul><li><textarea> zone de texte (multilignes) </li></ul></ul><ul><ul><li><input type=''submit'' /> bouton de validation </li></ul></ul><ul><ul><li><select> menu déroulant </li></ul></ul><ul><li>Contrôles de mise en forme </li></ul><ul><ul><li><fieldset> groupe de contrôles </li></ul></ul><ul><ul><li><legend> titre du fieldset </li></ul></ul>
  112. 112. Bases de données 2 - Formulaires <ul><li>Exemple de formulaire : <form method=''post'' action=''form.php''> <input type=''text'' name=''nom'' value='''' /> <input type=''text'' name=''age'' value='''' /> <input type=''submit' value=''Envoyer'' /> </form> </li></ul>
  113. 113. Bases de données 2 - Formulaires <ul><li>PHP – traitement des données </li></ul><ul><ul><li>Les données envoyées par un formulaire sont contenues dans le tableau $_POST </li></ul></ul><ul><ul><li>$_POST s'utilise de la même façon que $_GET </li></ul></ul><ul><ul><li>Si $_POST est vide, le formulaire n'a pas été envoyé </li></ul></ul>
  114. 114. Bases de données 2 - Formulaires <ul><li>Méthode classique de traitement des données </li></ul><ul><ul><li>On regarde si $_POST contient des données </li></ul></ul><ul><ul><li>Si oui, on traite les données (affichage, enregistrement...) </li></ul></ul><ul><ul><li>Si non, on affiche le formulaire </li></ul></ul>
  115. 115. Bases de données 2 - Formulaires <ul><li>Exemple de traitement des données </li></ul><ul><ul><li><?php if ( !empty($_POST) ) { echo $_POST['nom']; // Traiter les données echo 'Données traitées correctement !'; } else { ?> <form method=''post'' action='''''> <!-- Contrôles du formulaire --> </form> <?php } ?> </li></ul></ul>
  116. 116. Bases de données 2 - Formulaires <ul><li>Exercice : enregistrer un nom dans la BDD </li></ul><ul><ul><li>Créer un formulaire permettant d'ajouter un utilisateur dans la BDD </li></ul></ul><ul><li>Méthode </li></ul><ul><ul><li>Créer une page PHP </li></ul></ul><ul><ul><li>Si il y a des données POSTées, les insérer dans la BDD, avec une requête SQL ''INSERT'' </li></ul></ul><ul><ul><li>Sinon, afficher le formulaire </li></ul></ul>
  117. 117. Bases de données 2 - Formulaires <ul><li>TP : Réalisation </li></ul><ul><ul><li>Quatre pages PHP principales : index.php, add.php, edit.php, delete.php </li></ul></ul><ul><ul><li>Un fichier de connexion à la BDD, bdd.php, inclus au début de toutes les pages principales </li></ul></ul><ul><ul><li>Vous êtes libres du reste :) </li></ul></ul>
  118. 118. Sessions Sécurité Mise en ligne
  119. 119. Sessions
  120. 120. Sécurité – mise en ligne <ul><li>Sessions </li></ul><ul><ul><li>Permettent de conserver des données entre les pages </li></ul></ul><ul><ul><li>Gérés automatiquement par PHP </li></ul></ul>
  121. 121. Sécurité – mise en ligne <ul><li>Utilisation des sessions </li></ul><ul><ul><li>Initialiser avec session_start() </li></ul></ul><ul><ul><li>Utiliser le tableau $_SESSION </li></ul></ul>
  122. 122. Sécurité
  123. 123. Sécurité – mise en ligne <ul><li>Sécurité </li></ul><ul><ul><li>La question de la sécurité est primordiale </li></ul></ul><ul><ul><li>Dès que l'on interagit avec l'extérieur, on s'expose à des problèmes de sécurité : </li></ul></ul><ul><ul><ul><li>Exécution de requêtes SQL malicieuses </li></ul></ul></ul><ul><ul><ul><li>Vol de données </li></ul></ul></ul><ul><ul><ul><li>Exécutions de commandes malicieuses sur le serveur </li></ul></ul></ul><ul><ul><ul><li>Vol d'identifiants (login/mot de passe) </li></ul></ul></ul><ul><ul><ul><li>Accès frauduleux au site </li></ul></ul></ul>
  124. 124. Sécurité – mise en ligne <ul><li>Principe fondamental : </li></ul><ul><ul><li>NE JAMAIS FAIRE CONFIANCE ! </li></ul></ul><ul><li>Il faut toujours vérifier les données provenant de l'extérieur </li></ul>
  125. 125. Sécurité – mise en ligne <ul><li>Principaux vecteurs d'attaques : </li></ul><ul><ul><li>Injections de script </li></ul></ul><ul><ul><li>Injections SQL </li></ul></ul><ul><ul><li>Injection de HTML </li></ul></ul><ul><ul><li>Cross-Site Scripting (XSS) </li></ul></ul>
  126. 126. Sécurité – mise en ligne <ul><li>Injection de script : </li></ul><ul><ul><li>Tentative d'injecter des variables (par l'Url : méthode GET) </li></ul></ul><ul><ul><li>Tentative d'exécuter des scripts sur le serveur (faille d'include) </li></ul></ul><ul><li>Pour se protéger : </li></ul><ul><ul><li>Toujours initialiser les variables utilisées </li></ul></ul><ul><ul><li>Vérifier les variables avant de faire des include </li></ul></ul>
  127. 127. Sécurité – mise en ligne <ul><li>Injection SQL </li></ul><ul><ul><li>Tentative d'injecter des bouts de requête SQL </li></ul></ul><ul><ul><li>On peut virtuellement exécuter n'importe quelle requête </li></ul></ul><ul><li>Exemple : </li></ul><ul><ul><li>SELECT * FROM users WHERE login = '$name' </li></ul></ul><ul><ul><li>Si $name vaut : ' OR '1' = '1 Tout nom d'utilisateur renverra une réponse valide. </li></ul></ul><ul><li>On pourrait ainsi récupérer des mots de passe, ou même effacer la base de données : '; DELETE FROM users WHERE '1' = '1 </li></ul>
  128. 128. Sécurité – mise en ligne <ul><li>Injection SQL : pour se protéger : </li></ul><ul><ul><li>Utiliser mysql_real_escape_string() </li></ul></ul><ul><ul><li>Cette fonction échappe les guillemets malicieux : elle transforme les ' en ' </li></ul></ul><ul><li>Attention à magic_quotes_gpc </li></ul><ul><ul><li>Option de php.ini permettant d'échapper automatiquement les chaînes </li></ul></ul><ul><ul><li>Si elle est activée, il ne faut pas échapper une seconde fois la chaîne ! </li></ul></ul><ul><ul><li>On utilise alors stripslashes() avant mysql_real_escape_string() </li></ul></ul>
  129. 129. Sécurité – mise en ligne <ul><li>Injection HTML </li></ul><ul><ul><li>Si l'utilisateur peut rentrer du texte affiché ensuite sur une page, il pourrait y mettre de l'Html </li></ul></ul><ul><li>Exemple : </li></ul><ul><ul><li>Dans une news, on pourrait insérer : Voici ma news <!-- </li></ul></ul><ul><ul><li>Le début de commentaire HTML briserait la maquette de la page lors de l'affichage </li></ul></ul><ul><ul><li>On pourrait aussi insérer du code Javascript malicieux </li></ul></ul>
  130. 130. Sécurité – mise en ligne <ul><li>Injection HTML : pour se protéger : </li></ul><ul><ul><li>Utiliser la fonction htmlentities() avant d'afficher du texte </li></ul></ul><ul><ul><li>Elle transforme les balises Html en texte affichable </li></ul></ul><ul><ul><li>Le Html est alors affiché comme du texte brut </li></ul></ul>
  131. 131. Sécurité – mise en ligne <ul><li>Cross-Site Scripting (XSS) </li></ul><ul><ul><li>Injection de Javascript renvoyant sur une autre page </li></ul></ul><ul><ul><li>Le Javascript peut voler des cookies ou des mots de passe, et les envoyer à une page Web distante </li></ul></ul>
  132. 132. Sécurité – mise en ligne <ul><li>XSS - Exemple : </li></ul><ul><ul><li>On appelle la page : add.php?nom= ''/><script>window.location='hack.php'</script><br &age=valeur_invalide </li></ul></ul><ul><ul><li>Cette page pourrait afficher un message d'erreur et le formulaire prérempli : <input name=''nom'' value=''Nom'' /> deviendrait alors : <input name=''nom'' value='' '' /> <script>....</script> <br /> </li></ul></ul>
  133. 133. Sécurité – mise en ligne <ul><li>XSS – Protection : </li></ul><ul><ul><li>Vérifier que l'on affiche jamais de variable POST ou GET sans vérification préalable </li></ul></ul>
  134. 134. Mise en ligne
  135. 135. Sécurité – mise en ligne <ul><li>Comment mettre en ligne un site PHP ? </li></ul><ul><ul><li>Il faut s'assurer que l'hébergeur dispose de PHP et d'une base MySQL (ce qui est fréquent) </li></ul></ul><ul><ul><li>Vérifier la version de PHP </li></ul></ul><ul><ul><ul><li>PHP4 est normalement compatible avec PHP5 </li></ul></ul></ul><ul><ul><ul><li>PHP5 n'est pas compatible avec PHP4 </li></ul></ul></ul><ul><ul><li>Vérifier dans la doc que les fonctions qu'on utilise sont compatibles avec la version de PHP du serveur </li></ul></ul><ul><ul><li>Vérifier les variables de configuration de PHP </li></ul></ul>
  136. 136. Sécurité – mise en ligne <ul><li>Variables de configuration </li></ul><ul><ul><li>PHP peut être configuré à l'aide du fichier php.ini </li></ul></ul><ul><ul><li>Il faut coder en gardant à l'idée que la configuration du serveur peut être différente </li></ul></ul><ul><li>Exemple : </li></ul><ul><ul><li>magic_quotes_gpc (souvent à On) </li></ul></ul><ul><ul><ul><li>Echappe automatiquement les chaînes </li></ul></ul></ul><ul><ul><li>short_tags (par défaut à Off) </li></ul></ul><ul><ul><ul><li>Autorise <? ?> au lieu de <?php ?> </li></ul></ul></ul><ul><ul><li>register_globals (souvent à Off) </li></ul></ul><ul><ul><ul><li>Place $_POST['clefs'] dans $clefs - dangereux </li></ul></ul></ul>
  137. 137. Sécurité – mise en ligne <ul><li>Déploiement </li></ul><ul><ul><li>Le déploiement est souvent source de problèmes </li></ul></ul><ul><ul><li>Si possible, tester au fur et à mesure que l'on code </li></ul></ul><ul><ul><li>Prévoir du temps pour le déploiement </li></ul></ul>
  138. 138. Conclusion
  139. 139. Sécurité – mise en ligne <ul><li>À découvrir </li></ul><ul><ul><li>Les Sessions en PHP </li></ul></ul><ul><ul><li>Les systèmes d'authentification (login) </li></ul></ul><ul><ul><li>Le PHP Objet </li></ul></ul><ul><ul><li>Les fonctionnalités de PHP5 </li></ul></ul><ul><ul><li>Interactions AJAX/PHP </li></ul></ul><ul><li>Les Frameworks </li></ul><ul><ul><li>Comment développer rapidement </li></ul></ul><ul><ul><li>Automatiser les tâches répétitives (comme les CRUD) </li></ul></ul><ul><ul><li>Formation aux Frameworks et PHP avancé en février </li></ul></ul>
  140. 140. Sécurité – mise en ligne <ul><li>Mobitrok </li></ul><ul><ul><li>Intégrer le PHP au design </li></ul></ul><ul><ul><li>Pensez à concevoir un peu l'architecture avant </li></ul></ul><ul><ul><li>Rendu pour le 9 janvier (fin des vacances) </li></ul></ul><ul><ul><li>Résultats annoncés fin janvier </li></ul></ul>

×