4. La classe Article

La base de données

Il est temps de passer à la gestion de nos articles...

Mais nous n'avons pas encore d'articles ?

Tout juste, nous allons modifier la structure de notre base de données en ajoutant une table article 😉

Voici le schéma de notre base de données (j'ai ajouté 3 articles).  

CREATE TABLE `article` (

`id` int(11) NOT NULL,

`title` varchar(100) NOT NULL,

`content` text NOT NULL,

`author` varchar(100) NOT NULL,

`createdAt` datetime NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `article` (`id`, `title`, `content`, `author`, `createdAt`) VALUES

(1, 'Voici mon premier article', 'Mon super blog est en construction.', 'Karim', '2019-03-15 08:10:24'),

(2, 'Un deuxième article', 'Je continue à ajouter du contenu sur mon blog.', 'Karim', '2019-03-16 13:27:38'),

(3, 'Mon troisième article', 'Mon blog est génial !!!', 'Karim', '2019-03-16 14:45:57');

ALTER TABLE `article`

ADD PRIMARY KEY (`id`);

ALTER TABLE `article`

MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; 

Ici on retrouve une table article classique avec les champs suivants :

- id qui est la PRIMARY KEY en AUTO INCREMENT

- title qui est de type VARCHAR limité à 100 caractères

- content qui est de type TEXT

- author qui est de type VARCHAR limité à 100 caractères

- createdAt qui est de type DATETIME

Tous les champs sont indiqués comme NOT NULL.

J'ai créé le fichier  articles.sql  dans le dossier  sql.

 Dans la suite de ce cours, nous ajouterons de nouveaux articles depuis notre application.

Il est temps de passer à la création de notre classe Article 😃

 

La classe Article

Nous allons commencer par créer une classe Article dans un fichier  Article.php  à la racine de notre projet:

<?php

class Article
{
    
}

Nous allons commencer par récupérer la connexion à la base de données et récupérer nos articles dans une méthode  getArticles  :

Récupération de la connexion à la base de données :

On va modifier notre fichier  Database.php  pour renvoyer la connexion :

<?php

class Database
{
    //Nos constantes
    const DB_HOST = 'mysql:host=localhost;dbname=blog;charset=utf8';
    const DB_USER = 'root';
    const DB_PASS = 'root';

    //Méthode de connexion à notre base de données
    public function getConnection()
    {
        //Tentative de connexion à la base de données
        try{
            $connection = new PDO(self::DB_HOST, self::DB_USER, self::DB_PASS);
            $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //On renvoie la connexion
            return $connection;
        }
        //On lève une erreur si la connexion échoue
        catch(Exception $errorConnection)
        {
            die ('Erreur de connection :'.$errorConnection->getMessage());
        }

    }
}

Ici, la seule modification a été faite pour renvoyer la connexion à la base de données (qui sera utilisée par la classe Article).

Nous allons modifier notre fichier  Article.php  ainsi que le fichier  home.php

Commençons par créer notre méthode  getArticles()  qui va nous permettre de récupérer tous les articles :

<?php

class Article
{
    public function getArticles()
    {
        $db = new Database();
        $connection = $db->getConnection();
        $result = $connection->query('SELECT id, title, content, author, createdAt FROM article ORDER BY id DESC');
        return $result;
    }
}

Et le fichier  home.php  en conséquence :

<?php
//On inclut le fichier dont on a besoin (ici à la racine de notre site)
require 'Database.php';
//Ne pas oublier d'ajouter le fichier Article.php
require 'Article.php';
?>
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Mon blog</title>
</head>

<body>
<div>
    <h1>Mon blog</h1>
    <p>En construction</p>
    <?php
    $article = new Article();
    $articles = $article->getArticles();
    while($article = $articles->fetch())
    {
        ?>
        <div>
            <h2><?= htmlspecialchars($article['title']);?></h2>
            <p><?= htmlspecialchars($article['content']);?></p>
            <p><?= htmlspecialchars($article['author']);?></p>
            <p>Créé le : <?= htmlspecialchars($article['createdAt']);?></p>
        </div>
        <br>
        <?php
    }
    $articles->closeCursor();
    ?>
</div>
</body>
</html>

Quelques explications complémentaires :
- nous avons ici ajouté le fichier Article.php qui va nous servir dans notre code ;
- on remarque la suppression de l'instanciation de l'objet $db ainsi que l'appel à la méthode  getConnection()  (appelé maintenant dans la méthode getArticles()  ),et l'affichage de son résultat;
- on créé un nouvel  Article  , on appelle la méthode getArticles() et on fait une boucle pour afficher les résultats;

Voici le résultat dans notre navigateur web :


 

Notre page affiche notre liste d'articles, classé par leurs identifiants, en ordre décroissant.

Il est temps de travailler sur l'affichage d'un article en particulier.

 

Afficher un article

Notre page liste maintenant nos articles, nous allons travailler sur la page qui affiche un article en particulier. On va commencer par ajouter une méthode  getArticle()  pour récupérer un article unique : 

<?php

class Article
{
    public function getArticles()
    {
        $db = new Database();
        $connection = $db->getConnection();
        $result = $connection->query('SELECT id, title, content, author, createdAt FROM article ORDER BY id DESC');
        return $result;
    }

    public function getArticle($articleId)
    {
        $db = new Database();
        $connection = $db->getConnection();
        $result = $connection->prepare('SELECT id, title, content, author, createdAt FROM article WHERE id = ?');
        $result->execute([
            $articleId
        ]);
        return $result;
    }
}

Ici, on va passer un paramètre à notre méthode  getArticle  pour récupérer un article en particulier  (symbolisé par $idArt).

Créons maintenant un fichier  single.php  (à la racine de notre projet) qui va afficher un article en particulier :

<?php
//On inclut le fichier dont on a besoin (ici à la racine de notre site)
require 'Database.php';
//Ne pas oublier d'ajouter le fichier Article.php
require 'Article.php';
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Mon blog</title>
</head>

<body>
<div>
    <h1>Mon blog</h1>
    <p>En construction</p>
    <?php
    $article = new Article();
    $articles = $article->getArticle(1);
    $article = $articles->fetch()
    ?>
    <div>
        <h2><?= htmlspecialchars($article['title']);?></h2>
        <p><?= htmlspecialchars($article['content']);?></p>
        <p><?= htmlspecialchars($article['author']);?></p>
        <p>Créé le : <?= htmlspecialchars($article['createdAt']);?></p>
    </div>
    <br>
    <?php
    $articles->closeCursor();
    ?>
</div>
</body>
</html>

Ici, j'ai passé le paramètre 1 à la méthode  getArticle  pour afficher notre article avec l'identifiant 1 en base de données.

Voici le résultat lorsque vous essayez d'afficher la page http://localhost/blog/single.php :


 

Si je veux un autre article, je n'ai qu'à changer le paramètre dans la méthode ?  😅

 Surtout pas ! On ne doit jamais faire ceci de cette manière ! 😠

On va passer le paramètre dynamiquement, en passant par l'URL.

 

Mise en place d'une navigation

On va modifier le fichier home.php  pour ajouter l'identifiant de notre article et en dirigeant vers la page single.php .

On modifie d'abord notre fichier home.php :

<?php
//On inclut le fichier dont on a besoin (ici à la racine de notre site)
require 'Database.php';
//Ne pas oublier d'ajouter le fichier Article.php
require 'Article.php';
?>
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Mon blog</title>
</head>

<body>
<div>
    <h1>Mon blog</h1>
    <p>En construction</p>
    <?php
    $article = new Article();
    $articles = $article->getArticles();
    while($article = $articles->fetch())
    {
        ?>
        <div>
            <h2><a href="single.php?articleId=<?= htmlspecialchars($article['id']);?>"><?= htmlspecialchars($article['title']);?></a></h2>
            <p><?= htmlspecialchars($article['content']);?></p>
            <p><?= htmlspecialchars($article['author']);?></p>
            <p>Créé le : <?= htmlspecialchars($article['createdAt']);?></p>
        </div>
        <br>
        <?php
    }
    $articles->closeCursor();
    ?>
</div>
</body>
</html>

Sans oublier notre fichier  single.php  : 

<?php
//On inclut le fichier dont on a besoin (ici à la racine de notre site)
require 'Database.php';
//Ne pas oublier d'ajouter le fichier Article.php
require 'Article.php';
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Mon blog</title>
</head>

<body>
<div>
    <h1>Mon blog</h1>
    <p>En construction</p>
    <?php
    $article = new Article();
    $articles = $article->getArticle($_GET['articleId']);
    $article = $articles->fetch()
    ?>
    <div>
        <h2><?= htmlspecialchars($article['title']);?></h2>
        <p><?= htmlspecialchars($article['content']);?></p>
        <p><?= htmlspecialchars($article['author']);?></p>
        <p>Créé le : <?= htmlspecialchars($article['createdAt']);?></p>
    </div>
    <br>
    <?php
    $articles->closeCursor();
    ?>
    <a href="home.php">Retour à l'accueil</a>
</div>
</body>
</html>

Voici le rendu de la page  home.php  :


 

Et celui de la page  single.php  :


 

Il est temps de refactoriser son application 😊

 

Quelques révisions

Si vous avez besoin de revoir certains points, voici les liens en conséquence :

htmlspecialchars

Variables superglobales

 

Bilan

Dans ce chapitre, nous avons ajouté une classe  Article  connectée à notre base de données qui nous permet d'afficher la liste des articles sur la page  home.php  et un article en particulier sur la page  single.php  .

Vous pouvez retrouver le code associé à ce chapitre sur GitHub.