M3202 — CM #2

Développement web S3


Introduction

Brainstorming

  1. À quoi sert PHP ?
  2. À quoi sert une base de données ?

Site web statique / dynamique

Un site web peut être :

statique
codé avec HTML et CSS, modifié seulement par le webmaster
dynamique
avec une partie back-end, généré par le serveur, il interagit avec les utilisateurs

Un site dynamique utilise un langage de programmation (PHP) et un SGBD (MySQL).

Quand on visite une page web avec PHP, le serveur interprète le code PHP, génère le code HTML en utilisant (souvent) des données issues d'une base de données, et l'envoie au client.

Le client ne voit jamais le code PHP ni la base de données.

Programmer en PHP

Pour construire un site web dynamique, on a besoin d'Apache (serveur web qui délivre les pages web), PHP et MySQL.

Il suffit d'installer WAMP (Windows), MAMP (MAC) ou XAMPP (Windows, Mac, Linux).

Pour programmer en PHP, il faut changer quelques réglages.

Le fichier de configuration de PHP est php.ini. On trouve son adresse dans la page phpinfo.php.

Dans php.ini, il faut modifier les lignes avec error_reporting

error_reporting = E_ALL

et display_errors

display_errors = On

et redémarrer le serveur.

Le langage PHP

Un fichier contenant du code PHP a l'extension .php.

On écrit le code PHP entre deux balises PHP : <?php et ?> :

<?php
  echo "Hello World"; // afficher le texte "Hello World"
?>

Chaque instruction (ligne de code) finit avec un point-virgule (;).

La fonction echo affiche une chaîne de caractères (un texte).

Les commentaires sont mono-lignes (//) ou multi-lignes (/* */).

<?php
  // Un commentaire sur une ligne

  /* Un commentaire
     sur plusieurs lignes */
?>

Variables

Une variable est une unité d'information stockée en mémoire temporairement, et pas sur le disque dur.

Une variable a un nom et une valeur. Un nom de variable commence par le symbole dollar ($).

<?php
  $mot_de_passe = 'jia7syrcjia7'; // nom : $mot_de_passe, valeur : jia7syrcjia7
?>

Il y a plusieurs types de variables :

  • chaînes de caractères (strings) : c'est du texte
  • nombres entiers (int)
  • nombres décimaux (float)
  • booléens (bool) : avec deux valeurs possibles, true et false)
  • rien (NULL), l'absence de type

Le type d'une variable est défini par sa valeur.

Les chaînes de caractères

