Salut les amis, encore Steevy.

J'ai mis en place un systeme de follower sur mon site et j'aimerais l'utiliser.

Voici ce que j'aimerais faire avec: Je suis un utilisateur, et j'ai des followers, sur le site il ya une page d'acceuille pour les utilisateurs qui sont connectes, et sur cette page s'affiche les dernieres publications des utilisateurs, du coup, lorsque je fais une publication, je veux qu'elle s'affiche sur la page d'acceuille de mes followers afin qu'ils puissent commenter et liker, comme le fait facebook: il y a une page actualite qui affiche les dernieres publications de mes amis.

Mon systeme de followers fonctionne comme suit: j'ai une table follower comportant 3 champs(id, id_follower, id_following). Au niveau de mon code, il y a un lien qui contient l'id du following, le follower etant deja connecte, on a acces a son id. En cliquant sur le lien, on insere dans la table followers l'id_folloer et l'id_following. Du coup c'est facile de savoir qui suit qui.

Donc pouviez-vous m'aider a savoir comment utiliser ce systeme de followers pour partager des trucs a mes followers?

14 réponses


elhebert
Réponse acceptée

@Steeve VERDIEU: Sans vouloir être offensant, ma remarque est simplement posé pour pouvoir orienté les futurs réponses en fonction de ton niveau : Es-tu un débutant en programmation, et plus particulièrement en php ?
Vu le code que tu as posté ici, je ne peux que penser que oui, et je me dois de te dire, qu'il faudrait que tu approfondisse tes connaissances.

Par exemple : Les balises <?php et ?>, tu utilise <?php quand tu commence à écrire du php et ?> quand tu n'en écris plus. Et non à chaque fonction comme tu le fais. Ton code sera beaucoup plus lisible par la suite.

Je t'invite donc à suivre la formation dédié au php présente sur ce site : http://www.grafikart.fr/formations/php-debutant

Bon, maintenant, allons dans le vif du sujet :

Pour ton problème, ton ami à effet raison, c'est bien comme ça que tu dois faire. Et quant au modification de ton code, je t'invite à faire comme ceci :

Au lieu de récupérer tous les utilisateurs que tu follow et ensuite de boucler dessus pour récupérer leurs posts, tu récupère simple les posts de tout les utilisateurs en faisant une jointure sur la table *followers sur id_following = id (id étant l'id de l'utilisateur de ta table user)

Pour comprendre ce qu'est une jointure et comment les utilisées je t'invite à lire ceci : http://sql.sh/cours/jointures ou https://openclassrooms.com/courses/introduction-aux-jointures-sql (voir les deux).

eu ... en gros tu re-créer twitter ?

Faut pratiquer poto. Alors si t'as une idee, je serais ravi de l'entendre....

Un ami m'a donne une toute petite idee, voici ce qu'il:
Un fois les liens créés entre ceux qui publient et leur followers, il te suffit lors de l'arrivé sur ton fil d'actualité, d'aller chercher l'ensemble des publications des gens que le profil actuel suit, de trier le tout par ordre chronologique et de l'afficher.
Le principe n'est pas de balancer de l'info à ceux qui te suivent mais d'aller chercher l'info de ceux de tu suis sur leur 'mur' d'actualité.

Avec son idee j'ai reussi a afficher le post des utilisateurs que je suis, mais un probleme persiste:
mon code affiche les posts des utilisateurs dans un ordre chronologique par ordre d'utilisateur. Par exemple, si je suis deux utilisateurs: ukusan et steevy, il m'affiche d'abord tous les posts de ukusan dans un ordre chronologique, ensuite ceux de steevy dans un ordre chronologique, et ce, meme si steevy a des posts plus recents que ukusan, tu vois ce que je veux dire? moi ce que je veux, c'est trier tout les posts des utilisateurs par ordre chronologique independemment de l'utilisateur.

Voici mon code:

<?php
//Je recupere l'id de tous les utilisateurs que je suis
$req = $db->query('SELECT id_following FROM followers WHERE id_follower=?', array($_SESSION['auth']->id_user))->fetchAll();
?>

//Je recupere un a un l'id de chaque utilisateur
<?php foreach ($req as $datas): ?>

//Je recupere tous les post de l'utilisateur ayan l'id en cours par ordre chronologique
            <?php $post = $db->query('SELECT * FROM posts WHERE id_user=? ORDER BY post_date DESC', array($datas->id_following))->fetchAll(); ?>
//si l'utilisateur a des post
      <?php if($post): ?>
//je les affiche en faisant un petit foreach
       <?php foreach ($post as $view_post): ?>
         <div class="post">
                <?php echo $view_post->content; ?>
         </div>               
       <?php endforeach; ?>
      <?php endif; ?>
    <?php endforeach; ?>

