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

Formation PHP

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