On écrit une chaîne de caractères entre guillemets simples (') ou doubles (").

Avec les guillemets simples, on concatène (assemble) plusieurs strings avec un point (.)

<?php
  $age_du_visiteur = 13;
  // afficher "Le visiteur a 13 ans."
  echo 'Le visiteur a ' . $age_du_visiteur . ' ans';
?>

Structures de contrôle

Normalement, un programme ne fait pas toujours la même chose. Son comportement dépend de son interaction avec l'utilisateur (cliquer sur un bouton, remplir une information) et son environnement (date, données enregistrées).

Pour cela, un langage de programmation propose des structures de contrôle : if, if-else, switch, while ...

Conditions

On utilise une structure conditionnelle if-else pour introduire une condition dans un programme.

<?php
  if ($age > 18 && $pervers == true)
  {
    echo 'Inscrivez-vous pour voir plus de vidéos.';
  }
  else
  {
    echo 'On vient d\'envoyer un SMS à tes parents.';
  }
?>

Autrement,

<?php
  if ($age > 18 AND $pervers) // AND, pas besoin de "== true"
  {
    echo 'Inscrivez-vous pour voir plus de vidéos.';
  }
  else
  {
    echo 'On vient d\'envoyer un SMS à tes parents.';
  }
?>

Autrement, pour éviter les echo

<?php if ($age > 18 AND $pervers) { ?>
    Inscrivez-vous pour voir plus de vidéos.
<?php } else { ?>
    On vient d'envoyer un SMS à tes parents. 
<?php } ?>

Il existe d'autres structures conditionnelles : l'instruction switch et l'opérateur ternaire.

Boucles

Une boucle sert à répéter un bloc d'instructions. Il en existe trois types : while, do-while, et for.

<?php
  $i = 1;
  while ($i <= 10) // boucle while
  {
    echo $i . '<br />';
    $i++; // $i = $i + 1
  }
?>
<?php
  $i = 1;
  do // boucle do-while
  {
    echo $i . '<br />';
    $i++; // $i = $i + 1
  } while ($i <= 10); // attention à ce point-virgule
?>
<?php
  for ($i = 1; $i <= 10; $i++) // boucle for
  {
    echo $i . '<br />';
  }
?>

Tableaux

Un tableau (array) est une variable complexe, car en fait elle contient une liste de valeurs.

<?php
  /* Un tableau numéroté
   * les indices sont des entiers consécutifs : 0, 1, 2 ... */
  $tab = array('zero', 'un', 'deux');
  echo $tab[0]; // affiche "zero"
  echo $tab[2] . ' cents'; // affiche "deux cents"
?>
<?php
  /* Un tableau associatif
   * les indices sont des strings */
  $tab = array('zero' => 0, 'un' => 1, 'deux' => 2);
  echo $tab['zero']; // affiche "0"
  echo $tab['deux'] * 10; // affiche "20"
?>

On parcourt un tableau associatif avec une boucle foreach

<?php
  $tab = array('zero' => 0, 'un' => 1, 'deux' => 2);
  foreach ($tab as $cle => $valeur)
  {
    echo 'la valeur de ' . $cle . ' est ' . $valeur . '<br />';
  }
?>

On peut afficher le contenu d'un tableau directement avec la fonction print_r().

Fonctions

Une fonction est un bloc de code qui exécute des instructions qui dépendent de certains paramètres, et qui peut renvoyer une valeur.

La liste complète de fonctions PHP est ici.

Pour déclarer une fonction on fait :

<?php
  function presentation($prenom, $nom)
  {
    return 'Je m\'appelle ' . $prenom . ' ' . $nom . '.';
  }
?>

Ensuite, on peut l'appeler :

<?php
  $nom_de_famille = 'Doe';
  echo presentation('John', $nom_de_famille); // affiche "Je m'appelle John Doe."
?>

Une fonction remarquable : include().

On ajoute le contenu d'un fichier PHP dans un autre avec :

<?php
  include('fichier.php');
?>

Ainsi, on peut séparer le code pour le rendre plus facile à comprendre, ou pour éviter d'écrire plusieurs fois le même code.

Variable $_GET

On peut envoyer des variables à une page PHP avec la variable (tableau associatif) $_GET.

Quand on ajoute à l'URL ?nom=Doe&prenom=John, alors

<?php
  echo $_GET['prenom']; // affiche "John"
  echo $_GET['nom'];    // affiche "Doe"
?>

On utilise la fonction isset() pour vérifier que la variable est définie.

<?php
  if (isset($_GET['prenom']))
  {
    echo $_GET['prenom'];
  }
?>

Variable $_POST

La variable $_POST contient les valeurs envoyées avec un formulaire. Par exemple, si sur une page on a ceci :

<form method="post" action="cible.php">
  <input type="text" name="commentaire" />
  <input type="submit" value="Valider" />
</form>

Alors, dans le fichier cible.php,

<?php
  echo $_POST['commentaire']; // affiche le commentaire soumis dans le formulaire
?>

Il existe d'autres variables pour communiquer avec une page web : $_SESSION et $_COOKIE. En plus, on peut transférer des informations via des fichiers de texte.

Questionnaire vrai/faux

  1. Le nom d'une variable commence par $
  2. On affiche une chaîne de caractères avec la fonction echo
  3. Les balises PHP sont <php> et </php>
  4. On affiche le contenu d'un tableau avec :
    <?php
      $tab = array('zero' => 0, 'un' => 1, 'deux' => 2);
      print_a($tab);
    ?>

Les bases de données

BDD, SGBD, SQL

Une base de données (BDD) est un système qui enregistre des informations classées et structurées.

Un système de gestion de base de données (SGBD) est un logiciel qui gère une base de données, comme MySQL, Oracle, MariaDB ...

On communique avec une BDD avec le langage SQL. Ce langage est commun à tous les SGBD (sauf pour les requêtes compliquées).

Structure d'une BDD

Une BDD est formée de tables. La BDD m3202td2 a les tables wp_commentmeta, wp_comments ...

Chaque table contient des champs (colonnes) et des entrées (lignes). Les champs de la table wp_commentmeta sont : meta_id, comment_id ...

phpMyAdmin

On peut manipuler (voir, créer, modifier) une BDD avec le logiciel phpMyAdmin, au lieu de passer par SQL.

phpMyAdmin est installé avec XAMPP. Il est sur http://localhost/phpmyadmin/.

PHP + SQL

Le module de PHP PDO sert à se connecter à une BDD.

Pour l'activer, on ouvre le fichier php.ini et on supprime le point-virgule au début de la ligne

;extension=php_pdo_mysql.dll

Pour se connecter à une BDD :

<?php
  $bdd = new PDO('mysql:host=localhost;dbname=m3202td2_bdd;charset=utf8', 
                 'root', 
                 '');
?>

Dans le premier paramètre, host est le nom d'hôte et dbname, le nom de la BDD. Les deux autres paramètres sont le login et le mot de passe.

Pour faire une requête SQL :

<?php
  // prendre toutes les entrées de la table 'wp_posts'
  $reponse = $bdd->query('SELECT * FROM wp_posts');
?>

Pour extraire chaque entrée :

<?php
  // $donnees est un tableau associatif contenant une entrée
  $donnees = $reponse->fetch();
?>

Exemple complet

<?php
try
{
  /* On se connecte à la BDD. 
   * Le dernier paramètre affiche des messages d'erreur faciles à lire */
  $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 
                 'root', 
                 '', 
                 array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
  /* En cas d'erreur, on affiche un message et on arrête tout, 
   * au lieu de montrer le code PHP */
  die('Erreur : ' . $e->getMessage());
}
// Si ça marche, on continue
// On récupère tout le contenu de la table 'wp_posts'
$reponse = $bdd->query('SELECT * FROM wp_posts');
// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{
?>
<p>
  <h2><?php echo $donnees['post_title']; ?></h2>
  <?php echo $donnees['post_content']; ?>
</p>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
?>

Requêtes SQL

<?php
  // charger seulement le contenu de deux champs de la table
  $reponse = $bdd->query('SELECT post_title, post_content 
                          FROM wp_posts');
?>
<?php
  // seulement les entrées avec commentaires
  $reponse = $bdd->query('SELECT post_title, post_content 
                          FROM wp_posts 
                          WHERE comment_count > 0');
?>
<?php
  // entrées triées par date décroissante
  $reponse = $bdd->query('SELECT post_title, post_content 
                          FROM wp_posts 
                          WHERE comment_count > 0
                          ORDER BY post_date DESC');
?>
<?php
  // seulement 5 entrées, commençant par l'entrée #15
  $reponse = $bdd->query('SELECT post_title, post_content 
                          FROM wp_posts 
                          WHERE comment_count > 0
                          ORDER BY post_date DESC
                          LIMIT 15, 5');
?>

Requête SQL avec des variables

<?php
  $req = $bdd->prepare('SELECT post_title 
                        FROM wp_posts 
                        WHERE post_author = ? AND post_status = ?');
  $req->execute(array($_GET['author'], 
                      $_GET['status']));
?>

Encore mieux :

<?php
  $req = $bdd->prepare('SELECT post_title 
                        FROM wp_posts 
                        WHERE post_author = :author AND post_status = :status');
  $req->execute(array('author' => $_GET['author'], 
                      'status' => $_GET['status']));
?>

Ajouter une entrée à la BDD :

<?php
  $req = $bdd->prepare('INSERT INTO wp_users(user_login, user_mail, display_name) 
                        VALUES(:login, :email, :name)');
  $req->execute(array('login' => $nom, 
                      'email' => $adresse, 
                      'name'  => $nom_prenom));
?>

Modifier une entrée de la BDD :

<?php
  // exec() renvoie le nombre d'entrées modifiées
  $nb_modifs = $bdd->exec('UPDATE wp_users 
                           SET display_name = \'Martin Marcantonio Luciano Scorsese\'
                           WHERE user_login = \'martin\''); // il faut échapper les guillemets !
  echo $nb_modifs . ' entrées ont été modifiées.';
?>

Il y a encore plus de choses à savoir sur SQL :

  • Supprimer des entrées
  • Fonctions SQL (scalaires et d'agrégat)
  • Mots-clés AS, GROUP BY et HAVING
  • Les types de dates : DATE, TIME ...
  • Les jointures (internes, externes à gauche/droite)

Questionnaire vrai/faux

  1. On utilise une boucle for pour parcourir les entrées d'une table
  2. phpMyAdmin n'est pas un SGBD
  3. Cette requête SQL affiche les entrées 5-10 :
    SELECT * FROM livres LIMIT 5, 10
  4. Cette requête SQL est bien formatée :
    SELECT * FROM wp_posts ORDER BY post_date LIMIT 15, 5 WHERE comment_count > 0

À rendre (aujourd'hui)

Soumettre une bonne (!) question sur ce qu'on a vu aujourd'hui dans «Question à rendre du CM n° 2»