PHP : Exercices corrigés

Objectif: Créer un site web permettant aux utilisateurs de se connecter, afficher les publications des utilisateurs connectés et permettre la modification, l’ajout et la suppression de publications.

Description des fonctionnalités requises:

  1. Page d’authentification: Créez une page HTML qui contient un formulaire permettant aux utilisateurs de saisir leur nom d’utilisateur et leur mot de passe. La page doit valider les entrées utilisateur et rediriger les utilisateurs vers une page de profil s’ils ont fourni des informations d’identification valides. En cas d’informations d’identification invalides, la page doit afficher un message d’erreur.
  2. Page de profil: Créez une page PHP qui vérifie si l’utilisateur est authentifié. Si l’utilisateur n’est pas authentifié, la page doit rediriger vers la page d’authentification. Si l’utilisateur est authentifié, la page doit afficher les publications de l’utilisateur.
  3. Affichage des publications: La page de profil doit afficher une liste des publications de l’utilisateur connecté. Chaque publication doit inclure un titre, une date de publication et un contenu. Les publications doivent être triées par ordre chronologique inversé (la publication la plus récente en premier).
  4. Modification des publications: Les utilisateurs doivent être en mesure de modifier leurs propres publications. Ajoutez un bouton « Modifier » à côté de chaque publication dans la liste des publications. Lorsque l’utilisateur clique sur le bouton « Modifier », une page de modification doit s’ouvrir avec un formulaire pré-rempli contenant le titre et le contenu de la publication. L’utilisateur doit être en mesure de modifier ces champs et de soumettre le formulaire pour enregistrer les modifications.
  5. Suppression des publications: Les utilisateurs doivent également être en mesure de supprimer leurs propres publications. Ajoutez un bouton « Supprimer » à côté de chaque publication dans la liste des publications. Lorsque l’utilisateur clique sur le bouton « Supprimer », une confirmation doit être demandée avant de supprimer définitivement la publication.
  6. Ajout de publications: Les utilisateurs doivent être en mesure d’ajouter de nouvelles publications. Ajoutez un bouton « Ajouter une publication » à la page de profil. Lorsque l’utilisateur clique sur ce bouton, une page de création de publication doit s’ouvrir avec un formulaire vide. L’utilisateur doit être en mesure de saisir un titre et un contenu pour la nouvelle publication et de soumettre le formulaire pour l’enregistrer.

Conseils:

  • Utilisez des sessions pour stocker les informations d’authentification de l’utilisateur.
  • Utilisez un langage de base de données tel que MySQL pour stocker les publications des utilisateurs.
  • Assurez-vous de sécuriser l’application en validant toutes les entrées utilisateur pour éviter les attaques de script entre autres.

Questions:

  1. Donner le code PHP de la page « connexion.php » qui permet de se connecter à la base de données « Publications » avec l’utilisateur « root » :
Solution avec MySQLI
<?php
$host = "localhost"; // Nom d'hôte
$username = "root"; // Nom d'utilisateur
$password = ""; // Mot de passe (laisser vide si vous n'en avez pas défini)
$dbname = "Publications"; // Nom de la base de données

// Connexion à la base de données
$conn = new mysqli($host, $username, $password, $dbname);

// Vérification de la connexion
if ($conn->connect_error) {
    die("La connexion a échoué : " . $conn->connect_error);
}
[collapse]
Solution avec PDO
<?php
$host = "localhost"; // Nom d'hôte
$username = "root"; // Nom d'utilisateur
$password = ""; // Mot de passe (laisser vide si vous n'en avez pas défini)
$dbname = "Publications"; // Nom de la base de données

