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) :
- mysqli_connect (pour se connecter à un serveur de bases de données)
- mysqli_select_db (pour choisir une BDD parmi celles présentes sur le serveur)
- mysqli_query (pour exécuter une requête sur la base de données sélectionnée)
- 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