Rendre un site web dynamique avec PHP

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot - dernière mise à jour : DECEMBRE 2021

0. Rappels HTML

HTML sert à décrire uniquement des pages Web statiques. Pour agrémenter ces pages d'animations ou pour les rendre plus puissantes grâce à de la programmation, on greffera d'autres technologies :

  • côté serveur Internet : PHP (PHP : Hypertext Preprocessor) en licence publique, ASP (Active Server Page) de Microsoft, JSP (Java Server Page) de SUN, le standard CGI (Common Gateway Interface), etc.

 

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

1. Introduction au PHP

Le langage PHP: Hypertext Preprocessor, plus connu sous son sigle PHP, est un langage de programmation libre principalement utilisé pour produire des pages Web dynamiques

 

PHP peut néanmoins fonctionner en dehors d'une page web comme n'importe quel langage interprété.

 

Depuis sa version 5, PHP est un langage impératif orienté objet comme C++.

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

A la base, les serveurs HTTP (Apache, IIS, etc.) ne savent pas interpréter le PHP. Pour que cela marche, il faut leur ajouter le module adéquat (installer PHP). 

 

 

 

 

 

Le PHP est exécuté côté serveur, seul le résultat est envoyé au navigateur. Les navigateurs ne savent donc pas exécuter le PHP, et ne sont pas censés en recevoir.

1. Introduction au PHP

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

Le PHP permettra, dans un site :

  • d'utiliser une base de données (pour stocker les utilisateurs, des messages, etc.),
  • d'envoyer des courriers électroniques,
  • interpréter les saisies d'un utilisateur dans un formulaire,
  • effectuer des calculs,
  • etc.

Ces choses sont impossibles en HTML/CSS.

1. Introduction au PHP

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

Une page PHP contient par défaut du HTML, elle doit donc commencer par les balises html

Toutefois, on a la possibilité de basculer du HTML au PHP, et inversement, grâce aux balises suivantes :

2. Coder en PHP

<html>
<body>
<!-- (début de votre code HTML) -->

  <?php  
      /* 
      il est possible d'ajouter des instructions PHP à
      l'intérieur de votre code HTML grâce aux balises 
      <?php	et 		?>  
      */ 
  ?>

<!-- (reprise de votre code HTML) -->
</body>
</html>

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

Votre code PHP ne s'exécute pas?

Les erreurs les plus fréquentes en PHP sont :

  • Votre URL commence par file:// au lieu de http:// : dans ce cas, c'est votre système d'exploitation (système de fichier) qui prend en charge la requête du navigateur (au lieu de votre serveur web).
  • Votre fichier porte l'extension .html au lieu de .php : par défaut, votre serveur web ne va chercher à interpréter le PHP que dans les fichiers portant l'extension .php
  • Votre fichier ne se trouve pas dans le dossier racine des pages Web de votre serveur : sachez où est localisé la racine de votre serveur web!! (souvent c:\xampp\htdocs ou c:\Program Files\EasyPHP\data\localweb)
  • Dans votre fichier PHP, vous avez oublié soit la balise <?php ou la balise fermante ?>

2. Coder en PHP

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

La fonction echo permet d'envoyer au navigateur un contenu placé entre guillemets. Le navigateur traitera ce contenu comme s'il reçevait une page Web traditionelle.

 

Ce contenu sera donc généralement du HTML, mais cela pourra être également du CSS ou n'importe quelle technologie dite cliente (c'est à dire interprétable par le navigateur).

2. Coder en PHP

2.1 - L'affichage

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

1. Voici un exemple de page PHP, qui mélange du HTML et du PHP, et qui utilise la fonction echo pour afficher "Bonjour !" dans le navigateur :

<!DOCTYPE html>
<HTML>
    <HEAD>
        <TITLE>Mon code PHP</TITLE>
        <META charset="utf-8"/>
    </HEAD>
    <BODY>
        <?PHP
            echo("Bonjour à tout le monde !<br/> Ceci est ma première page web codée avec PHP<br/>");
            // récupération de la date du jour dans des variables
            $jour=date("d");
            $mois=date("m");
            $an=date("Y");
            echo ("Nous sommes le ".$jour."/".$mois."/".$an."<br />");
            echo ("Navigateurs compatibles: ".$_SERVER["HTTP_USER_AGENT"].'<br />');
        ?>
    </BODY>