// Connexion à la base de données avec PDO
try {
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    // Configuration de PDO pour afficher les erreurs SQL
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connexion réussie à la base de données !";
} catch(PDOException $e) {
    echo "La connexion a échoué : " . $e->getMessage();
}
[collapse]
    <form action="login.php" method="post">
        <label for="username">Nom d'utilisateur :</label>
        <input type="text" name="username" id="username">
        <label for="password">Mot de passe :</label>
        <input type="password" name="password" id="password">
        <button type="submit">Se connecter</button>
    </form>
    
    <?php
    if (isset($_POST['username']) && isset($_POST['password'])) {
        // Vérification des informations d'identification et démarrage de la session si elles sont valides
        // Code à compléter
        echo "Bienvenue, " . $username . " !";
        echo "<a href=\"Publications.php\">Publications</a>";
    }
    ?>
    
    Solution avec MySQLI
    if (isset($_POST['username']) && isset($_POST['password'])) {
        // Vérification des informations d'identification et démarrage de la session si elles sont valides
        require_once "connexion.php"; // Inclusion du fichier de connexion à la base de données
        $username = $_POST['username'];
        $password = $_POST['password'];
        $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
        $result = $conn->query($query);
        if ($result->num_rows == 1) {
            // Informations d'identification valides
            session_start();
            $_SESSION['username'] = $username;
            echo "Bienvenue, " . $username . " !";
            echo "<a href=\"Publications.php\">Publications</a>";
        } else {
            // Informations d'identification invalides
            echo "Nom d'utilisateur ou mot de passe incorrect.";
        }
    }
    [collapse]
    Solution avec PDO
    if (isset($_POST['username']) && isset($_POST['password'])) {
        // Vérification des informations d'identification et démarrage de la session si elles sont valides
        require_once "connexion.php"; // Inclusion du fichier de connexion à la base de données
        $username = $_POST['username'];
        $password = $_POST['password'];
        $query = "SELECT * FROM users WHERE username=:username AND password=:password";
        $stmt = $pdo->prepare($query);
        $stmt->bindParam(':username', $username);
        $stmt->bindParam(':password', $password);
        $stmt->execute();
        if ($stmt->rowCount() == 1) {
            // Informations d'identification valides
            session_start();
            $_SESSION['username'] = $username;
            echo "Bienvenue, " . $username . " !";
            echo "<a href=\"Publications.php\">Publications</a>";
        } else {
            // Informations d'identification invalides
            echo "Nom d'utilisateur ou mot de passe incorrect.";
        }
    [collapse]
      <h1>Publications</h1>
      
      <?php
      session_start();
      
      if (!isset($_SESSION['username'])) {
          // Redirection vers la page de connexion si l'utilisateur n'est pas connecté
          // Code à compléter
      }
      
      $username = $_SESSION['username'];
      
      // Récupération des publications de l'utilisateur à partir de la base de données
      // Code à compléter
      
      foreach ($publications as $publication) {
          echo "<h2>" . $publication['title'] . "</h2>";
          echo "<p>" . $publication['content'] . "</p>";
          echo "<p>Date de publication : " . $publication['date'] . "</p>";
      }
      ?>
      
      Solution avec PDO
      <h1>Publications</h1>
      
      <?php
      session_start();
      
      if (!isset($_SESSION['username'])) {
          // Redirection vers la page de connexion si l'utilisateur n'est pas connecté
          header("Location: login.php");
          exit();
      }
      
      $username = $_SESSION['username'];
      
      // Récupération des publications de l'utilisateur à partir de la base de données
      require_once "connexion.php"; // Inclusion du fichier de connexion à la base de données
      $query = "SELECT * FROM publications WHERE username=:username";
      $stmt = $pdo->prepare($query);
      $stmt->bindParam(':username', $username);
      $stmt->execute();
      $publications = $stmt->fetchAll();
      
      foreach ($publications as $publication) {
          echo "<h2>" . $publication['title'] . "</h2>";
          echo "<p>" . $publication['content'] . "</p>";
          echo "<p>Date de publication : " . $publication['date'] . "</p>";
      }
      ?>
      [collapse]
      Solution avec MySQLI
      <h1>Publications</h1>
      
      <?php
      session_start();
      
      if (!isset($_SESSION['username'])) {
          // Redirection vers la page de connexion si l'utilisateur n'est pas connecté
          header('Location: login.php');
          exit();
      }
      
      $username = $_SESSION['username'];
      
      // Connexion à la base de données
      require_once('connexion.php');
      
      // Récupération des publications de l'utilisateur à partir de la base de données
      $query = "SELECT * FROM publications WHERE username='$username'";
      $result = $conn->query($query);
      
      if ($result->num_rows > 0) {
          while ($publication = $result->fetch_assoc()) {
              $idpub = $publication['id'];
              echo "<h2>" . $publication['title'] . "</h2>";
              echo "<p>" . $publication['content'] . "</p>";
              echo "<p>Date de publication : " . $publication['date'] . "</p>";
              echo "<a href=\"supprimer.php?id=$idpub\">Supprimer</a>";
          }
      } else {
          echo "<p>Aucune publication trouvée pour l'utilisateur " . $username . ".</p>";
      }
      
      // Fermeture de la connexion
      $conn->close();
      ?>
      
      [collapse]
        <?php
        session_start();
        
        if (!isset($_SESSION['username'])) {
            // Redirection vers la page de connexion si l'utilisateur n'est pas connecté
            // Code à compléter
        }
        
            $publication_id = $_GET['idpub'];
        
            // Suppression de la publication à partir de la base de données
            // Code à compléter
        }
        
        ?>
        Solution avec MySQLI
        // Suppression de la publication à partir de la base de données
            $sql = "DELETE FROM publications WHERE id = " . $publication_id;
        
            if ($conn->query($sql) === TRUE) {
                echo "La publication a été supprimée avec succès.";
            } else {
                echo "Erreur lors de la suppression de la publication : " . $conn->error;
            }
        [collapse]
        Solution avec PDO
         try {
                // Suppression de la publication à partir de la base de données
                $stmt = $pdo->prepare('DELETE FROM publications WHERE id = :id');
                $stmt->bindParam(':id', $idpub);
                $stmt->execute();
        
                echo "La publication a été supprimée avec succès.";
        
            } catch (PDOException $e) {
                echo "Erreur lors de la suppression de la publication : " . $e->getMessage();
            }
        [collapse]
          <h1>Ajouter une publication</h1>
          
          <?php
          session_start();
          
          if (!isset($_SESSION['username'])) {
              // Redirection vers la page de connexion si l'utilisateur n'est pas connecté
              // Code à compléter
          }
          
          $username = $_SESSION['username'];
          
          if (isset($_POST['title']) && isset($_POST['content'])) {
              $title = $_POST['title'];
              $content = $_POST['content'];
          
              // Insertion de la publication dans la base de données
              // Code à compléter
          }
          ?>
          
          <form action="" method="post">
              <label for="title">Titre :</label>
              <input type="text" name="title" id="title">
              <label for="content">Contenu :</label>
              <textarea name="content" id="content"></textarea>
              <button type="submit">Ajouter</button>
          </form>
          
            <h1>Modifier une publication</h1>
            
            <?php
            session_start();
            
            if (!isset($_SESSION['username'])) {
                // Redirection vers la page de connexion si l'utilisateur n'est pas connecté
                // Code à compléter
            }
            
            $username = $_SESSION['username'];
            
            if (isset($_POST['publication_id'])) {
                $publication_id = $_POST['publication_id'];
            
                // Récupération des informations de la publication à partir de la base de données
                // Code à compléter
            
                if (isset($_POST['title']) && isset($_POST['content'])) {
                    $title = $_POST['title'];
                    $content = $_POST['content'];
            
                    // Modification de la publication dans la base de données
                    // Code à compléter
                }
            }
            ?>
            
            <form action="" method="post">
                <input type="hidden" name="publication_id" value="<?php echo $publication_id; ?>">
                <label for="title">Titre :</label>
                <input type="text" name="title" id="title" value="<?php echo $publication['title']; ?>">
                <label for="content">Contenu :</label>
                <textarea name="content" id="content"><?php echo $publication['content']; ?></textarea>
                <button type="submit">Modifier</button>
            </form>
            Posted in PHP