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

PHP & Base de données Discussion :

Afficher news une par une


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut Afficher news une par une
    Bonjour,

    J'ai commencé à mettre en place un système de news comme ceci :

    Le site est fait sous Drupal (erf... obligé)
    Une page gère l'affichage (page.tpl.php)
    La page d'accueil affiche la dernière news en incluant news-front.php qui gère ceci
    La page de news affiche toutes les news par ordre décroissant en incluant news.php qui est presque identique à news-front.php
    Les news sont ajoutées et stockées dans une BDD

    Je voudrais que sur la page d'accueil, les news s'affichent une par une au bout d'un temps donné : dernière news >> X secondes >> avant-dernière news >> X secondes etc en boucle.

    Voici le code de mon fichier news-front.php qui gère ceci :

    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
    <?php
    // on se connecte à notre base  
    $base = mysql_connect ('***', '***', '***');  
    mysql_select_db('***', $base);  
     
    // lancement de la requête. on sélectionne les news que l'on va ordonner suivant l'ordre "inverse" des dates (de la plus récente à la plus vieille : DESC) tout en ne sélectionnant que le nombre voulu de news à afficher (LIMIT)  
    $sql = 'SELECT auteur, titre, date, texte_news FROM news ORDER BY date DESC LIMIT 1;';  
     
    // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)  
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
     
    // on compte le nombre de news stockées dans la base de données
    $nb_news = mysql_num_rows($req);
     
    if ($nb_news == 0) {
       echo 'Aucune news enregistr&eacute;e.';
    }
    else {
     
       // si on a au moins une news, on l'affiche
       while ($data = mysql_fetch_array($req)) {
     
          // on décompose la date
          sscanf($data['date'], "%4s-%2s-%2s %2s:%2s:%2s", $an, $mois, $jour, $heure, $min, $sec);
     
          // on affiche les résultats 
          echo '<br />News de : ' , htmlentities(trim($data['auteur'])) , '<br />';
          echo 'Titre : ' , htmlentities(trim($data['titre'])) , '<br />';
          echo 'Post&eacute;e le : ' , $jour , '/' , $mois , '/' , $an , ' &agrave; ' , $heure , ':' , $min , ':' , $sec , '<br /><br />';
          echo 'News : ' , nl2br(htmlentities(trim($data['texte_news']))) , '<br /><br /><br />';
       }
    }
    // on libère l'espace mémoire alloué à cette requête
    mysql_free_result ($req);
     
    // on ferme la connexion à la base de données
    mysql_close ();
    ?>
    Je suppose que c'est dans le "else" qu'il faut toucher quelque chose, mais quoi ? mettre une boucle ? une sorte de timer ?

    HELP ! =)

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 453
    Par défaut
    Salut,

    Il faut changer le LIMIT dans ta requête, par exemple par LIMIT 0, 10 (si tu veux les dix dernières).

    Sinon, peux tu clarifier ceci ?

    Je voudrais que sur la page d'accueil, les news s'affichent une par une au bout d'un temps donné : dernière news >> X secondes >> avant-dernière news >> X secondes etc en boucle.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    Non le limit c'est ok, je vois ce que c'est, c'est moi qui ai mis 1 pour n'afficher que la dernière, mais ce que je recherche c'est ce qui apparemment n'était pas clair ^^ :

    Je voudrais qu'au lieu qu'il n'y ai que la dernière news, statique, ou alors un nombre donné de news (en changeant le LIMIT), il n'y ai qu'une news qui apparaisse, la dernière, puis au bout de quelques secondes, l'avant-dernière news la REMPLACE, puis au bout de quelques secondes, celles d'avant, etc, puis revenir à la première news, en boucle quoi.

    Merci =)

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 453
    Par défaut
    Citation Envoyé par LightBen Voir le message
    Non le limit c'est ok, je vois ce que c'est, c'est moi qui ai mis 1 pour n'afficher que la dernière, mais ce que je recherche c'est ce qui apparemment n'était pas clair ^^ :

    Je voudrais qu'au lieu qu'il n'y ai que la dernière news, statique, ou alors un nombre donné de news (en changeant le LIMIT), il n'y ai qu'une news qui apparaisse, la dernière, puis au bout de quelques secondes, l'avant-dernière news la REMPLACE, puis au bout de quelques secondes, celles d'avant, etc, puis revenir à la première news, en boucle quoi.

    Merci =)
    Ouais donc en gros tu veux un truc "dynamique"...

    @RunCodePhp
    Le faire en Ajax, ça alourdira et compliquera le code et demandera plus de ressources au serveur (j'ai déjà vu un serveur avec plus de 2Go de logs apache en un jour à cause de requêtes Ajax à intervalles trop courtes). Il peut le faire s'il le veut, mais je pense que le faire en javascript (sans interaction serveur) sera plus simple.

    Ce que tu peux faire, c'est envoyer les 4 ou 5 news que tu veux passer en boucle au client. Comme ça, pas d'ajax, seulement une petite fonction javascript.

    EDIT: grillé, tu viens de poster la solution que je propose

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Il plusieurs trucs qui mérite des explications.
    Tu fais une requête avec un LIMIT 1, donc ça récupèrera 1 seule ligne (la news la plus récente), et plus loin, tu fais un boucle (un while).
    Théoriquement, il n'y a pas besoin de faire de boucle, vu qu'il y aura à coup sûr 1 seule ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // on compte le nombre de news stockées dans la base de données
    $nb_news = mysql_num_rows($req);
    Donc ceci ne retournera pas le nombre total de news, mais 0 ou 1.

    Ensuite, tu utilise une fonction Php sscanf pour décortiquer une date pour la mettre au format Français.
    Il existe pleins de fonctions dans MySQL pour les date, entre autre STR_TO_DATE() qui permet de faire la conversion.
    -> http://dev.mysql.com/doc/refman/5.0/...functions.html

    Cependant, vu que tu souhaite faire défiler des news 1 par 1, il faut donc quelque chose qui va déclencher ça, qui va quelque par actualiser cette news-front pour passer à la news suivante au bout d'un temps.
    Il y a rien de tout ça.

    On va supposer que ce soit fait par Ajax (qui me semble le plus adapté).
    Du coup, il faudrait à mon sens un paramètre qui dise quelle sera la news à afficher, sinon ça sera toujours la même.

    Comme ça vite fait, faudrait un compteur, qui par défaut serait 0 (la 1ère ligne).
    Ensuite, faire une requête qui s'appuie sur le LIMIT.
    Donc par défaut : LIMIT 0,1
    A la 1ère actualisation, le compteur sera incrémenté, donc 1 :
    donc : LIMIT 1,1
    A la 5è : LIMIT 5,1
    etc ...

  6. #6
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    Excuse moi pour la partie ajax j'ai pas trop compris...

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Excuse moi pour la partie ajax j'ai pas trop compris...
    Et bien pour afficher chaque news sans devoir actualiser ta page.

    Mais tu ne dis pas grand chose sur quoi tu te base pour passer à la news suivante.
    Il faut bien quelque chose.

    Du coup, ça fait au moins 3 techniques différentes pour pouvoir le faire :
    Ajax
    Pure Javascript (on récupère un nombre de news, on le stock dans un tableau, et on affiche 1 par une toute les 10 secondes par exp.).
    Php (session). Demandera à actualiser la page entière.


    Faudrait en dire plus sur ce point, ça conditionne tout à mon sens.

  8. #8
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    @RunCodePhp :

    Ben je sais pas trop quoi dire, je vois pas ce que vous avez pas compris je vais essayer de reformuler encore :

    Peu importe la méthode (php privilégié), il faudrait qu'il ne s'affiche qu'une news à la fois, la dernière, puis l'avant dernière, etc pour revenir à la premiure (en boucle). Il faut qu'au bout d'un certain temps, la news disparaisse pour laisser place à la news qui la précède, sans avoir à actualiser, qu'elle s'actualise toute seule... c'est mieux ou pas ? Désolé

    Merci pour votre intérêt à mon problème

    @sachav : Oui ce serait 4 ou 5 news en boucle, ce serait bien, mais comment faire ?

  9. #9
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Il me semble qu'on a parfaitement compris.

    Exploite Javascript.
    1/ Tu récupère un nombre de news, admettons 10.
    2/ Tu stock ces news dans un tableau JS.
    3/ Et tu exploite la fonction JS setTimeout(change_news, 10000) qui se chargera de modifier la news ... selon un compteur qui permettra de récupérer LA news dans le tableau, cela 1 par 1.
    A la 10ème, on repart à 0 ... et c'est reparti pour 1 tour.

    Tous ça sans devoir recharger la page.

    La méthode Ajax y fait la même chose mais très différemment, mais c'est vrai que c'est lourd ...

Discussions similaires

  1. [RegExp] Détecter des combinaisons dans une chaine une par une
    Par vermine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/06/2010, 13h22
  2. Réponses: 5
    Dernier message: 09/07/2008, 11h26
  3. [JTextArea] Récupérer les lignes unes par unes
    Par Jean-Claude Dusse dans le forum Composants
    Réponses: 1
    Dernier message: 25/05/2008, 08h43
  4. Réponses: 2
    Dernier message: 05/06/2006, 08h54
  5. [CR] Grouper des minutes par cinq et non une par une.
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 14/09/2004, 13h45

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