Quelles modifications dois-je faire dans mon code afin que je puisse les afficher correctement? Merci

Oulà je n'avais pas vu la boucle avec la query dedans Ôo ! C'est du suicide pour le serveur ça !
Sinon @Elbert (mon ami <3) +1

J'ai fait ses pleins de balises <?php ?> parceque je suis au sein d'un fichier ayant plein de balise html, je voulais justement faire fonction mon code, et apres debarbouiller afin qu'il soit plus lisible et plus propre.

Je te propose le même code mais en version plus lisible :

<?php
    $req = $db->query('SELECT id_following FROM followers WHERE id_follower=?', array($_SESSION['auth']->id_user))->fetchAll();

    foreach ($req as $datas) {
      $post = $db->query('SELECT * FROM posts WHERE id_user=? ORDER BY post_date DESC', array($datas->id_following))->fetchAll();
      if($post) {
        foreach ($post as $view_post) {
            echo '<div class="post">' . $view_post->content; . '</div>';               
        }
      }
    }

C'est tout de même plus lisible.

Je suis parti du conseil que m'a donnee l'ami, et j'ai pu obtenir un resultat concret avec ces lignes de codes:

          <?php  
            //Select all users that i am following
            $all_posts = array();
            $req = $db->query('SELECT id_following FROM followers WHERE id_follower=?', array($_SESSION['auth']->id_user))->fetchAll();
          ?>

          <?php foreach ($req as $datas): ?>
            <?php
            //Slect all the posts of the current user thet i am following
              $post = $db->query("SELECT * FROM posts INNER JOIN users ON posts.id_user=users.id_user WHERE posts.id_user=? or users.id_user=?", array($datas->id_following, $_SESSION['auth']->id_user))->fetchAll();
              //Merge all post that i take, and merge them in big array.
              $all_posts = array_merge($all_posts, $post);
              //compare all post by date
              usort($all_posts, 'cmp');
            ?>
          <?php endforeach; ?>

-Je select d'abord tous les utilisateurs que je suis
-je recupere leurs posts
-et je les affiches par ordre chronologique avec la fonction usort.

-Qu'est ce que vous pensez de ma methode?
@betaWeb m'a dit que c'est suicidaire la requette au dedans de la boucle, mais je ne vois pas vraiment comment m'en passer?

    <?php  
            //Select all users that i am following
            $all_posts = array();
            $req = $db->query('SELECT id_following FROM followers WHERE id_follower=?', array($_SESSION['auth']->id_user))->fetchAll();

          foreach ($req as $datas){
            //Slect all the posts of the current user thet i am following
              $post = $db->query("SELECT * FROM posts INNER JOIN users ON posts.id_user=users.id_user WHERE posts.id_user=? or users.id_user=?", array($datas->id_following, $_SESSION['auth']->id_user))->fetchAll();
              //Merge all post that i take, and merge them in big array.
              $all_posts = array_merge($all_posts, $post);
              //compare all post by date
              usort($all_posts, 'cmp');
         }

Le meme code plus lisible, je voulais juste me passer des parentheses.

@Steeve VERDIEU: Je t'ai donné une solution beaucoup plus simple et pourtant tu ne l'utilise pas.
Je t'invite à relire la solution que je t'ai donné, et à réfléchir à comment la mettre en place. Car ton système actuel est vraiment pas optimisé du tout (voir ci dessous pour l'explication)

Pour ce que BetaWeb à dit :
Imagine que tu suis 1000 users, tu fera 1000 requêtes, et si 1000 utilisateurs suivent tous 1000 personnes, tu aura 1 000 000 de requête, et tu va donc crasher ton serveur avec la charge, ou faire un auto DDOS. Je t'invite à aller voir sur google ce que c'est.

Oh my God, c'est plus simple que toutes ces blablablas que j'avais ecrit.
c'est resume en une seule ligne:
$posts = $db->query('SELECT * FROM posts INNER JOIN followers ON posts.id_user=followers.id_following WHERE followers.id_follower=?', array($_SESSION['auth']->id_user))->fetchAll();

c'est resume en une seule ligne

           $posts = $db->query('SELECT * FROM posts INNER JOIN followers ON posts.id_user=followers.id_following WHERE followers.id_follower=?', array($_SESSION['auth']->id_user))->fetchAll();

Oublie pas de valider le sujet lorsqu'il est résolu !

J'ai passe toute une journee entiere a essaye de faire ce truc, alors que ca pouvait se faire en 2 secondes grace aux jointures. (J'avais neglige cette tout au long de l'apprentissage des bases du php et du mysql), j'obtiens un code plus claire, et plus courte.
Merci d'avoir ete la @elhebert., maintenant je peux passer a l'etape suivante dans mon projet.