</HTML>

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

2. Coder en PHP

Les variables

2. Coder en PHP

Les variables en PHP sont toujours précédées de l'identificateur $

Contrairement au langage C, les variables en PHP n'ont pas besoin d'être déclarées.

Avec PHP, les noms de variables doivent répondre à 2 critères :

  • doit commencer par une lettre (majuscule ou minuscule) ou un "_"    (ne peut pas commencer par un chiffre!!)
  • peut comporter des lettres, des chiffres et le caractère _ (pas d'espaces!!)

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

2. Coder en PHP

Les variables

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

2. Coder en PHP

2.2 - Les tableaux

Les tableaux PHP stockent des données sous forme de liste. Les données contenues dans la liste sont accessibles grâce à un index.

Contrairement à des langages tels que le langage C, il est possible de stocker des éléments de types différents dans un même tableau. 

$Tableau[0] = 12;
$Tableau[1] = "CCM";
$Tableau[] = 12;
$Tableau[] = "CCM";

=

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

2.3 - Les conditions

Coder en PHP

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

2. Coder en PHP

<?php
  $compteur = 1;
  echo "<p>Avant la boucle, \$compteur vaut $compteur<br>";

  while ($compteur <= 5)
  {
    echo "Pendant la boucle, \$compteur vaut $compteur<br>";
    $compteur++;
  }

  echo "Après la boucle, \$compteur vaut $compteur</p>";
?>
<?php
  $compteur = 1;
  echo "<p>Avant la boucle, \$compteur vaut $compteur<br>";
  do
  {
    echo "Pendant la boucle, \$compteur vaut $compteur<br>";
    $compteur++;
  }while ($compteur <= 5);
  echo "Après la boucle, \$compteur vaut $compteur</p>";
?>
<?php
	echo "<p>";
    for ($i=1 ; $i <= 5 ; $i++)
    {
      echo "Pendant la boucle, la variable \$i vaut $i<br>";
    }
    echo "</p>";
?>

2.4 - Les boucles et structures répétitives

BSIO1 - B1.3 - Participer à la présence en ligne des organisations

BTS SIO - AMEP Redoute - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

3. HTML - PHP avancé

3.1 - Récupérer les données d'un formulaire

Tapez le code suivant, et sauvez-le dans un fichier à la racine de votre serveur Internet, puis exécutez-le. Que réalise ce script?

<html>
<form>
  <input type="text" name="login">
  <input type="submit">
</form>
<?php
  echo "Bonjour " . $_REQUEST["login"];
?>
</html>

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

3. HTML - PHP avancé

3.2 - Récupérer les données d'une autre page

Tapez les codes suivants, et sauvez-les dans deux fichiers différents, formulaire.html, et validation.php.

<html>
<!-- Fichier formulaire.html -->
<head></head>
<body>
<form action="validation.php" method="GET">
  <input type="text" name="ma_saisie"><br>
  <input type="submit">
</form>
</body>
</html>
<html>
<!-- Fichier validation.php -->
<head></head>
<body>
<?php
  echo "Vous avez saisi : ";
  echo $_GET["ma_saisie"];
?>
</body>
</html>

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

Exécuter la page formulaire.html, remplissez la zone de saisie et validez le formulaire. Que se passe-t-il?

BSIO1 - SI6 - Développement d'applications

3. HTML - PHP avancé

3.3 - Récupérer les données de la page courante

Observez les codes suivants, et remarquez les différences. Le code de gauche génère une erreur, que le code de droite corrige. Quelle solution a été mise en place ?

<html>
<!-- Fichier saisie.php -->
<head></head>
<body>
<form>
  <input type="text" name="ma_saisie"><br>
  <input type="submit">
</form>
<?php
  echo "Vous avez saisi : ";
  echo $_REQUEST["ma_saisie"];
?>
</body>
</html>
<html>
<!-- Fichier saisie.php -->
<head></head>
<body>
<form>
    <input type="text" name="ma_saisie"><br>
    <input type="submit">
</form>
<?php
    if (isset($_REQUEST["ma_saisie"]))
    {
        echo "Bonjour ";
        echo $_REQUEST["ma_saisie"];
    }
?>
</body>
</html>

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

La fonction isset permet de savoir si une variable a été déclarée (et ainsi de savoir si un formulaire a été validé) ou encore si une case à cocher, dans un formulaire HTML, a été cochée ou non.

<form>
  <input name="texte1">
  <input name="texte2">
  <input type="submit">
</form>
<?php
  if (isset($_REQUEST["texte1"])
    echo "Le formulaire a été validé et peut être traité,"
    echo ": texte1 et texte2 sont connus";
?> 
<form>
  <input type="checkbox" name="ma_checkbox">
  <input type="submit">
</form>
<?php
  if (isset($_GET["ma_checkbox"]))
    echo "La case a été cochée";
  else
    echo "La case n'a pas été cochée";
?> 

3.4 - La fonction standard isset

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

3. HTML - PHP avancé

BSIO1 - SI6 - Développement d'applications

La fonction is_numeric permet de vérifier le type d'une variable.

Exemple : l'utilisateur a saisi deux valeurs a et b, on veut voir si elles sont numériques et comprises entre 0 et 100, puis on affiche la somme.

2. Coder en PHP

<?php
    
    if (!is_numeric($a))
      echo "a n'est pas une valeur numérique";
    elseif (!is_numeric($b))
      echo "b n'est pas une valeur numérique";
    elseif ($a < 0 || $a > 100 || $b < 0 || $b > 100)
      echo "a ou b n'est pas compris dans l'intervalle autorisé (0 à 100)";
    else
      echo "La somme de a et b est : ".($a + $b);
?>

3.4 - La fonction standard is_numeric

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

3. HTML - PHP avancé

Exercice d'application

Reprenez l'exemple de la page saisie.php

Au lieu de faire saisir un champ, vous faites saisir deux champs a et b dans un formulaire.

La partie du code en PHP affichera la somme de ces deux valeurs saisies.

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

3. HTML - PHP avancé

3.5 - La méthode GET

GET

Avec cette méthode, les données du formulaire seront encodées dans une URL. Cette URL sera composée du nom de la page (ou du script) à charger avec les données de formulaire empaquetées dans une chaîne. 
Les données sont séparées de l'adresse de la page par le symbole ? et entre elles par le symbole &.

Ainsi si on envoie à page.html les valeurs "bleu" pour le champ "couleur" et "rectangle" pour le champ "forme", l'URL construite par le navigateur sera:

http://www.xul.fr/page.html&couleur=bleu&forme=rectangle 

Contraintes :

  • Les données de formulaire doivent être uniquement des codes ASCII.
  • La taille d'une URL est limitée à par le serveur, souvent un peu plus de 2000 caractères, en comprenant les codes d'échappement.

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

3. HTML - PHP avancé

3.6 - La méthode POST

POST

Dans un formulaire, elle est spécifiée ainsi:

 

 

Cette méthode envoie un en-tête et un corps de message au serveur. Le corps est généralement constitué des données entrées dans le champ de formulaire par l'utilisateur. Le traitement du message est complètement transparent pour le client. Les données du formulaire n'apparaissent pas dans l'URL.

<form method="post" action="page.php">
</form>

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

Un site Web dynamique, comme de nombreuses autres applications, utilisera une base de données pour stocker les données qu'il manipule. Par exemple :

  • site de petites annonces : les utilisateurs, les annonces, les paiements, etc.
  • forum : les utilisateurs, les sujets, les messages, etc.
  • site marchand : les clients, les produits, les paniers, les factures, etc.

 

Bien que PHP soit conçu pour travailler avec n'importe quel serveur de base de données, on l'associe souvent à MySQL.

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

PHP offre 3 APIs (Application Programming Interface) différentes pour se connecter à MySQL. Il est recommandé d'utiliser soit l'extension mysqli, soit l'extension PDO_MySQL. Il n'est pas recommandé d'utiliser l'ancienne extension mysql pour de nouveaux développements sachant qu'elle est obsolète depuis PHP 5.5.0, et sera supprimée dans un futur proche. 

 

Tout code PHP qui a recours à une base de données MySQL contiendra donc les  instructions suivantes (et dans cet ordre)

  1. mysqli_connect  (pour se connecter à un serveur de bases de données) 
  2. mysqli_select_db (pour  choisir une BDD parmi celles présentes sur le serveur)
  3. mysqli_query (pour exécuter une requête sur la base de données sélectionnée)
  4. mysqli_close (pour fermer la connexion)

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

4.0 - Choix de l'interface de programmation

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

4.1 - Se connecter à une base de données

Le paramétrage est le suivant :

Par exemple, quand vous travaillerez au lycée, sur la version de XAMPP installée en local sur votre poste :

Vous pouvez ajouter une gestion d'erreur, qui permet de trouver les erreurs en dix secondes au lieu de deux heures :

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

// pour se connecter à MySQLi et on récupère dans $link le lien de la connexion
$link = mysqli_connect('nom_serveur', 'nom_user', 'mdp_user', 'nom_bdd1');

// pour sélectionner une autre base 
mysqli_select_db($link, 'nom_bdd2');
// pour se connecter à MySQLi et on récupère dans $link le lien de la connexion
$link = mysqli_connect('localhost', 'root', '');
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_database');

if (!$link) {
    die('Erreur de connexion (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());        
}

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

4.2 - Exécution d'une requête SQL d'insertion

Voici un exemple de code PHP qui exécute une requête d'insertion :

  • null : sous MySQL, convient pour qu'un numéro automatique soit géré automatiquement.
  • 18.5 : les valeurs numériques sont insérable facilement. Le séparateur de décimale est le point, et surtout pas la virgule.
  • 'coucou' : les valeurs de type chaîne de caractères doivent être entourées de guillemets (simples ou doubles).
  • 'l\'autre' : Si la valeur elle-même est susceptible de contenir un guillemet simple, il faut l'échapper grâce à l'anti-slashe.
  • '2008-01-15' : les dates au format DATE sont entourées de guillemets, en notation américaine (AAAA-MM-JJ)
  • 0 et 1 : le type booléen n'existant pas sous MySQL, on le représente généralement grâce aux valeurs 0 (pour faux), et 1 (pour vrai). Techniquement, tous les outils (langages et SGBDR) considèrent que 0 est équivalent à la valeur faux, et toutes les autres valeurs numériques représentent la valeur vrai.

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

// connexion au serveur et sélection de la base par défaut
$lien = mysqli_connect("127.0.0.1", "root", "", "ma_base");

// construction de la requête à exécuter
$req = "INSERT INTO ma_table VALUES (null, 18.5, 'alpha', 'l\'autre', '2008-01-15', 1, 0)";

// exécution de la requête
mysqli_query($lien, $req);

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

4.3 - Gestion d'erreurs de requêtes

Plusieurs raisons peuvent expliquer que votre requête ne s'exécute pas correctement. Le fait d'avoir le détail de l'erreur, et également la requête SQL qui s'affiche sous vos yeux, vous permet de repérer très rapidement les erreurs.

$sql = "votre_requête_tapée_ici";
mysqli_query($link, $sql) or die("Erreur " .  mysqli_error($link) . " dans la requête" . $sql);

** Danger avec les requêtes en PHP **

Attention : si vous avez un problème avec une requête SQL, ou avec un code PHP qui contient une requête, ne vous avisez pas d'appeler le professeur avant d'avoir fait la gestion d'erreur pour trouver vous-même l'erreur. Vous risqueriez de faire une chute totalement accidentelle depuis votre chaise...

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

4.4 - Affichage des résultats d'une requête SQL

Voici l'ensemble du code (avec la gestion d'erreur) qui permet d'afficher le contenu d'une table de produits :

<?php
//sauvegarde de ma requête dans une variable
$sql = "SELECT * FROM produits;";

// sauvegarde du résultat de ma requête dans une variable
$les_produits = mysqli_query($lien, $sql) 
            or die("Erreur ".mysqli_error($lien)." dans la requête $sql");

// affichage du nombre de lignes en résultat de la requête
echo("La requête a retourné " . mysqli_num_rows($les_produits) . " lignes.<br>");

// boucle d'affichage des lignes de résultats
while ($ligne_produit = mysqli_fetch_assoc($les_produits))
{
    echo $ligne_produit["reference"]; // reference est un champ de la table
    echo $ligne_produit["libelle"]; // libelle est un champ de la table
    /*...*/
}
?>

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

Et voici quelques explications :

  • $les_produits est un RecordSet de produits, en français Jeu d'Enregistrements de produits. En effet, le résultat d'une requête s'appelle un jeu d'enregistrements
  • mysqli_fetch_assoc :
    • prend le premier enregistrement contenu dans le jeu d'enregistrement $les_produits, et le place dans la variable $ligne_produit sous forme de tableau associatif.
    • La deuxième fois qu'on appelle cette fonction, elle prend automatiquement le deuxième enregistrement. Cette fonction est donc conçue pour parcourir successivement chaque produit.
    • Lorsqu'elle a parcouru tous les produits et qu'on la rappelle, elle renvoie la valeur booléenne false, ce qui interrompt naturellement la boucle while
  • $ligne_produit (nom de variable totalement libre) est un tableau où chaque champ dans la table produit est devenu un indice dans ce tableau. Par exemple : si vous aviez le champ nom_produit dans la table, alors vous pouvez afficher $ligne_produit["nom_produit"].

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

4.4 - Affichage des résultats d'une requête SQL

<?php
//sauvegarde de ma requête dans une variable
$sql = "SELECT * FROM table_de_produits;";

// sauvegarde du résultat de ma requête dans une variable
$les_produits = mysql_query($lien, $sql) 
            or die("Erreur ".mysqli_error($lien)." dans la requête $sql");

// affichage du nombre de lignes en résultat de la requête
echo("La requête a retourné " . mysqli_num_rows($les_produits) . " lignes.<br>");

// boucle d'affichage des lignes de résultats
while ($ligne_produit = mysqli_fetch_assoc($les_produits))
{
    echo $ligne_produit["champ1"];
    echo $ligne_produit["champ2"];
    /*...*/
}
?>

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

<?php
//sauvegarde de ma requête dans une variable
$sql = "SELECT * FROM table_de_produits;";

// sauvegarde du résultat de ma requête dans une variable
$les_produits = mysqli_query($link, $sql) or die("Erreur ".mysql_error()." dans la requête $sql");

// on insère le code HTML de la balise du tableau
echo '<table border="1">';
echo '<th>Désignation</th><th>Prix Unitaire</th>';

// boucle d'affichage des lignes de résultats
while ($ligne_produit = mysqli_fetch_assoc($les_produits))
{    
    // chaque ligne de résultat est une ligne du tableau
    echo '<tr>' ;
    echo '<td>'. $ligne_produit["nom_produit"] . '</td>'; 
    echo '<td>'. $ligne_produit["prix_produit"] . '</td>';
    echo '</tr>';
}
echo '</table>';
?>

Les jeux d'enregistrement seront affichés dans des tableaux afin de soigner la mise en page. 

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

4.4 - Affichage des résultats d'une requête SQL

BSIO1 - SI6 - Développement d'applications

4. PHP - MySQL

4.5 - Manipulation de bases de données

BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot

BSIO1-TC2-B1.3-Introduction PHP

By Axel FELIOT

BSIO1-TC2-B1.3-Introduction PHP

Introduction au développement d'applications Web dynamiques en PHP

  • 3,349