Exercice formatif d'introduction à une application PHP rudimentaire.
Ce projet est à faire faire et à refaire jusqu'à de que tous ces concepts soient acquis :
- Capable d'installer une application PHP
- Capable de faire fonctionner une application PHP sur un serveur local.
- Capable d'afficher dans la page par programmation.
- Capable d'inclure une fichier externe
- Capable de composer du HTML sous forme de concaténations de chaînes PHP.
- Capable de créer une classe PHP
- Capable de créer une méthode statique
- Capable de faire l'appel à une méthode statique
- Capable de connecter une base de données
- Capable d'exécuter une commande SQL
- Capable de parcourir les enregistrements retournés
- Capable de récupérer les informations d'un enregistrement
- Capable re recueillir une donnée se trouvant dans l'adresse
- Visual Studio Code
- WampServer ou XAMPP
- DB Browser for SQLite
- Compte Github
Suivre dans l'ordre les étapes suivantes.
-
Cloner ou télécharger le dossier de départ du projet
-
S'assurer que le projet est bel et bien ouvert dans VSCode.
-
Renommer les fichiers
index.html
etdetails.html
qui se trouvent dans le dossierpublic
pour qu'ils aient l'extension.php
. -
Démarrerr le serveur dans le terminal de VSCode :
php -S localhost:8000 -t public
-
Tester dans le fureteur l'adresse
http://localhost:8000
. La pageindex.php
devrait s'afficher. -
Créer un fichier
Pokemon.php
dans le dossierapp
et y ajouter la classe du même nom.//Pokemon.php <?php class Pokemon { }
-
Dans la classe, créer les méthodes statiques
html_index
qui n'a pas de paramètres ethtml_details
qui doit recevoir le paramètre$id
. Les 2 méthodes retournent une chaîne de caractères.static public function html_index() { $resultat = ''; return $resultat; } static public function html_details($id) { $resultat = ''; return $resultat; }
-
Mettre le HTML pertinent (provenant de
index.php
etdetails.php
) dans chacune des méthodes et le transformer en PHP grâce à des concaténations successives. Exemple partiel :$resultat = ''; $resultat .= '<div class="details">'; $resultat .= '<h1>Bulbizarre</h1>'; $resultat .= '<div><img src="https://www.pokebip.com/pokedex-images/artworks/1.png" alt="Bulbizarre"></div>'; ... return $resultat;
Note : Dans la méthode
html_index
, se limiter à 3 Pokémons. -
Dans les pages
index.php
etdetails.php
, faire l'inclusion de fichierautoload.php
<?php include("../autoload.php"); ?><!DOCTYPE html> ...
-
Supprimer respectivement les balises (et leur contenu)
div.liste
etdiv.details
-
Tester les pages. Elles devraient être presque vides.
-
Ajouter les appels aux méthodes statiques crées pour remplacer le HTML enlevé :
//index.php ... <?php echo Pokemon::html_index(); ?> ...
//details.php ... <?php echo Pokemon::html_details(1); ?> ...
-
Tester. Les pages devraient fonctionner, mais donner toujours le même résultat peu importe le lien cliqué.
-
Ouvrir la base de données dans DB Browser for SQLite et prendre note des noms des champs de la table
pokemons
. -
Au début chaque méthode, ajouter la connexion à la base de données et lexecution d'une requête:
$pdo = new PDO("sqlite:../pokemon.sqlite"); $stmt = $pdo->prepare("{SQL}"); $stmt->execute();
-
Remplacer la mention
{SQL}
par les commandes SQL suivantes :- html_index :
SELECT id, numero, nom_fr FROM pokemons ORDER BY numero LIMIT 20
- html_details :
SELECT id, numero, nom_fr, nom_en, type1, type2, talents, pv, attaque, defense, attaque_speciale, defense_speciale, vitesse FROM pokemons WHERE id=?
- html_index :
-
Dans
html_details
, ajouter[$id]
comme paramètre à la méthodeexecute
. -
Dans
html_index
, faire en sorte de ne garder qu'un seultr
dans letbody
. -
Envelopper le
tr
restant dans une bouclewhile
:while (($objPokemon = $stmt->fetchObject()) !== false) { ... }
-
Dans
html_details
, envlopper tout le contenu dudiv.details
d'unif
silimaire:if (($objPokemon = $stmt->fetchObject()) !== false) { ... } else { $resultat .= '<h1>Ce Pokémon n\'existe pas</h1>'; }
-
Dans chaque méthode, remplacer les informations variables par des données de la base de données.
Par exemple :
$resultat .= '<h1>Pikachu</h1>';
deviendra :
$resultat .= '<h1>'.$objPokemon->nom_fr.'</h1>';
-
À l'occasion, on a besoin d'appliquer la function
intval
à la donnéenumero
. On utilisera doncintval($objPokemon->numero)
à la place. -
Il ne reste qu'à gérer les occasions où il n'y a pas de 2e type. On a alors besoin d'un
if
. -
Tester (souvent)
-
Dans le fichier
details.php
ajouter les lignes suivantes juste après leinclude
:if (!isset($_GET['id'])) { header("location:index.php"); exit; } $id = $_GET['id'];
-
Adapter la commande suivante plus bas dans le même fichier :
echo Pokemon::html_details($id);
-
Tester en cliquant sur les liens.