IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Création d'un système de "favoris" par utilisateur.


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2019
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Création d'un système de "favoris" par utilisateur.
    Bonjour à tous,

    Alors voilà, je bosse depuis quelques semaines sur un projet perso, je précise que je débute en PHP et que jusqu'à présent j'ai suivi les tutos de la chaine PrimeFX qui m'ont beaucoup aidé et qui m'ont dépanné pour ce que je voulais faire.

    Mon site est un calendrier "interactif" d'évènement sportif. Le but étant de référencer une liste d'évènement. Suite à ça, j'ai intégré la possibilité de s'y inscrire dans le but par la suite que l'utilisateur une fois loggé puisse ajouter les évènements qui l'intéresse à sa liste de favoris.

    J'ai fait quelques recherches à ce sujet mais il y a très peu de résultat, voir quasiment pas. Et pour leur peu qu'il y en a, ils ne me sont d'aucun utilité car pas adapté à mon niveau (manque d'explication), ni adapté à mon cas.

    Mon but étant :
    - Lorsque j'arrive sur mon site, non loggé, il n'y a pas la possibilité d'ajouter les évènements à mes favoris
    - Une fois loggé, le bouton "favoris" apparait
    - Lorsque je click sur ce bouton (une étoile non remplie par exemple), l'insert se fait dans la bdd et l'icone change (l'étoile se remplie, par exemple)
    - Si je click sur un bouton qui est déjà ajouté en bdd (une étoile remplie, donc), l'évènement est retiré de la bdd des favoris (l'étoile se vide) mais reste affiché dans liste.
    - La liste des évènements que j'ai ajouté est visible sur la page de mon profil et si je click sur le bouton (l'étoile remplie), l'évènement est supprimé de la liste de favoris et n'est donc plus affiché sur la page.

    Pour vous donner une meilleur idée d'à quoi ressemble le site statique pour l'instant et pour vous aider peut être à mieux comprendre, voici l'adresse : http://dasffalt.com/criteriums-calendar

    Voici le code de ma page sur laquelle je travaille en local ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    <?php
    session_start();
     
      $bdd = new PDO("mysql:host=localhost;dbname=calendar;charset=utf8", "root", "");
     
      $get = $bdd->query("SELECT * FROM races order by raceday asc");
     
     
      if(isset($_GET['q']) AND !empty($_GET['q'])) {
          $q = htmlspecialchars($_GET['q']);
          $q = $_GET['q'];
          $q = trim($q); //pour supprimer les espaces dans la requête de l'internaute
          $q = strip_tags($q); //pour supprimer les balises html dans la requête
          $get = $bdd->query('SELECT racename, showracedate, town, country, country_tag FROM races WHERE racename LIKE "%'.$q.'%" ORDER BY id ASC');
          if($get->rowCount() == 0) {
            $get = $bdd->query('SELECT racename, showracedate, town, country, country_tag FROM races WHERE CONCAT(racename, showracedate, town, country, country_tag) LIKE "%'.$q.'%" ORDER BY id ASC');
          }
      }
     
      if(isset($_POST['signin']))
      {
        $mailin = htmlspecialchars($_POST['mailin']);
        $passwordin = $_POST['passwordin'];
        if(!empty($mailin) AND !empty($passwordin))
        {
          $requser = $bdd->prepare("SELECT * FROM members WHERE mail = ? ");
          $requser->execute(array($mailin));
          $userexists = $requser->rowCount();
          if($userexists == 1)
          {
            $userinfo = $requser->fetch();
            if(password_verify($passwordin, $userinfo['password']))
            {
              $_SESSION['id'] = $userinfo['id'];
              $_SESSION['username'] = $userinfo['username'];
              $_SESSION['mail'] = $userinfo['mail'];
              header("Location: index.php");
            }
            else
            {
              $error = "Wrong password";
            }
          }
          else
          {
            $error = "Mail doesn't exist";
          }
        }
        else
        {
          $error = "Please fill all the fields";
        }
      }
     
    ?>
     
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- META -->
     
        <title>CRIT | Calendar</title>
     
        <!-- CSS -->
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
        <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css?family=Anton" rel="stylesheet">
        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/css/flag-icon.min.css" rel="stylesheet"/>
        <link rel="stylesheet" href="css/mystyles-table.css">
        <!-- CSS -->
     
        <!-- Global site tag (gtag.js) - Google Analytics -->
        <script async src="https://www.googletagmanager.com/gtag/js?id=UA-133907448-1"></script>
        <script>
          window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
              gtag('js', new Date());
     
              gtag('config', 'UA-133907448-1');
        </script>
        </head>
     
     
      <body>
        <header>
          <?php
            if (isset($_SESSION['id']))
            {
              $getid = intval($_SESSION['id']);
              $requser = $bdd->prepare("SELECT * FROM members WHERE id = ? ");
              $requser->execute(array($getid));
              $userinfo = $requser->fetch();
          ?>
          <table class="user">
              <tr>
                <td class="user-help">
                  <a href="edityourprofile.php">Edit</a><br />
                  <a href="logout.php">Log out</a>
                </td>
                <td>
                  <p class="welcomeuser"> Hi <a href="profil.php?id=<?php echo $userinfo['id']; ?>"><?php echo $userinfo['username']; ?></a> ! </p>
                </td>
              </tr>
            </table>
          <?php
            }
            else
            {
            ?>
            <table class="user">
              <form action="" method="POST">
                <tr>
                  <td class="user-help">
                    <a href="signup.php">Register</a><br />
                    <a href="#">Forgot password?</a>
                  </td>
                  <td>
                    <input type="mail" placeholder="username" name="mailin" />
                  </td>
                  <td>
                    <input type="password" placeholder="password" name="passwordin" />
                  </td>
                  <td>
                    <input type="submit" name="signin" value="login" />
                  </td>
                </tr>
              </table>
            </form>
            <?php
            }
          if(isset($error))
          {
            echo $error;
          }
          ?>
        </header>
        <section>
          <h1><a href="index.php">FIXED GEAR RACES 2019 SEASON</a></h1>
          <form class="searchbox" method="GET">
            <input type="search" name="q" placeholder="" />
            <input type="submit" value="Go" />
          </form>
          <table class="calendar">
            <?php
            if($get->rowCount() > 0) {
              while($show = $get->fetch())
              {
            ?>
     
            <tr>
              <td><?php echo $show['showracedate']?></td>
              <td><?php echo $show['racename']?></td>
              <td><span class="flag-icon flag-icon-<?php echo $show['country']?>"></span> <?php echo $show['town']?>, <?php echo $show['country']?></td>
            </tr>
     
            <?php
              }
            }
              else {
            ?>
              <br />
              <br />
              <p class="nothingfound">It looks like there's no race for what you're looking for...</p>
            <?php
              }
            ?>
          </table>
          </section>
     
        <footer>
          <p>If you are a race organizer and your race is not listed, feel free to DM me on <a href="https://www.instagram.com/dasffalt/" target="_blank">Instagram</a>.</p>
          <ul class="icons">
            <li>
                <a href="https://www.flickr.com/photos/dasffalt/albums" target="_blank"><i class="fab fa-flickr has-text-black fa-2x"></i></a>
            </li>
            <li>
                <a href="https://www.instagram.com/dasffalt/" target="_blank"><i class="fab fa-instagram has-text-black fa-2x"></i></a>
            </li>
          </ul>
        </footer>
     
      </body>
     
    </html>
    Pour ce qui est de la structure de ma BDD :

    Nom : dsqf5ez40f 5ze.jpg
Affichages : 2519
Taille : 834,8 Ko



    J'aimerais également signaler que les personnes blasées de la vie, de mauvaise humeur, qui ne comptent me répondre que par des messages avec peu (voir pas dutout) d'explication, me renvoyant vers de la doc PHP, des liens vers d'autres sujets non pertinents, des bouts de code sans explication quant à savoir comment, où, et pourquoi l'insérer, etc... etc... Bref, toutes les personnes qui ne sont là que pour tuer leur ennuie, inscris sur ce forum depuis 10 ans et répondant à tous les sujets sans apporter d'aide constructive aux débutants, passez votre chemin. A bon entendeur, merci!

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Bon c'est déjà pas mal pour quelqu'un qui débute.

    Sur le code que tu as déjà écrit, il y a ce morceau là qui m'embête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $get = $bdd->query("SELECT * FROM races order by raceday asc");
      if(isset($_GET['q']) AND !empty($_GET['q'])) {
          $q = htmlspecialchars($_GET['q']);
          $q = $_GET['q'];
          $q = trim($q); //pour supprimer les espaces dans la requête de l'internaute
          $q = strip_tags($q); //pour supprimer les balises html dans la requête
          $get = $bdd->query('SELECT racename, showracedate, town, country, country_tag FROM races WHERE racename LIKE "%'.$q.'%" ORDER BY id ASC');
          if($get->rowCount() == 0) {
            $get = $bdd->query('SELECT racename, showracedate, town, country, country_tag FROM races WHERE CONCAT(racename, showracedate, town, country, country_tag) LIKE "%'.$q.'%" ORDER BY id ASC');
          }
      }
    Tu as un appel à htmlspecialshars qui ne sert à rien
    Il vaudrait mieux utiliser une requête préparée pour échapper les données (comme celle de ta recherche d'utilisateur pour le login)
    Et concernant les performances : si tu reçois un filtre, tu vas exécuter deux fois la recherche ce qui n'a pas franchement d'intérêt. Mieux vaut faire une alternative avec un if/else.
    Au passage, si tu utilises !empty, tu n'as pas besoin d'utiliser également isset c'est compris dedans

    Concernant ton système de favoris :
    Pour afficher le bouton uniquement pour les membres connectés, tu peux l'encadrer par une condition sur la session, du genre if (isset($_SESSION['id'])).

    Pour le stockage en base, il va falloir une table de favoris, avec un lien vers ta table d'utilisateur et un lien vers ta table d'événements. Tu peux éventuellement ajouter une date de création si tu veux un historique, mais ce n'est pas indispensable.

    Pour lister les favoris : une requête sur la table des favoris avec une jointure vers la table d'événements et une restriction en fonction de l'identifiant de l'utilisateur connecté.

    Là où ça devient rigolo, c'est le bouton proprement dit. Côté PHP, c'est relativement simple : on reçoit l'identifiant de l'événement, éventuellement une information qui indique ajouter/supprimer, on récupère l'identifiant de l'utilisateur dans la session et on met à jour la table des favoris.
    Par contre, si tu ne veux pas recharger la page à chaque fois que l'utilisateur clique sur le bouton, il va te falloir un appel par AJAX.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2019
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Salut Celira,

    Merci pour tes explications!

    Pour ce qui est du module rechercher avec le prepare + execute (array), je t'avoue que je ne sais pas vraiment comment m'y prendre et je laisse celà de côté pour l'instant.
    Le htmlspecialchars, si je me souviens bien, PrimeFX expliquait que c'était pour éviter une insertion de code.

    J'ai essayé ce que tu m'as dit avec le isset id, et ça fonctionne parfaitement.

    Voici comment je l'ai inséré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <tr>
      <?php if (isset($_SESSION['id'])) {
      ?>
        <td><a href="index.php?id=<?php echo $show['id'];?>">Add to favourite</a></td>
      <?php
      }
      ?>
        <td><?php echo $show['showracedate']?></td>
        <td><?php echo $show['racename']?></td>
        <td><span class="flag-icon flag-icon-<?php echo $show['country']?>"></span> <?php echo $show['town']?>, <?php echo $show['country']?></td>
    </tr>
    Lorsque je ne suis pas loggé, le lien "add to fav" n'apparait pas, une fois loggé il est affiché, c'est parfait!

    Passons aux choses sérieuses maintenant...

    Concernant la BDD, je crée donc une table "favourite" avec 2 colonnes si j'ai bien compris? (une pour l'id de l'utilisateur, et une pour l'id de l'event)

    Pour ce qui est du code, je t'avoue que je suis un peu perdu.
    J'ai créé une partie admin dont je me sers pour ajouter/modifier/supprimer des events justement. Et j'ai ce bout de code qui pourrait me mettre sur la piste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    $id = (!empty($_GET['id']))? intval($_GET['id']) : 0;
    $delete = $bdd->prepare("DELETE FROM races WHERE id = :id");
    $delete->execute( array( ':id' => $id ) );
    En relation avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    <td><a href="edit.php?id=<?php echo $show['id'];?>">Delete</a></td>

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2019
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Etant donné que je ne sais pas comment écrire mon code, je vais essayer de le développer en français.

    Sur la page index.php

    Je suis loggé, donc le lien de bouton pour mettre en fav est affiché.

    Je souhaite mettre un event en favoris, et pour celà, je dois vérifier si il n'y est pas déjà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if(l'id d'event sur lequel je click n'existe pas dans la bdd) 
    {
    $requete = $bdd->prepare("INSERT INTO favourite (id utilisateur, id event) VALUES (?, ?)");
    $requete->execute(array($_POST['id utilisateur'], $_POST['id event']));
    $error = '.<a class="fullstar" href="edit.php?id=<?php echo $show['id'];?>">add to fav</a>.'            // Affiche une étoile pleine
    }
    else // donc si l'event existe, on souhaite le supprimer de la bdd favourite, mais pas de la bdd races (ou event)
    {
    $delete = $bdd->prepare("DELETE FROM favourite WHERE id = :id");
    $delete->execute( array( ':id' => $id ) );
    $error = '.<a class="emptystar" href="edit.php?id=<?php echo $show['id'];?>">delete from fav</a>.'            // Affiche une étoile vide
    }
    Et dans la partie HTML alors je viens appeler l'error

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <tr>
              <?php if (isset($_SESSION['id'])) {
              ?>
                <td>
                <?php 
                  echo $error; 
                ?>
                </td>
              <?php
              }
              ?>
              <td><?php echo $show['showracedate']?></td>
              <td><?php echo $show['racename']?></td>
              <td><span class="flag-icon flag-icon-<?php echo $show['country']?>"></span> <?php echo $show['town']?>, <?php echo $show['country']?></td>
    </tr>

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Février 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2019
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Un petit up, je suis toujours dans l'impasse

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Ok, qu'est ce qui ne vas pas avec votre dernier post ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/08/2011, 16h00
  2. [HashTable] Création d'un système de cache : Perte de données
    Par Resyek dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/11/2006, 18h29
  3. [Système] gerer quotes en autonomie
    Par taffMan dans le forum Langage
    Réponses: 2
    Dernier message: 26/10/2006, 17h07
  4. Création des tables système
    Par tarik75 dans le forum Oracle
    Réponses: 7
    Dernier message: 17/08/2006, 17h02
  5. Réponses: 5
    Dernier message: 30/05/2005, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo